Как сообщить показатели или данные из теста 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 Test, вы должны реализовать 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' для каждого теста.

На стороне устройства

При выполнении тестов на стороне устройства (Instrumentations, тесты 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.