AndroidJUnitRunner

کلاس AndroidJUnitRunner یک اجراکننده آزمایش JUnit است که به شما امکان می‌دهد آزمایش‌های ابزاردار JUnit 4 را در دستگاه‌های Android اجرا کنید، ازجمله آزمایش‌هایی که از چارچوب‌های آزمایشی Espresso، UI Automator، و Compose استفاده می‌کنند.

اجراکننده آزمایش، بار کردن بسته آزمایشی و برنامه تحت آزمایش را در دستگاه، اجرای آزمایش‌ها، و گزارش نتایج آزمایش را مدیریت می‌کند.

این اجراکننده آزمایش از چندین تکلیف آزمایشی رایج پشتیبانی می‌کند، ازجمله:

نوشتن آزمایش‌های JUnit

تکه‌کد زیر نشان می‌دهد که چگونه می‌توانید یک آزمایش JUnit 4 ابزاردار بنویسید تا تأیید کنید که عملیات changeText در کلاس ChangeTextBehavior به‌درستی کار می‌کند:

کاتلین

@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)))
 }
}

جاوا

@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 را در برنامه‌تان ایجاد کرده باشید، این روش بافت زیرکلاس سفارشی‌تان را برمی‌گرداند.

اگر پیاده‌ساز ابزار هستید، می‌توانید بااستفاده از کلاس InstrumentationRegistry به میاناهای برنامه‌سازی کاربردی آزمایش سطح پایین دسترسی پیدا کنید. این کلاس شامل شیء Instrumentation، شیء برنامه هدف Context، شیء برنامه آزمایشی Context، و آرگومان‌های خط فرمان ارسال‌شده به آزمایش شما است.

فیلتر کردن آزمایش‌ها

در آزمایش‌های JUnit 4.x، می‌توانید از حاشیه‌نویسی‌ها برای پیکربندی اجرای آزمایش استفاده کنید. این ویژگی نیاز به افزودن کد شرطی و تکراری را در آزمایش‌هایتان به‌حداقل می‌رساند. علاوه‌بر حاشیه‌نویسی‌های استانداردی که JUnit 4 پشتیبانی می‌کند، اجراکننده آزمون از حاشیه‌نویسی‌های مختص Android نیز پشتیبانی می‌کند، ازجمله:

  • @RequiresDevice: مشخص می‌کند که آزمایش باید فقط روی دستگاه‌های فیزیکی اجرا شود، نه روی شبیه‌سازها.
  • @SdkSuppress: از اجرای آزمایش در سطح میانای برنامه‌سازی کاربردی Android پایین‌تر از سطح ارائه‌شده جلوگیری می‌کند. برای مثال، برای جلوگیری از اجرای آزمایش‌ها در همه سطوح میانای برنامه‌سازی کاربردی پایین‌تر از ۲۳، از حاشیه‌نویسی @SDKSuppress(minSdkVersion=23) استفاده کنید.
  • @SmallTest، @MediumTest، و @LargeTest: مدت زمان اجرای آزمایش را طبقه‌بندی کنید و درنتیجه، تعداد دفعاتی را که می‌توانید آزمایش را اجرا کنید مشخص کنید. می‌توانید از این حاشیه‌نویسی برای فیلتر کردن آزمایش‌هایی که باید اجرا شوند استفاده کنید و ویژگی android.testInstrumentationRunnerArguments.size را تنظیم کنید:
-Pandroid.testInstrumentationRunnerArguments.size=small

آزمایش‌های Shard

اگر لازم است اجرای آزمایش‌هایتان را موازی کنید، آن‌ها را در چندین سرور هم‌رسانی کنید تا سریع‌تر اجرا شوند، می‌توانید آن‌ها را به گروه‌ها یا بخش‌ها تقسیم کنید. اجراکننده آزمون از تقسیم یک مجموعه آزمون به چند بخش پشتیبانی می‌کند، بنابراین می‌توانید به‌راحتی آزمون‌های متعلق به یک بخش را باهم به‌عنوان یک گروه اجرا کنید. هر شارد با یک شماره نمایه شناسایی می‌شود. هنگام اجرای آزمایش‌ها، از گزینه -e numShards برای مشخص کردن تعداد قطعه‌های مجزا برای ایجاد و از گزینه -e shardIndex برای مشخص کردن اینکه کدام قطعه اجرا شود استفاده کنید.

برای مثال، برای تقسیم مجموعه آزمون به ۱۰ بخش و اجرای فقط آزمون‌های گروه‌بندی‌شده در بخش دوم، از فرمان adb زیر استفاده کنید:

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

استفاده از «هماهنگ‌کننده آزمایش Android»

