AndroidJUnitRunner

AndroidJUnitRunner sınıfı, Android cihazlarda Espresso, UI Automator ve Compose test çerçevelerini kullananlar da dahil olmak üzere Android cihazlarda enstrümanlı JUnit 4 testlerini çalıştırmanızı sağlayan bir JUnit test çalıştırıcısıdır.

Test çalıştırıcı, test paketinizi ve test edilen uygulamayı bir cihaza yükleme, testlerinizi çalıştırma ve test sonuçlarını raporlama işlemlerini gerçekleştirir.

Bu test çalıştırıcı, aşağıdakiler dahil çeşitli yaygın test görevlerini destekler:

JUnit testlerini yaz

Aşağıdaki kod snippet'i, ChangeTextBehavior sınıfındaki changeText işleminin doğru şekilde çalıştığını doğrulamak için izlemeli bir JUnit 4 testini nasıl yazabileceğinizi gösterir:

Kotlin


@RunWith(AndroidJUnit4::class) // Only needed when mixing JUnit 3 and 4 tests
@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) // Only needed when mixing JUnit 3 and 4 tests
@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)));
    }
}

Uygulamanın Bağlamına Erişme

Testlerinizi çalıştırmak için AndroidJUnitRunner kullandığınızda statik ApplicationProvider.getApplicationContext() yöntemini çağırarak test edilen uygulamanın bağlamına erişebilirsiniz. Uygulamanızda Application için özel bir alt sınıf oluşturduysanız bu yöntem özel alt sınıfınızın bağlamını döndürür.

Araçları uygulayan bir kullanıcıysanız InstrumentationRegistry sınıfını kullanarak alt düzey test API'lerine erişebilirsiniz. Bu sınıf; Instrumentation nesnesini, hedef uygulama Context nesnesini, test uygulaması Context nesnesini ve testinize iletilen komut satırı bağımsız değişkenlerini içerir.

Testleri filtreleyin

JUnit 4.x testlerinizde, test çalıştırmasını yapılandırmak için ek açıklamaları kullanabilirsiniz. Bu özellik, testlerinize standart kod ve koşullu kod ekleme ihtiyacını en aza indirir. Test çalıştırıcı, JUnit 4 tarafından desteklenen standart ek açıklamalara ek olarak aşağıdakiler de dahil olmak üzere Android'e özel ek açıklamaları da destekler:

  • @RequiresDevice: Testin emülatörlerde değil, yalnızca fiziksel cihazlarda çalışması gerektiğini belirtir.
  • @SdkSuppress: Testin belirtilen düzeyden daha düşük bir Android API düzeyinde çalışmasını engeller. Örneğin, 23'ten düşük API düzeylerinde testlerin çalışmasını engellemek için @SDKSuppress(minSdkVersion=23) ek açıklamasını kullanın.
  • @SmallTest, @MediumTest ve @LargeTest: Bir testin ne kadar sürmesi gerektiğini ve dolayısıyla testi ne sıklıkta çalıştırabileceğinizi sınıflandırın. Çalıştırılacak testleri filtrelemek için android.testInstrumentationRunnerArguments.size özelliğini ayarlayarak bu ek açıklamayı kullanabilirsiniz:
-Pandroid.testInstrumentationRunnerArguments.size=small

Parçalama testleri

Testlerinizin yürütülmesini paralel hale getirmeniz gerekiyorsa testlerinizin daha hızlı çalışması için bunları birden fazla sunucuda paylaşarak bunları gruplara veya parçalara bölebilirsiniz. Test çalıştırıcı, tek bir test paketinin birden fazla parçaya bölünmesini destekler. Böylece, aynı parçaya ait olan testleri grup olarak kolayca çalıştırabilirsiniz. Her kırık bir dizin numarasıyla tanımlanır. Testleri çalıştırırken, oluşturulacak ayrı parça sayısını belirtmek için -e numShards seçeneğini ve hangi kırığın çalıştırılacağını belirtmek için -e shardIndex seçeneğini kullanın.

