Testy instrumentowane są przeprowadzane na urządzeniach z Androidem (fizycznych i emulowanych). Dzięki temu mogą korzystać z interfejsów API platformy Android. Testy z instrumentów dają więc większą rzetelność niż testy lokalne, choć działają znacznie wolniej.
Testów instrumentalnych zalecamy tylko w przypadkach, gdy musisz porównać działanie prawdziwego urządzenia. AndroidX Test udostępnia kilka bibliotek, które ułatwiają pisanie w razie potrzeby testów z instrumentacją.
Konfigurowanie środowiska testowego
W projekcie Android Studio przechowujesz pliki źródłowe do testów z instrumentacją w usłudze module-name/src/androidTest/java/
. Ten katalog już istnieje podczas tworzenia nowego projektu i zawiera przykładowy test instrumentalny.
Zanim zaczniesz, dodaj interfejsy AndroidX Test API, które pozwolą Ci szybko tworzyć i uruchamiać instrumentowany kod testowy aplikacji. AndroidX Test zawiera narzędzie do uruchamiania testów JUnit 4 AndroidJUnitRunner
oraz interfejsy API do testowania funkcjonalnego interfejsu użytkownika, np. Espresso, UI Automator i Compose test.
Musisz też skonfigurować zależności testowe na Androidzie w projekcie, aby używać narzędzia do uruchamiania testów i interfejsów API reguł dostarczanych przez AndroidX Test.
W pliku build.gradle
najwyższego poziomu aplikacji musisz określić te biblioteki jako zależności:
dependencies {
androidTestImplementation "androidx.test:runner:$androidXTestVersion"
androidTestImplementation "androidx.test:rules:$androidXTestVersion"
// Optional -- UI testing with Espresso
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
// Optional -- UI testing with UI Automator
androidTestImplementation "androidx.test.uiautomator:uiautomator:$uiAutomatorVersion"
// Optional -- UI testing with Compose
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
}
Najnowsze wersje znajdziesz w informacjach o wersji AndroidaX i artykule o wersji interfejsu tworzenia wiadomości.
Aby używać klas testowych JUnit 4 i mieć dostęp do takich funkcji jak filtrowanie testów, pamiętaj, aby ustawić AndroidJUnitRunner jako domyślną aplikację testową w projekcie, dodając to ustawienie do pliku build.gradle
na poziomie modułu aplikacji:
android {
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
}
Tworzenie z instrumentowanych zajęć testowych
Narzędziaowa klasa testowa powinna być klasą testową JUnit 4, która jest podobna do klasy opisanej w sekcji poświęconej tworzeniu testów lokalnych.
Aby utworzyć instrumentowaną klasę testową JUnit 4, jako domyślny proces uruchamiania testów podaj AndroidJUnit4
.
W tym przykładzie pokazujemy, jak napisać test z instrumentacją, aby sprawdzić, czy interfejs Parcelable jest prawidłowo zaimplementowany w klasie LogHistory
:
Kotlin
import android.os.Parcel import android.text.TextUtils.writeToParcel import androidx.test.filters.SmallTest import androidx.test.runner.AndroidJUnit4 import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith const val TEST_STRING = "This is a string" const val TEST_LONG = 12345678L // @RunWith is required only if you use a mix of JUnit3 and JUnit4. @RunWith(AndroidJUnit4::class) @SmallTest class LogHistoryAndroidUnitTest { private lateinit var logHistory: LogHistory @Before fun createLogHistory() { logHistory = LogHistory() } @Test fun logHistory_ParcelableWriteRead() { val parcel = Parcel.obtain() logHistory.apply { // Set up the Parcelable object to send and receive. addEntry(TEST_STRING, TEST_LONG) // Write the data. writeToParcel(parcel, describeContents()) } // After you're done with writing, you need to reset the parcel for reading. parcel.setDataPosition(0) // Read the data. val createdFromParcel: LogHistory = LogHistory.CREATOR.createFromParcel(parcel) createdFromParcel.getData().also { createdFromParcelData: List<Pair<String, Long>> -> // Verify that the received data is correct. assertThat(createdFromParcelData.size).isEqualTo(1) assertThat(createdFromParcelData[0].first).isEqualTo(TEST_STRING) assertThat(createdFromParcelData[0].second).isEqualTo(TEST_LONG) } } }
Java
import android.os.Parcel; import android.util.Pair; import androidx.test.runner.AndroidJUnit4; import com.google.common.truth.Truth.assertThat; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; // @RunWith is required only if you use a mix of JUnit3 and JUnit4. @RunWith(AndroidJUnit4.class) public class LogHistoryAndroidUnitTest { public static final String TEST_STRING = "This is a string"; public static final long TEST_LONG = 12345678L; private LogHistory mLogHistory; @Before public void createLogHistory() { mLogHistory = new LogHistory(); } @Test public void logHistory_ParcelableWriteRead() { // Set up the Parcelable object to send and receive. mLogHistory.addEntry(TEST_STRING, TEST_LONG); // Write the data. Parcel parcel = Parcel.obtain(); mLogHistory.writeToParcel(parcel, mLogHistory.describeContents()); // After you're done with writing, you need to reset the parcel for reading. parcel.setDataPosition(0); // Read the data. LogHistory createdFromParcel = LogHistory.CREATOR.createFromParcel(parcel); List<Pair<String, Long>> createdFromParcelData = createdFromParcel.getData(); // Verify that the received data is correct. assertThat(createdFromParcelData.size()).isEqualTo(1); assertThat(createdFromParcelData.get(0).first).isEqualTo(TEST_STRING); assertThat(createdFromParcelData.get(0).second).isEqaulTo(TEST_LONG); } }
Przeprowadzanie testów z użyciem instrumentów
Testy z instrumentacją można przeprowadzać na prawdziwych urządzeniach lub w emulatorach. Z przewodnika Android Studio dowiesz się, jak:
Dodatkowe materiały
Testy interfejsu to zwykle testy z użyciem instrumentów, które służą do sprawdzania poprawności działania interfejsu. Korzystają one ze platform takich jak Espresso czy Compose Test. Więcej informacji znajdziesz w przewodniku testowania UI.
Więcej informacji o korzystaniu z testów z instrumentacją znajdziesz w tych materiałach.