AndroidJUnitRunner

AndroidJUnitRunner sınıfı, Espresso, UI Automator ve Compose test çerçevelerini kullananlar da dahil olmak üzere Android cihazlarda enstrümante edilmiş JUnit 4 testleri çalıştırmanıza olanak tanıyan 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 de dahil olmak üzere çeşitli yaygın test görevlerini destekler:

JUnit testleri yazma

Aşağıdaki kod snippet'inde, ChangeTextBehavior sınıfındaki changeText işleminin doğru çalıştığını doğrulamak için nasıl enstrümante edilmiş bir JUnit 4 testi yazabileceğinizi gösterilmektedir:

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

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ç uygulayıcısı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 filtreleme

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

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

Parça testleri

Testlerinizin yürütülmesini paralelleştirmeniz gerekiyorsa daha hızlı çalıştırmak için bunları birden fazla sunucuda paylaşarak 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 testleri grup halinde kolayca çalıştırabilirsiniz. Her bir parça bir dizin numarasıyla tanımlanır. Test çalıştırırken, oluşturulacak ayrı parça sayısını belirtmek için -e numShards seçeneğini ve hangi parçanı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 parçada 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'ı kullanma

Android Test Orchestrator, uygulamanızın her bir testini kendi Instrumentation çağrısı içinde çalıştırmanıza olanak tanır. AndroidJUnitRunner 1.0 veya sonraki bir sürümü kullandığınızda Android Test Orchestrator'a erişebilirsiniz.

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

  • Minimum ortak durum: Her test kendi Instrumentation örneğinde çalışır. Bu nedenle, testleriniz uygulama durumunu paylaşıyorsa paylaşılan durumun büyük kısmı her testten sonra cihazınızın CPU'sundan veya belleğinden kaldırılır. Her testten sonra cihazınızın CPU'sundan ve belleğinden tüm paylaşılan durumları kaldırmak için clearPackageData işaretini kullanın. Örnek için Gradle'den etkinleştirme bölümüne bakın.
  • Kilitlenmeler izole edilir: Bir test kilitlense bile yalnızca kendi Instrumentation örneğini kapatır. Bu, paketinizdeki diğer testlerin çalışmaya devam ettiği ve eksiksiz test sonuçları sağladığı anlamına gelir.

Android Test Orkestratörü her testten sonra uygulamayı yeniden başlattığı için bu yalıtım, test yürütme süresinde olası bir artışa neden olur.

Hem Android Studio hem de Firebase Test Lab'de Android Test Orchestrator önceden yüklü olarak bulunur ancak Android Studio'da özelliği etkinleştirmeniz gerekir.

Gradle'den etkinleştirme

Gradle komut satırı aracını kullanarak Android Test Orchestrator'ı etkinleştirmek için aşağıdaki 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 yürüterek 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'den etkinleştir bölümünde gösterilen ifadeleri uygulamanızın build.gradle dosyasına ekleyin.

Komut satırından etkinleştirme

Android Test Orchestrator'ı komut satırında kullanmak için terminal penceresinde aşağıdaki 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 dizimi gösterdiği gibi, Android Test Orchestrator'ı yükleyip doğrudan kullanırsınız.

adb shell pm list instrumentation

Farklı araç zincirlerini kullanma

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

  1. Uygulamanızın derleme dosyasına gerekli paketleri ekleyin.
  2. Android Test Orchestrator'ı komut satırından etkinleştirin.

Mimari

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

Orchestrator, JUnit testlerini kontrol etmenize olanak tanır
Şekil 1: Android Test Orchestration APK yapısı.

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

Daha fazla bilgi

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

Ek kaynaklar

AndroidJUnitRunner kullanımı hakkında daha fazla bilgi için aşağıdaki kaynaklara göz atın.

Örnekler