Örneğin, test paketini 10 parçaya bölmek ve yalnızca ikinci kırıkta gruplandırılmış testleri çalıştırmak için aşağıdaki adb komutunu kullanın:

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

Android Test Orchestrator'ı Kullan

Android Test Orchestrator, uygulamanızın her testini kendi Instrumentation çağrısıyla çalıştırmanızı sağlar. AndroidJUnitRunner 1.0 veya üzeri bir sürümü kullanırken Android Test Orchestrator'a erişebilirsiniz.

Android Test Orchestrator, test ortamınız için aşağıdaki avantajları sunar:

  • Minimum paylaşılan durum: Her test kendi Instrumentation örneğinde çalışır. Bu nedenle, testleriniz uygulama durumunu paylaşıyorsa bu paylaşılan durumun çoğu her testten sonra cihazınızın CPU veya belleğinden kaldırılır. Her testten sonra cihazınızın CPU ve belleğinden tüm paylaşılan durumu kaldırmak için clearPackageData işaretini kullanın. Örnek için Gradle'dan etkinleştirme bölümüne bakın.
  • Kilitlenmeler birbirinden bağımsızdır: Testlerden biri kilitlense bile yalnızca kendi Instrumentation örneğini kaldırır. Bu da paketinizdeki diğer testlerin çalışmaya devam ederek tam test sonuçları sağladığı anlamına gelir.

Android Test Orchestrator her testten sonra uygulamayı yeniden başlattığından, bu izolasyon test yürütme süresinde olası bir artışa neden olur.

Hem Android Studio'da hem de Firebase Test Lab'de Android Test Orkestratörü önceden yüklenmiştir, ancak bu özelliği Android Studio'da etkinleştirmeniz gerekir.

Gradle'dan etkinleştir

Gradle komut satırı aracını kullanarak Android Test Orchestrator'ı etkinleştirmek için şu adımları tamamlayın:

  • 1. Adım: Gradle dosyasını değiştirin. Projenizin build.gradle dosyasına aşağıdaki ifadeleri ekleyin:
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. Adım: Aşağıdaki komutu çalıştırarak Android Test Orchestrator'ı çalıştırın:
./gradlew connectedCheck

Android Studio'dan etkinleştirme

Android Studio'da Android Test Orchestrator'ı etkinleştirmek için Gradle'dan etkinleştir bölümünde gösterilen ifadeleri uygulamanızın build.gradle dosyasına ekleyin.

Komut satırından etkinleştir

Android Test Orchestrator'ı komut satırında kullanmak için bir terminal penceresinde şu komutları çalıştırın:

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'

Komut söz diziminde gösterildiği gibi Android Test Orchestrator'ı yükleyip doğrudan kullanıyorsunuz.

adb shell pm list instrumentation

Farklı araç zincirleri kullanma

Uygulamanızı test etmek için farklı bir araç zinciri kullanıyorsanız aşağıdaki adımları tamamlayarak Android Test Orchestrator'ı kullanmaya devam edebilirsiniz:

  1. Gerekli paketleri uygulamanızın derleme dosyasına ekleyin.
  2. Komut satırından Android Test Orchestrator'ı etkinleştirin.

Mimari

Orchestrator hizmeti APK'sı, test APK'sından ve test edilen uygulamanın APK'sından ayrı bir işlemde depolanır:

Orkestratör, JUnit testlerini kontrol etmenize olanak tanır
Şekil 1: Android Test Düzenleme APK yapısı.

Android Test Orchestrator, test paketi çalıştırmanızın başında JUnit testlerini toplar, ancak daha sonra her testi kendi Instrumentation örneğinde ayrı ayrı yürütür.

Daha fazla bilgi

AndroidJUnitRunner'ı kullanma hakkında daha fazla bilgi için API referansına bakın.

Ek kaynaklar

AndroidJUnitRunner kullanımı hakkında daha fazla bilgi için aşağıdaki kaynaklara başvurun.

Sana Özel

  • AndroidJunitRunnerSample: Test ek açıklamalarını, parametreleştirilmiş testleri ve test paketi oluşturmayı gösterir.