На этой странице рассказывается, как сообщать о показателях вместе с результатами тестирования при написании теста в Tradefed.
Преимущество регистрации через конвейер Tradefed заключается в том, что вы можете найти свои показатели вместе с результатами работы функций. Регистрация показателей может быть выполнена очень естественно в рамках тестов, что позволяет авторам тестов легко добавлять больше инструментов.
DeviceTestCase – стиль JUnit3
Если ваш тест расширяет DeviceTestCase в стиле JUnit3, вы можете вызвать метод addTestMetric(String key, String value) из любого тестового примера, чтобы сообщить о показателе. Этот метод можно вызывать несколько раз, если ключ уникален.
Пример:
public static class TestMetricTestCase extends DeviceTestCase {
public void testPass() {
addTestMetric("key1", "metric1");
}
public void testPass2() {
addTestMetric("key2", "metric2");
}
}
Если вы хотите, чтобы файл был доступен в result_reporters, вызовите метод addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) из любого отчета о тестировании.
Пример:
public static class TestLogTestCase extends DeviceTestCase {
public void testPass() {
try (InputStreamSource source = getDevice().getScreenshot()) {
addTestLog("screenshot", LogDataType.PNG, source);
}
}
}
TestCase – обычный тест JUnit3
Если вы хотите получать отчетные показатели из Tradefed в обычном классе JUnit3 TestCase, его нужно преобразовать в MetricTestCase. Это тот же класс, но с дополнительным методом: addTestMetric(String key, String value).
DeviceJUnit4ClassRunner – стиль JUnit4
Если ваш тест в стиле JUnit4 выполняется с помощью DeviceJUnit4ClassRunner, вы также можете регистрировать показатели в тестовом случае (внутри @Test), чтобы они были включены в отчет Tradefed. Для создания отчетов по показателям вам потребуется использовать TestMetrics правил.
Пример:
@RunWith(DeviceJUnit4ClassRunner.class)
public static class Junit4TestClass {
@Rule
public TestMetrics metrics = new TestMetrics();
@Test
public void testPass5() {
// test log through the rule.
metrics.addTestMetric("key", "value");
}
@Test
public void testPass6() {
metrics.addTestMetric("key2", "value2");
}
}
Чтобы сообщить о файлах, используйте правило TestLogData.
Пример:
@RunWith(DeviceJUnit4ClassRunner.class)
public static class Junit4TestClass {
@Rule
public TestLogData logs = new TestLogData();
@Test
public void testPass5() {
// test log through the rule.
try (InputStreamSource source = getDevice().getScreenshot()) {
logs.addTestLog("screenshot", LogDataType.PNG, source);
}
}
}
IRemoteTest – чистый тест Tradefed
Если вы пишете собственный класс или средство запуска Tradefed Test, вам нужно реализовать IRemoteTest и получить ITestInvocationListener с помощью метода run(). Этот прослушиватель можно использовать для регистрации показателей следующим образом:
listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);
Сборщики показателей Tradefed
В Tradefed есть специальный объект metrics_collector, который собирает показатели параллельно с тестами.
Со стороны организатора
BaseDeviceMetricCollector можно реализовать для сбора любых показателей на стороне хоста и их передачи в рамках вызова теста. Для разных вариантов использования уже доступно множество универсальных коллекторов, но мы всегда рады новым.
Чтобы указать сборщик, который будет использоваться при вызове Tradefed, вам просто нужно добавить объект в конфигурацию Tradefed XML:
Пример:
<metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
<option name="categories" value="freq"/>
</metrics_collector>
Вот некоторые из существующих коллекторов: * TemperatureCollector, который периодически собирает данные о температуре во время тестового запуска. * AtraceCollector, который собирает данные с помощью команды atrace для каждого тестового случая.
На стороне устройства
При выполнении тестов на устройстве (Instrumentations, UIAutomator и т. д.) сбор данных на хосте в асинхронном режиме может быть не самым лучшим вариантом. Например, скриншот, сделанный асинхронно, скорее всего, не будет содержать нужный экран и окажется бесполезным.
Для этого существует версия наших коллекторов, которая работает на устройстве и может использоваться в любом инструменте AndroidJUnitRunner. BaseMetricListener можно реализовать, чтобы автоматически создавать отчеты о показателях, которые собираются способом, полностью совместимым с конвейером отчетов Tradefed.
Если вы используете средство запуска AndroidJUnitTest из Tradefed, то можете просто указать следующий параметр командной строки, чтобы коллектор работал вместе с тестами:
--device-listeners android.device.collectors.ScreenshotListener
ВНИМАНИЕ! Чтобы классы сборщиков были разрешены во время выполнения, вам, скорее всего, потребуется статически включить их в APK инструментария, добавив в файл makefile следующее:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
Мы также приветствуем вклад в сборщики на стороне устройства.
Особые условия для люксов
Для наборов тестов, таких как CTS, у которых есть конфигурация верхнего уровня, запускающая некоторые конфигурации модулей, нет необходимости указывать metrics_collector в каждой конфигурации модуля (AndroidTest.xml). На самом деле это запрещено.
Чтобы сбор показателей применялся ко всем модулям одинаково, только конфигурация верхнего уровня (например, cts.xml) может указывать metrics_collector, как описано выше. Эти сборщики будут применены и запущены
для каждого модуля набора.
Как собрать файлы журналов устройства из модуля
Настройка позволяет устройству уведомлять о том, что нужно собрать некоторые файлы.
AndroidTest.xml может указать сборщик, который будет искать файлы на устройстве и извлекать их.
<metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
<!-- repeatable: Pattern of key of a FILE we listen on that should be pulled -->
<option name = "pull-pattern-keys" value = "ScreenshotListener_.*" />
<!-- repeatable: The key of the DIRECTORY to pull -->
<option name = "directory-keys" value = "<example-key: /sdcard/atrace_logs>" />
</metrics_collector>
Если сборщик обнаружит ключ, он попытается извлечь и зарегистрировать связанный файл.
Чтобы эти ключи были сгенерированы, в тесте на стороне устройства (инструментальном) должен быть указан файл, который нужно зарегистрировать. Это делается так же, как и на стороне хоста (описано выше).
- Добавьте
collector-device-libв тестовый APK-файл в make-файлах:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
- Используйте предоставленное нами правило @rule для регистрации файлов журнала:
@RunWith(AndroidJUnit4.class)
public static class Junit4TestClass {
@Rule
public TestLogData logs = new TestLogData();
@Test
public void testPass5() {
// test log through the rule.
File logFile = new File("whatever");
logs.addTestLog("KEY", logFile);
}
}
В примере выше KEY – это название, под которым файл будет указан в отчете. Это название должно совпадать с названием в FilePullerDeviceMetricCollector, чтобы оно автоматически подтягивалось. Название должно быть уникальным.
ПРИМЕЧАНИЕ. После того как файл будет извлечен, FilePullerDeviceMetricCollector автоматически удалит его с устройства.
Где найти показатели?
Это зависит от значения result_reporter, указанного в конфигурации XML.