AndroidJUnitRunner

คลาส AndroidJUnitRunner เป็นตัวรันการทดสอบ JUnit ที่ให้คุณเรียกใช้การทดสอบ JUnit 4 ที่มีเครื่องมือวัดผลในอุปกรณ์ Android รวมถึงการทดสอบที่ใช้เฟรมเวิร์ก Espresso, UI Automator และ Compose

โปรแกรมรันทดสอบจะจัดการการโหลดแพ็กเกจทดสอบและแอปที่ทดสอบลงในอุปกรณ์ เรียกใช้การทดสอบ และรายงานผลการทดสอบ

เครื่องมือทดสอบนี้รองรับงานทดสอบทั่วไปหลายอย่าง ซึ่งรวมถึงงานต่อไปนี้

เขียนการทดสอบ JUnit

ข้อมูลโค้ดต่อไปนี้แสดงวิธีที่คุณอาจเขียนการทดสอบ JUnit 4 ที่ตรวจสอบเพื่อยืนยันว่าการดำเนินการ changeText ในคลาส ChangeTextBehavior ทำงานได้อย่างถูกต้อง

Kotlin

@RunWith(AndroidJUnit4::class)
@LargeTest // Optional runner annotation
class ChangeTextBehaviorTest {
 val stringToBeTyped = "Espresso"
 // ActivityTestRule accesses context through the runner
 @get:Rule
 val activityRule = ActivityTestRule(MainActivity::class.java)

 @Test fun changeText_sameActivity() {
 // Type text and then press the button.
 onView(withId(R.id.editTextUserInput))
 .perform(typeText(stringToBeTyped), closeSoftKeyboard())
 onView(withId(R.id.changeTextBt)).perform(click())

 // Check that the text was changed.
 onView(withId(R.id.textToBeChanged))
 .check(matches(withText(stringToBeTyped)))
 }
}

Java

@RunWith(AndroidJUnit4.class)
@LargeTest // Optional runner annotation
public class ChangeTextBehaviorTest {

    private static final String stringToBeTyped = "Espresso";

    @Rule
    public ActivityTestRule<MainActivity>; activityRule =
            new ActivityTestRule<>;(MainActivity.class);

    @Test
    public void changeText_sameActivity() {
        // Type text and then press the button.
        onView(withId(R.id.editTextUserInput))
                .perform(typeText(stringToBeTyped), closeSoftKeyboard());
        onView(withId(R.id.changeTextBt)).perform(click());

        // Check that the text was changed.
        onView(withId(R.id.textToBeChanged))
                .check(matches(withText(stringToBeTyped)));
    }
}

เข้าถึงบริบทของแอปพลิเคชัน

เมื่อใช้ AndroidJUnitRunner เพื่อเรียกใช้การทดสอบ คุณจะเข้าถึงบริบทสําหรับแอปที่ทดสอบได้โดยเรียกใช้เมธอด ApplicationProvider.getApplicationContext() แบบคงที่ หากคุณสร้างคลาสย่อยที่กําหนดเองของ Application ในแอป เมธอดนี้จะแสดงบริบทของคลาสย่อยที่กําหนดเอง

หากคุณเป็นผู้ติดตั้งใช้งานเครื่องมือ คุณจะเข้าถึง API การทดสอบระดับต่ำได้โดยใช้คลาส InstrumentationRegistry คลาสนี้ประกอบด้วยออบเจ็กต์ Instrumentation ออบเจ็กต์แอปเป้าหมาย Context ออบเจ็กต์แอปทดสอบ Context และอาร์กิวเมนต์บรรทัดคำสั่งที่ส่งไปยังการทดสอบ

กรองการทดสอบ

