Как сообщить о показателях или данных из теста 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 или бегун вы implemement IRemoteTest и получить ITestInvocationListener через run() метод. Этот слушатель можно использовать для регистрации показателей следующим образом:

    listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);

Сборщики метрик Tradefed

Tradefed предоставляет специальный metrics_collector объект для сбора метрик параллельно испытаний.

На стороне хозяина

BaseDeviceMetricCollector может быть реализован для сбора каких - либо показателей от принимающей стороны и сообщать о них в рамках тестового вызова. Ряд общих сборщиков уже доступен для различных вариантов использования, но мы всегда приветствуем новые предложения.

Чтобы указать сборщик, который будет использоваться при вызове Tradefed, вам просто нужно добавить объект в конфигурацию Tradefed XML:

Пример:

  <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 инструментария, скорее всего, должен будет статически включить их, добавив в ваш 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 в замыкающих файлах:
  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.