Отчет о показателях или данных теста Tradefed

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

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

Для генерации этих ключей необходимо, чтобы в ходе тестирования на стороне устройства (инструментации) был указан файл, в который следует записывать данные. Это делается аналогично тестированию на стороне хоста (описанному выше).

  1. Добавьте библиотеку collector-device-lib в ваш тестовый APK-файл в файле make:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Используйте предоставленное нами правило `@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-конфигурации.