Pisanie testu hosta w ramach Federacji handlowej

Z tej strony dowiesz się, jak napisać test urządzenia w stylu JUnit4 sterowany przez hosta. Oznacza to, że strona hosta w narzędziu będzie wywoływać działania na urządzeniu.

Pamiętaj, że testy „po stronie hosta” i „sterowane przez hosta” są nieco inne:

  • Test sterowany przez hosta: test uruchamiany na hoście, który wchodzi w interakcję z co najmniej 1 urządzeniem. Testowany system (SUT) nie znajduje się na hoście, ale jest testowany z hosta.
  • Test po stronie hosta: test uruchamiany wyłącznie na hoście, który testuje coś tylko na hoście, np. testy jednostkowe.

Dlaczego warto utworzyć test sterowany przez hosta zamiast testu z instrumentacją?

Niektóre testy mogą wymagać wpływu na ogólny stan urządzenia, np. wydania polecenia ponownego uruchomienia. W przypadku testu z instrumentacją ponowne uruchomienie spowoduje przerwanie instrumentacji, test nie będzie mógł być kontynuowany, a wyniki nie będą dostępne.

Testy sterowane przez hosta mogą też wykonywać dodatkowe kroki konfiguracji, które wymagają interakcji z urządzeniami zewnętrznymi, od których zależy test.

Test sterowany przez hosta może obsługiwać te przypadki użycia i umożliwiać zaawansowane testowanie urządzenia w większej liczbie scenariuszy. Jeśli jesteś w takiej sytuacji, napisanie testu sterowanego przez hosta jest najlepszym rozwiązaniem.

Jak pisać testy sterowane przez hosta w TF?

Oto przykład:

@RunWith(DeviceJUnit4ClassRunner.class)
public class SampleHostJUnit4DeviceTest extends BaseHostJUnit4Test {
    @Before
    public void setUp() throws Exception {
       // Some setup
    }

    @Test
    public void testCheckWeHaveDevice() throws Exception {
        Assert.assertNotNull(getDevice());
    }
}

Testy sterowane przez hosta w Trade Federation są sterowane przez moduł uruchamiający testy JUnit4 DeviceJUnit4ClassRunner. Ogólna struktura klasy testowej jest taka sama jak w przypadku zwykłego testu JUnit4:

  • @BeforeClass
  • @Before
  • @Test
  • @After
  • @AfterClass
  • Assume, Assert

Rozszerzenie BaseHostJunit4Test umożliwia dziedziczenie przydatnych interfejsów API narzędzi testowych, takich jak:

  • installPackage: umożliwia zainstalowanie pliku APK na urządzeniu docelowym.
  • installPackageAsUser: umożliwia zainstalowanie pliku APK jako użytkownika na urządzeniu docelowym.
  • uninstallPackage: umożliwia odinstalowanie pliku APK.
  • isPackageInstalled: sprawdza, czy pakiet jest zainstalowany.
  • hasDeviceFeature: sprawdza, czy urządzenie obsługuje daną funkcję. (pm list features)
  • runDeviceTests(DeviceTestRunOptions options): uruchamia test z instrumentacją na urządzeniu docelowym za pomocą DeviceTestRunOptions , aby obsługiwać wszystkie możliwe opcje.

Zapewnia też dostęp do obiektu urządzenia Tradefed:

  • getDevice(): zwraca obiekt urządzenia TF do manipulowania urządzeniem.
  • getBuild(): zwraca obiekt TF z informacjami o kompilacji, aby uzyskać informacje o kompilacji.
  • getAbi(): zwraca ABI, na którym jest uruchamiany test.

Obsługa Tradefed: przygotowanie urządzenia i czyszczenie na poziomie klasy

JUnit4 @BeforeClass i @AfterClass mają zastosowanie tylko do metod statycznych, co uniemożliwia użycie modułu obsługi #getDevice() do wykonania jednorazowej konfiguracji lub zwolnienia miejsca na poziomie klasy. Aby rozwiązać ten problem, użyj adnotacji Tradefed.

  • @BeforeClassWithInfo: uruchamia się przed adnotacjami @BeforeClass.
  • @AfterClassWithInfo: uruchamia się po adnotacjach @AfterClass.
   @BeforeClassWithInfo
   public static void beforeClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

   @AfterClassWithInfo
   public static void afterClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

TestInformation umożliwia korzystanie z urządzenia i przechowywanie właściwości, które mogą być używane w zakresie statycznym lub niestatycznym. BaseHostJUnit4Test obsługuje pobieranie TestInformation w zakresie niestatycznym za pomocą #getTestInformation().

Jeśli nie rozszerzasz BaseHostJUnit4Test, możesz zaimplementować ITestInformationReceiver, aby otrzymywać obiekt TestInformation.

Jak skonfigurować test sterowany przez hosta w Tradefed?

W pliku konfiguracji XML Tradefed testy sterowane przez hosta są uruchamiane za pomocą modułu uruchamiającego HostTest.

<test class="com.android.tradefed.testtype.HostTest" >
    <option name="class" value="android.sample.cts.SampleHostJUnit4DeviceTest" />
</test>