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テスト

Tradefed内のメトリックを通常のJUnit3TestCaseクラスからレポートする場合は、代わりにMetricTestCaseに変換する必要があります。これは、 addTestMetric(String key, String value)という追加のメソッドを使用したまったく同じクラスです。

DeviceJUnit4ClassRunner-JUnit4スタイル

JUnit4スタイルのテストがDeviceJUnit4ClassRunnerで実行されている場合は、Tradefedによって報告されるテストケース(@Test内)内のメトリックをログに記録することもできます。メトリックをレポートするには、 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テスト

独自のTradefedTestクラスまたはランナーを作成している場合は、IRemoteTestをITestInvocationListenerし、 run()メソッドを介してITestInvocationListenerを取得します。このリスナーは、次のようにメトリックをログに記録するために使用できます。

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

Tradefedメトリクスコレクター

Tradefedは、テストと並行してメトリックを収集するための専用のmetrics_collectorオブジェクトを提供します。

ホスト側

BaseDeviceMetricCollectorを実装して、ホスト側からメトリックを収集し、テスト呼び出しの一部としてレポートすることができます。さまざまなユースケースですでに多くの汎用コレクターが利用可能ですが、常に新しい貢献を歓迎します。

Tradefed呼び出しで使用するコレクターを指定するには、TradefedXML構成にオブジェクトを追加するだけです。

例:

  <metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
      <option name="categories" value="freq"/>
  </metrics_collector>

現在存在するコレクターの一部:*テスト実行中に定期的に温度を収集するTemperatureCollector 。 *テストケースごとに「atrace」を使用して収集するAtraceCollector

デバイス側

デバイス側のテスト(機器、UIAutomatorテストなど)を実行する場合、ホスト側に非同期で収集するコレクターを配置することは理想的ではない場合があります。たとえば、非同期で撮影されたスクリーンショットは、必要な画面を見逃して役に立たない可能性があります。

これらのユースケースを満たすために、コレクターのデバイス側バージョンが存在し、任意の「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. makeファイルのテストAPKにcollector-device-libを追加します。
  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は自動的にデバイスからファイルを削除します。

メトリックはどこにありますか?

これは、XML構成で指定されたresult_reporterによって異なります。