Как написать тест, управляемый хостом, в Trade Federation

На этой странице описывается, как написать тест устройства в стиле JUnit4, управляемый хостом. Это означает, что хост-сторона жгута будет запускать действия на устройстве.

Обратите внимание, что мы считаем тесты на стороне хоста и тесты, управляемые хостом, немного разными:

  • Тест, управляемый хостом, – это тест, выполняемый на хосте и взаимодействующий с одним или несколькими устройствами. Тестируемая система (SUT) находится не на самом хосте, а тестируется с хоста.
  • тест на стороне хоста – тест, который выполняется исключительно на хосте и проверяет что-то только на хосте, например модульное тестирование;

Почему стоит создать тест, управляемый хостом, а не инструментальный тест?

Для некоторых тестов может потребоваться изменить общее состояние устройства, например выполнить команду перезагрузки. В случае инструментального теста перезагрузка приведет к его остановке, и результаты не будут доступны.

Тесты, управляемые хостом, также могут запускать дополнительные шаги настройки, требующие взаимодействия с внешними устройствами, от которых зависит тест.

Тестирование, управляемое хостом, позволяет реализовать эти сценарии и проводить более сложное тестирование устройства. В этом случае лучше всего написать тест, управляемый хостом.

Как тесты, управляемые хостом, пишутся в TF?

Вот пример:

@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());
    }
}

Тесты, управляемые хостом, в Trade Federation запускаются с помощью средства запуска тестов JUnit4 DeviceJUnit4ClassRunner. Общая структура тестового класса такая же, как и у обычного теста JUnit4:

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

Расширение BaseHostJunit4Test позволяет наследовать полезные API для тестирования, например:

  • installPackage: позволяет установить APK-файл на целевое устройство.
  • installPackageAsUser – позволяет установить APK-файл от имени пользователя на целевом устройстве.
  • uninstallPackage – позволяет удалить APK-файл.
  • isPackageInstalled – проверяет, установлен ли пакет.
  • hasDeviceFeature – проверить, поддерживает ли устройство функцию. (pm list features)
  • runDeviceTests(DeviceTestRunOptions options): запустите инструментальный тест на целевом устройстве, используя DeviceTestRunOptions, чтобы обработать все возможные варианты.

Также предоставьте доступ к объекту устройства Tradefed:

  • getDevice(): возвращает объект устройства TF для управления устройством.
  • getBuild(): возвращает объект TF с информацией о сборке.
  • getAbi() – возвращает ABI, для которого выполняется тестирование.

Поддержка Tradefed: подготовка и очистка устройств по классам

JUnit4 @BeforeClass и @AfterClass применимы только к статическим методам, поэтому обработчик #getDevice() нельзя использовать для однократной настройки или очистки на уровне класса, зависящей от устройства. Чтобы решить эту проблему, используйте аннотацию Tradefed.

  • @BeforeClassWithInfo: выполняется до аннотаций @BeforeClass.
  • @AfterClassWithInfo: выполняется после аннотаций @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 позволяет использовать устройство и хранить свойства, которые можно использовать в статическом или нестатистическом контексте. BaseHostJUnit4Test поддерживает получение TestInformation в нестандартной области видимости с помощью #getTestInformation().

Если вы не расширяете BaseHostJUnit4Test, вы можете реализовать ITestInformationReceiver, чтобы получать объект TestInformation.

Как настроить тест, управляемый хостом, в Tradefed?

В XML-файле конфигурации Tradefed тесты, управляемые хостом, запускаются с помощью средства запуска HostTest.

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