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

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

指標の場所

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