Testy z instrumentacją

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 podklasy Instrumentation 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.

Podsumowanie kroków

  1. 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.

  2. 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.xmlAndroid.mk w jednej z lokalizacji podanych powyżej.

  3. 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" />
    
  4. Nie zapomnij oznaczyć testu jako @SmallTest, @MediumTest lub @LargeTest.

  5. Zbuduj moduł testowy za pomocą polecenia m, np.:

    m FrameworksCoreTests
    
  6. Przeprowadź testy:

    m tradefed-all
    tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
    
  7. Jeśli nie używasz Tradefed, zainstaluj i uruchom testy ręcznie:

    1. Zainstaluj wygenerowany plik APK:
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
    
    1. Przeprowadź testy z różnymi opcjami:

      1. wszystkie testy w pliku APK,

        adb shell am instrument -w com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      2. 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
        
      3. 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
        
      4. 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 JUnitAPI. 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:

  1. dane mogą być liczbami całkowitymi lub zmiennoprzecinkowymi;
  2. wszystkie wartości nienumeryczne zostaną odrzucone.
  3. plik APK testu może zawierać testy funkcjonalne lub testy danych, ale mieszanie obu rodzajów nie jest obecnie obsługiwane;