Najpierw przeczytaj Przetestuj swoją aplikację na developer.android.com. Zwróć uwagę, że istnieją pewne różnice w sposobie używania testów oprzyrządowania w testowaniu platformy.
Podsumowując, test oprzyrządowania zapewnia specjalne środowisko wykonywania testów uruchamiane za pomocą polecenia am instrument
, w którym docelowy proces aplikacji jest ponownie uruchamiany i inicjowany z podstawowym kontekstem aplikacji, a wątek oprzyrządowania jest uruchamiany wewnątrz maszyny wirtualnej procesu aplikacji. Twój kod testowy rozpoczyna wykonywanie w tym wątku Instrumentacji i jest dostarczany z instancją Instrumentation
, która zapewnia dostęp do kontekstu aplikacji i interfejsów API w celu manipulowania testowanym procesem aplikacji.
Kluczowe idee
- oprzyrządowanie musi być zadeklarowane w pakiecie aplikacji z tagiem
<instrumentation>
zagnieżdżonym pod tagiem<manifest>
manifestu pakietu aplikacji. - manifest pakietu aplikacji może technicznie zawierać wiele tagów
<instrumentation>
, chociaż nie jest to powszechnie używane w ten sposób. - każdy
<instrumentation>
musi zawierać:- atrybut
android:name
: powinien to być nazwa podklasyInstrumentation
zawartej w aplikacji testowej, która zazwyczaj jest używanym modułem uruchamiającym testy, np.:android.support.test.runner.AndroidJUnitRunner
- musi być zdefiniowany atrybut
android:targetPackage
. Jego wartość powinna być ustawiona na testowany pakiet aplikacji.
- atrybut
Podsumowanie kroków
Poniżej znajdują się typowe miejsca docelowe testów hermetycznych usług ramowych:
frameworks/base/core/tests/coretests frameworks/base/services/tests/servicestests
Jeśli dodajesz zupełnie nowy moduł oprzyrządowania dla swojego komponentu, zobacz
Zgodnie z istniejącą konwencją, jeśli dodajesz testy do jednej z powyższych lokalizacji. Jeśli konfigurujesz nowy moduł testowy, postępuj zgodnie z konfiguracją
AndroidManifest.xml
iAndroid.mk
w jednej z powyższych lokalizacjiPrzykład można znaleźć 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ć swojego testu jako
@SmallTest
,@MediumTest
lub@LargeTest
Zbuduj moduł testowy za pomocą m, np.:
m FrameworksCoreTests
Uruchom testy:
Najprostszym rozwiązaniem jest użycie Atest w następujący sposób:
atest FrameworksCoreTests
Lub w przypadku bardziej złożonych testów użyj szelek testowych Federacji Handlowej :
m tradefed-all tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
Jeśli nie używasz TradeFed, ręcznie zainstaluj i uruchom testy:
- Zainstaluj wygenerowany apk:
adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
Uruchom testy z różnymi opcjami:
wszystkie testy w apk
adb shell am instrument -w com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
wszystkie testy w ramach określonego pakietu 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ę testową
adb shell am instrument -w -e class \ android.animation.AnimatorSetEventsTest#testCancel \ com.android.frameworks.coretests\ /android.support.test.runner.AndroidJUnitRunner
Twój test może jawnie stwierdzić, czy przeszedł pomyślnie, czy nie, używając interfejsów API JUnit
; ponadto wszelkie nieprzechwycone wyjątki również spowodują awarię funkcjonalną.
Aby emitować metryki wydajności, kod testowy może wywoływać funkcję Instrumentation#sendStatus
w celu wysłania listy par klucz-wartość. Należy zauważyć, że:
- metryki mogą być liczbami całkowitymi lub zmiennoprzecinkowymi
- wszelkie wartości nieliczbowe zostaną odrzucone
- Twoja aplikacja testowa może być testami funkcjonalnymi lub testami metryk, jednak mieszanie obu nie jest obecnie obsługiwane