На этой странице описывается, как написать тест устройства в стиле 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@AfterClassAssume,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>