ในการทดสอบ JUnit 4.x คุณสามารถใช้คำอธิบายประกอบเพื่อกำหนดค่าการเรียกใช้การทดสอบได้ ฟีเจอร์นี้ช่วยลดความจำเป็นในการเพิ่มข้อความเทมเพลตและโค้ดแบบมีเงื่อนไขในการทดสอบ นอกจากการกำกับเนื้อหามาตรฐานที่ JUnit 4 รองรับแล้ว TestRunner ยังรองรับการกำกับเนื้อหาสำหรับ Android โดยเฉพาะด้วย ซึ่งรวมถึงการกำกับเนื้อหาต่อไปนี้

  • @RequiresDevice: ระบุว่าการทดสอบควรทํางานในอุปกรณ์จริงเท่านั้น ไม่ใช่ในโปรแกรมจําลอง
  • @SdkSuppress: ระงับการทดสอบไม่ให้ทํางานใน Android API ระดับที่ต่ำกว่าระดับที่ระบุ ตัวอย่างเช่น หากต้องการระงับการทดสอบ API ระดับต่ำกว่า 23 ทั้งหมดไม่ให้ทํางาน ให้ใช้คำอธิบายประกอบ @SDKSuppress(minSdkVersion=23)
  • @SmallTest, @MediumTest และ @LargeTest: จัดประเภทระยะเวลาที่การทดสอบควรใช้เวลาทํางาน และส่งผลต่อความถี่ที่คุณทําการทดสอบได้ คุณสามารถใช้คำอธิบายประกอบนี้เพื่อกรองการทดสอบที่จะเรียกใช้โดยตั้งค่าพร็อพเพอร์ตี้ android.testInstrumentationRunnerArguments.size ดังนี้
-Pandroid.testInstrumentationRunnerArguments.size=small

การทดสอบกลุ่ม

หากต้องการเรียกใช้การทดสอบแบบขนานกัน โดยแชร์การทดสอบในเซิร์ฟเวอร์หลายเครื่องเพื่อให้ทํางานได้เร็วขึ้น คุณสามารถแบ่งการทดสอบออกเป็นกลุ่มหรือกลุ่มย่อย เครื่องมือเรียกใช้การทดสอบรองรับการแยกชุดทดสอบชุดเดียวออกเป็นหลายกลุ่ม เพื่อให้คุณเรียกใช้การทดสอบที่อยู่ในกลุ่มเดียวกันเป็นกลุ่มได้ง่ายๆ แต่ละกลุ่มจะระบุด้วยหมายเลขดัชนี เมื่อทำการทดสอบ ให้ใช้ตัวเลือก -e numShards เพื่อระบุจำนวนกลุ่มแยกที่จะสร้าง และตัวเลือก -e shardIndex เพื่อระบุกลุ่มที่จะเรียกใช้

ตัวอย่างเช่น หากต้องการแยกชุดทดสอบออกเป็น 10 กลุ่มและเรียกใช้เฉพาะการทดสอบที่จัดกลุ่มไว้ในกลุ่มที่ 2 ให้ใช้คําสั่ง adb ต่อไปนี้

adb shell am instrument -w -e numShards 10 -e shardIndex 2

ใช้ Android Test Orchestrator

Android Test Orchestrator ช่วยให้คุณเรียกใช้การทดสอบของแอปแต่ละรายการภายในการเรียกใช้ Instrumentation ของตนเองได้ เมื่อใช้ AndroidJUnitRunner เวอร์ชัน 1.0 ขึ้นไป คุณจะมีสิทธิ์เข้าถึง Android Test Orchestrator

Android Test Orchestrator มีประโยชน์ต่อไปนี้สําหรับสภาพแวดล้อมการทดสอบ

  • สถานะที่แชร์ขั้นต่ำ: การทดสอบแต่ละรายการจะทํางานในInstrumentation อินสแตนซ์ของตัวเอง ดังนั้น หากการทดสอบแชร์สถานะแอป ระบบจะนำสถานะที่แชร์ส่วนใหญ่ออกจาก CPU หรือหน่วยความจำของอุปกรณ์หลังจากการทดสอบแต่ละครั้ง หากต้องการนำสถานะที่ใช้ร่วมกันทั้งหมดออกจาก CPU และหน่วยความจำของอุปกรณ์หลังจากการทดสอบแต่ละครั้ง ให้ใช้ Flag clearPackageData ดูตัวอย่างได้ที่ส่วนเปิดใช้จาก Gradle
  • แยกข้อขัดข้อง: แม้ว่าการทดสอบรายการหนึ่งจะขัดข้อง แต่การทดสอบนั้นจะปิดเฉพาะอินสแตนซ์ Instrumentation ของตัวเองเท่านั้น ซึ่งหมายความว่าการทดสอบอื่นๆ ในชุดทดสอบจะยังคงทํางานต่อไปเพื่อให้ผลลัพธ์การทดสอบที่สมบูรณ์

การแยกนี้อาจส่งผลให้เวลาในการเรียกใช้การทดสอบเพิ่มขึ้นเนื่องจาก Android Test Orchestrator จะรีสตาร์ทแอปพลิเคชันหลังจากการทดสอบแต่ละครั้ง

ทั้ง Android Studio และ Firebase Test Lab มี Android Test Orchestrator ติดตั้งไว้ล่วงหน้าแล้ว แต่คุณต้องเปิดใช้ฟีเจอร์ใน Android Studio

