Отчет о показателях или данных теста 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>

Некоторые существующие на данный момент коллекторы: * ТемператураКоллектор , который периодически собирает температуру во время тестового запуска. * AtraceCollector , который собирает данные с помощью atrace для каждого тестового примера.

Со стороны устройства

При выполнении тестов на стороне устройства (инструменты, тесты 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 ). На самом деле это запрещено.

Чтобы гарантировать, что сбор метрик одинаково применяется к каждому модулю, только конфигурация верхнего уровня (например, 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>

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

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

  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.