Najpierw przeczytaj artykuł Testowanie aplikacji na stronie developer.android.com. Zwróć uwagę na różnice w sposobie używania testów instrumentacyjnych w testach platformy.
Podsumowując, test instrumentacyjny zapewnia specjalne środowisko wykonywania testów uruchamiane za pomocą polecenia am instrument
, w którym proces docelowej aplikacji jest ponownie uruchamiany i inicjowany z podstawowym kontekstem aplikacji, a w maszynie wirtualnej procesu aplikacji uruchamiany jest wątek instrumentacji. Kod testowy zaczyna wykonywać się w tym wątku instrumentacji i ma dostęp do instancji Instrumentation
, która zapewnia dostęp do kontekstu aplikacji i interfejsów API do manipulowania testowanym procesem aplikacji.
Kluczowych pojęć
- instrumentacja musi być zadeklarowana w pakiecie aplikacji, a tag
<instrumentation>
musi być zagnieżdżony w tagu<manifest>
w pliku manifestu pakietu aplikacji; - plik manifestu pakietu aplikacji może technicznie zawierać wiele tagów
<instrumentation>
, choć nie jest to powszechnie stosowane. - Każdy
<instrumentation>
musi zawierać:- atrybut
android:name
: powinna to być nazwa podklasyInstrumentation
uwzględnionej w aplikacji testowej, która jest zwykle używanym narzędziem do uruchamiania testów, np.:android.support.test.runner.AndroidJUnitRunner
- musi być zdefiniowany atrybut
android:targetPackage
. Jej wartość powinna być ustawiona na pakiet aplikacji poddanej testowi.
- atrybut
Podsumowanie kroków
Oto typowe miejsca docelowe testów hermetycznych w odniesieniu do usług platformy:
frameworks/base/core/tests/coretests frameworks/base/services/tests/servicestests
Jeśli dodajesz zupełnie nowy moduł instrumentacji do komponentu, zapoznaj się z tym artykułem.
Zgodnie z dotychczasową konwencją, jeśli dodajesz testy w jednej z lokalizacji powyżej. Jeśli konfigurujesz nowy moduł testowy, postępuj zgodnie z instrukcjami konfiguracji
AndroidManifest.xml
iAndroid.mk
w jednej z lokalizacji podanych powyżej.Przykład znajdziesz w frameworks/base/core/tests/coretests/. Zwróć uwagę, że te wiersze instalują dodatkowe aplikacje:
<option name="test-file-name" value="FrameworksCoreTests.apk" /> <option name="test-file-name" value="BstatsTestApp.apk" />
Nie zapomnij oznaczyć testu jako
@SmallTest
,@MediumTest
lub@LargeTest
.Zbuduj moduł testowy za pomocą polecenia m, np.:
m FrameworksCoreTests
Przeprowadź testy:
Najprostszym rozwiązaniem jest użycie elementu Atest w ten sposób:
atest FrameworksCoreTests
W przypadku bardziej złożonych testów użyj platformy testowej Federacji Handlowej:
m tradefed-all tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
Jeśli nie używasz Tradefed, zainstaluj i uruchom testy ręcznie:
- Zainstaluj wygenerowany plik APK:
adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
Przeprowadź testy z różnymi opcjami:
wszystkie testy w pliku APK,
adb shell am instrument -w com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
wszystkie testy w określonym pakiecie Java,
adb shell am instrument -w -e package android.animation \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
wszystkie testy w ramach określonej klasy,
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
określoną metodę testowania,
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest#testCancel \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
Test może zawierać wyraźne stwierdzenie o sukcesie lub niepowodzeniu za pomocą interfejsów JUnit
API. Ponadto nieobsłużone wyjątki również spowodują niepowodzenie testu funkcjonalnego.
Aby wysyłać dane o skuteczności, kod testu może wywoływać funkcję
Instrumentation#sendStatus
w celu wysłania listy par klucz-wartość. Pamiętaj, że:
- dane mogą być liczbami całkowitymi lub zmiennoprzecinkowymi;
- wszystkie wartości nienumeryczne zostaną odrzucone.
- plik APK testu może zawierać testy funkcjonalne lub testy danych, ale mieszanie obu rodzajów nie jest obecnie obsługiwane;