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 内の指標を通常の JUnit3 TestCase クラスから報告する場合は、代わりに 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 テスト

独自の Tradefed テストクラスまたはランナーを作成する場合は、IRemoteTest を実装し、run() メソッドで 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。テストケースごとに「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 では、デバイス上のファイルを検索して pull するコレクタを指定できます。

  <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>

これらのパターンとキーを指定することで、コレクタはキーを検出すると、関連付けられたファイルを pull してログに記録しようとします。

このようなキーを生成するには、デバイス側のテスト(インストルメンテーション)でログに記録するファイルを指定する必要があります。これは、前述のホスト側と同様の方法で行われます。

  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 名は、ファイルが報告される名前です。これは、自動的に pull されるようにするために、FilePullerDeviceMetricCollector で一致させる必要がある名前です。一意の名前にする必要があります。

注: ファイルが pull されると、FilePullerDeviceMetricCollector が自動的にファイルをデバイスから削除します。

指標がある場所

XML 構成で指定した result_reporter によって異なります。