เปิดใช้จาก Gradle

หากต้องการเปิดใช้ Android Test Orchestrator โดยใช้เครื่องมือบรรทัดคำสั่ง Gradle ให้ทำตามขั้นตอนต่อไปนี้

  • ขั้นตอนที่ 1: แก้ไขไฟล์ gradle เพิ่มคำสั่งต่อไปนี้ลงในไฟล์ build.gradle ของโปรเจ็กต์
android {
 defaultConfig {
  ...
  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

  // The following argument makes the Android Test Orchestrator run its
  // "pm clear" command after each test invocation. This command ensures
  // that the app's state is completely cleared between tests.
  testInstrumentationRunnerArguments clearPackageData: 'true'
 }

 testOptions {
  execution 'ANDROIDX_TEST_ORCHESTRATOR'
 }
}

dependencies {
 androidTestImplementation 'androidx.test:runner:1.1.0'
 androidTestUtil 'androidx.test:orchestrator:1.1.0'
}
  • ขั้นตอนที่ 2: เรียกใช้ Android Test Orchestrator โดยดำเนินการตามคําสั่งต่อไปนี้
./gradlew connectedCheck

เปิดใช้จาก Android Studio

หากต้องการเปิดใช้ Android Test Orchestrator ใน Android Studio ให้เพิ่มคำสั่งที่แสดงในเปิดใช้จาก Gradle ลงในไฟล์ build.gradle ของแอป

เปิดใช้จากบรรทัดคำสั่ง

หากต้องการใช้ Android Test Orchestrator ในบรรทัดคำสั่ง ให้เรียกใช้คำสั่งต่อไปนี้ในหน้าต่างเทอร์มินัล

DEVICE_API_LEVEL=$(adb shell getprop ro.build.version.sdk)

FORCE_QUERYABLE_OPTION=""
if [[ $DEVICE_API_LEVEL -ge 30 ]]; then
   FORCE_QUERYABLE_OPTION="--force-queryable"
fi

# uninstall old versions
adb uninstall androidx.test.services
adb uninstall androidx.test.orchestrator

# Install the test orchestrator.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/orchestrator/1.4.2/orchestrator-1.4.2.apk

# Install test services.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/services/test-services/1.4.2/test-services-1.4.2.apk

# Replace "com.example.test" with the name of the package containing your tests.
# Add "-e clearPackageData true" to clear your app's data in between runs.
adb shell 'CLASSPATH=$(pm path androidx.test.services) app_process / \
 androidx.test.services.shellexecutor.ShellMain am instrument -w -e \
 targetInstrumentation com.example.test/androidx.test.runner.AndroidJUnitRunner \
 androidx.test.orchestrator/.AndroidTestOrchestrator'

ดังที่ไวยากรณ์คำสั่งแสดง คุณต้องติดตั้ง Android Test Orchestrator แล้วใช้โดยตรง

adb shell pm list instrumentation

การใช้เครื่องมือต่างๆ

หากใช้ชุดเครื่องมืออื่นเพื่อทดสอบแอป คุณยังคงใช้ Android Test Orchestrator ได้โดยทำตามขั้นตอนต่อไปนี้

  1. รวมแพ็กเกจที่จำเป็นไว้ในไฟล์บิลด์ของแอป
  2. เปิดใช้ Android Test Orchestrator จากบรรทัดคำสั่ง

สถาปัตยกรรม

APK บริการ Orchestrator จะจัดเก็บไว้ในกระบวนการที่แยกจาก APK การทดสอบและ APK ของแอปที่ทดสอบ

Orchestrator ช่วยให้คุณควบคุมการทดสอบ JUnit ได้
รูปที่ 1: โครงสร้าง APK ของ Test Orchestration ของ Android

Android Test Orchestrator จะรวบรวมการทดสอบ JUnit ในช่วงเริ่มต้นของการเรียกใช้ชุดทดสอบ แต่หลังจากนั้นจะเรียกใช้การทดสอบแต่ละรายการแยกกันในอินสแตนซ์ Instrumentation ของตนเอง

ข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ AndroidJUnitRunner ได้ที่เอกสารอ้างอิง API

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ AndroidJUnitRunner ได้ที่แหล่งข้อมูลต่อไปนี้

ตัวอย่าง

  • AndroidJunitRunnerSample: แสดงคําอธิบายประกอบการทดสอบ การทดสอบที่มีพารามิเตอร์ และการสร้างชุดทดสอบ