На этой странице описывается, как сообщать показатели вместе с результатами тестирования при написании теста в 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, вам потребуется реализовать IRemoteTest и получить слушатель ITestInvocationListener
через метод run()
. Этот слушатель можно использовать для регистрации метрик следующим образом:
listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);
Сборщики метрик Tradefed
Tradefed предоставляет специальный объект metrics_collector
для сбора метрик параллельно с тестами.
На стороне хозяина
BaseDeviceMetricCollector можно реализовать для сбора любых метрик со стороны хоста и передачи их в рамках тестового вызова. Уже доступен ряд универсальных сборщиков для различных вариантов использования, но мы всегда рады новым предложениям.
Чтобы указать сборщик, который будет использоваться при вызове Tradefed, вам просто нужно добавить объект в XML-конфигурацию Tradefed:
Пример:
<metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
<option name="categories" value="freq"/>
</metrics_collector>
Некоторые существующие в настоящее время сборщики: * TemperatureCollector , который периодически собирает температуру во время тестового прогона. * AtraceCollector , который собирает данные с использованием 'atrace' для каждого тестового случая.
На стороне устройства
При запуске тестов на стороне устройства (тесты Instrumentation, UIAutomator и т. д.) наличие сборщика данных на стороне хоста, выполняющего асинхронный сбор данных, может быть неидеальным решением. Например, асинхронный снимок экрана, скорее всего, не попадёт на нужный экран и будет бесполезен.
Для решения этих задач существует версия наших сборщиков на стороне устройства, которую можно использовать в любом инструменте AndroidJUnitRunner. BaseMetricListener можно реализовать для автоматической отправки отчетов по метрикам, собранным способом, полностью совместимым с конвейером отчётности Tradefed.
Если вы используете сборщик AndroidJUnitTest от Tradefed, вы можете просто указать следующий параметр командной строки, чтобы ваш сборщик запустился вместе с вашими тестами:
--device-listeners android.device.collectors.ScreenshotListener
ВНИМАНИЕ: Чтобы классы сборщика были разрешены во время выполнения, ваш APK-файл инструментария, скорее всего, должен будет статически включить их, добавив в ваш make-файл следующее:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
Также приветствуются взносы в сборщики данных на стороне устройства.
Особое внимание к люксам
Для таких наборов, как CTS, имеющих конфигурацию верхнего уровня, запускающую некоторые конфигурации модулей, нет необходимости указывать metrics_collector
в конфигурации каждого модуля ( AndroidTest.xml
). Это фактически запрещено.
Чтобы обеспечить равномерное применение сбора метрик к каждому модулю, metrics_collector
можно указать только в конфигурации верхнего уровня (например, cts.xml
), как описано выше. Эти сборщики будут применяться и запускаться для каждого модуля пакета.
Собирайте файлы журналов устройства из модуля
Доступна настройка, позволяющая тесту на стороне устройства уведомлять о необходимости сбора некоторых файлов.
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-конфигурации.