Tradefed 테스트에서 측정항목 또는 데이터를 보고하는 방법

이 페이지에서는 Tradefed에서 테스트를 작성할 때 보고서 측정항목과 테스트 결과를 함께 보고하는 방법에 대해 설명합니다.

Tradefed 파이프라인을 통한 로깅으로 얻을 수 있는 이점은 측정항목을 기능 결과와 함께 찾을 수 있다는 것입니다. 측정항목 로깅은 테스트 내에서 자연스럽게 수행 가능하며, 덕분에 테스트작성자는 더 많은 계측을 편리하게 추가할 수 있습니다.

DeviceTestCase - JUnit3 형식

테스트가 JUnit3 형식의 테스트 유형에서 DeviceTestCase를 확장하는 경우에는 테스트 사례 내에서 메서드 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 테스트

일반 JUnit3 TestCase 사례에서 Tradefed 내의 측정항목을 보고하고 싶은 경우 추가 메서드 addTestMetric(String key, String value)을 포함하는 동일한 클래스인 MetricTestCase로 이를 변환해야 합니다.

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 테스트 클래스 또는 실행기를 자체적으로 작성 중인 경우 run() 메서드를 통해 IRemoteTest를 구현하고 ITestInvocationListener를 가져오게 됩니다. 이 리스너는 다음과 같이 측정항목을 로깅하는 데 사용할 수 있습니다.

    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'를 사용하여 수집합니다.

기기 측

기기 측 테스트(Instrumentations, UIAutomator 테스트 등)를 실행하는 경우에는 수집기가 호스트 측에서 비동기식으로 수집하도록 하는 것이 좋지 않을 수도 있습니다. 예를 들어 비동기식으로 캡처한 스크린샷은 원하는 화면을 놓칠 가능성이 높으므로 소용이 없습니다.

이러한 사용 사례를 충족하기 위해서는 Google 수집기의 기기 측 버전이 존재해야 하며, 모든 'AndroidJUnitRunner' 계측에 이를 사용할 수 있어야 합니다. BaseMetricListener를 구현하면 Tradefed 보고 파이프라인과 온전히 호환되는 방식으로 수집된 측정항목을 자동으로 보고할 수 있습니다.

Tradefed의 'AndroidJUnitTest'를 사용 중인 경우에는 다음과 같은 명령줄 옵션을 지정하여 수집기가 테스트와 함께 실행되도록 하기만 하면 됩니다.

  --device-listeners android.device.collectors.ScreenshotListener
    

주의: 수집기 클래스가 런타임 시점에 리졸브되기 위해서는 구현 APK가 makefile에 다음을 추가하여 클래스를 전략적으로 포함해야 할 가능성이 가장 높습니다.

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
    

기기 측 수집기에 대한 기여도 환영입니다.

도구 모음에 관한 특별한 고려사항

몇몇 모듈 구성을 실행 중인 최상위 구성을 보유한 CTS 등의 도구 모음은 각 모듈 구성(AndroidTest.xml)에 metrics_collector를 지정할 필요가 없습니다. 실제로 이는 금지되어 있습니다.

측정항목 수집을 각 모듈에 동일하게 적용할 수 있도록 상위 구성(예: 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. makefile의 테스트 APK에 collector-device-lib를 추가합니다.
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
    
  1. Google에서 제공하는 @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는 자동으로 파일을 기기에서 정리합니다.

측정항목 위치

XML 구성에 지정된 result_reporter에 따라 다릅니다.