На этой странице описано, как отправлять метрики вместе с результатами тестов при написании тестов в 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' для каждого тестового случая.
Со стороны устройства
При выполнении тестов на стороне устройства (инструментарий, тесты 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 ). На самом деле это запрещено.
Чтобы обеспечить одинаковый сбор метрик для каждого модуля, 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-конфигурации.