«هماهنگ‌کننده آزمایش Android» به شما امکان می‌دهد هریک از آزمایش‌های برنامه‌تان را در فراخوانی Instrumentation خودش اجرا کنید. هنگام استفاده از AndroidJUnitRunner نسخه ۱.۰ یا بالاتر، به «هماهنگ‌کننده آزمایش Android» دسترسی دارید.

«هماهنگ‌کننده آزمایش Android» مزایای زیر را برای محیط آزمایشی شما ارائه می‌دهد:

  • حداقل وضعیت مشترک: هر آزمایش در Instrumentation نمونه خودش اجرا می‌شود. بنابراین، اگر آزمایش‌های شما وضعیت برنامه را هم‌رسانی کنند، بیشتر آن وضعیت هم‌رسانی‌شده پس‌از هر آزمایش از واحد پردازش مرکزی یا حافظه دستگاهتان برداشته می‌شود. برای برداشتن همه وضعیت‌های هم‌رسانی‌شده از واحد پردازش مرکزی و حافظه دستگاهتان پس‌از هر آزمایش، از پرچم clearPackageData استفاده کنید. برای دیدن نمونه، به بخش فعال کردن از Gradle مراجعه کنید.
  • خرابی‌ها جدا هستند: حتی اگر یک آزمایش خراب شود، فقط نمونه خودش از Instrumentation را ازکار می‌اندازد. این یعنی آزمایش‌های دیگر در مجموعه شما همچنان اجرا می‌شوند و نتایج آزمایش کامل را ارائه می‌دهند.

این جداسازی ممکن است باعث افزایش زمان اجرای آزمایشی شود زیرا «هماهنگ‌کننده آزمایش Android» برنامه را پس‌از هر آزمایش بازراه‌اندازی می‌کند.

«هماهنگ‌کننده آزمایش Android» در هر دو «استودیو Android» و Firebase Test Lab ازپیش نصب شده است، اما باید این ویژگی را در «استودیو Android» فعال کنید.

فعال کردن از Gradle

برای فعال کردن «هماهنگ‌کننده آزمایش Android» بااستفاده از ابزار خط فرمان Gradle، این مراحل را تکمیل کنید:

  • مرحله ۱: فایل 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'
}
  • مرحله ۲: «هماهنگ‌کننده آزمایش Android» را با اجرای فرمان زیر اجرا کنید:
./gradlew connectedCheck

فعال کردن از «استودیو Android»

برای فعال کردن «هماهنگ‌کننده آزمایش Android» در Android Studio، عبارت‌های نشان‌داده‌شده در فعال کردن از Gradle را به فایل build.gradle برنامه‌تان اضافه کنید.

فعال کردن از خط فرمان

برای استفاده از «هماهنگ‌کننده آزمایش Android» در خط فرمان، فرمان‌های زیر را در پنجره ترمینال اجرا کنید:

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» را نصب می‌کنید، سپس مستقیماً از آن استفاده می‌کنید.

adb shell pm list instrumentation

استفاده از زنجیره‌های ابزار مختلف

اگر از زنجیره ابزار دیگری برای آزمایش برنامه‌تان استفاده می‌کنید، همچنان می‌توانید با تکمیل مراحل زیر از «هماهنگ‌کننده آزمایش Android» استفاده کنید:

  1. بسته‌های لازم را در فایل ساخت برنامه‌تان اضافه کنید.
  2. «هماهنگ‌کننده آزمایش Android» را از خط فرمان فعال کنید.

معماری

فایل APK سرویس Orchestrator در فرایندی ذخیره می‌شود که از فایل APK آزمایشی و فایل APK برنامه تحت آزمایش جدا است:

سازمان‌دهنده به شما امکان می‌دهد آزمایش‌های JUnit را کنترل کنید
شکل ۱: ساختار APK «هماهنگ‌کننده آزمایش Android».

«هماهنگ‌کننده آزمایش Android» آزمایش‌های JUnit را در ابتدای اجرای مجموعه آزمون شما جمع‌آوری می‌کند، اما سپس هر آزمایش را به‌طور جداگانه در نمونه خودش از Instrumentation اجرا می‌کند.

اطلاعات بیشتر

برای کسب اطلاعات بیشتر درباره استفاده از AndroidJUnitRunner، به مرجع میانای برنامه‌سازی کاربردی مراجعه کنید.

منابع بیشتر

برای اطلاعات بیشتر درباره استفاده از AndroidJUnitRunner، به منابع زیر مراجعه کنید.

نمونه‌ها

  • AndroidJunitRunnerSample: حاشیه‌نویسی‌های آزمایشی، آزمایش‌های پارامتری‌شده، و ایجاد مجموعه آزمایشی را نشان می‌دهد.