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çinclearPackageData
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:
- Uygulamanızın derleme dosyasına gerekli paketleri ekleyin.
- 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:
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
- AndroidJunitRunnerSample: Test ek açıklamalarını, parametreli testleri ve test paketi oluşturmayı gösterir.