Trade Federation でホストドリブン テストを作成する

このページでは、ホストによって行われる JUnit4 スタイルのデバイステストを作成する方法について説明します。つまり、ハーネスのホスト側がデバイスに対してアクションをトリガーします。

なお、「ホスト側」テストと「ホストドリブン」テストは若干異なります。

  • ホストドリブン テスト: 1 つまたは複数のデバイスと通信するホストで実行されるテスト。テスト中のシステム(SUT)はホスト自体には存在しませんが、ホストからテストされています。
  • ホスト側テスト: 純粋にホスト上で実行されるテスト。テスト対象もホスト上のもののみになります(単体テストなど)。

インストゥルメンテーション テストではなくホストドリブン テストを作成する理由

テストによっては、再起動コマンドの発行など、デバイスの全体的な状態に影響を与える場合があります。インストゥルメンテーション テストの場合、再起動するとインストゥルメンテーションが終了し、テストを続行できず、結果も得られません。

ホストドリブン テストでは、テストが依存している外部デバイスとの通信を必要とする追加のセットアップ手順も実施できます。

ホストドリブン テストはこのようなユースケースを取り扱うことができ、より多くのシナリオでデバイスの高度なテストを実施できます。同じような状況であれば、ホストドリブン テストを作成する方が理にかなっています。

TF でホストドリブン テストを作成する方法

サンプルは次のとおりです。

@RunWith(DeviceJUnit4ClassRunner.class)
public class SampleHostJUnit4DeviceTest extends BaseHostJUnit4Test {
    @Before
    public void setUp() throws Exception {
       // Some setup
    }

    @Test
    public void testCheckWeHaveDevice() throws Exception {
        Assert.assertNotNull(getDevice());
    }
}

Trade Federation のホストドリブン テストは、DeviceJUnit4ClassRunner JUnit4 テストランナーによって行われます。テストクラスの全体的な構造は、通常の JUnit4 テストと同じです。

  • @BeforeClass
  • @Before
  • @Test
  • @After
  • @AfterClass
  • AssumeAssert

BaseHostJunit4Test を拡張すると、次のような便利なテスト ユーティリティ API を継承できます。

  • installPackage: ターゲット デバイスで APK をインストールできます。
  • installPackageAsUser: ターゲット デバイスでユーザーとして APK をインストールできます。
  • uninstallPackage: APK をアンインストールできます。
  • isPackageInstalled: パッケージがインストールされているかどうかを確認します。
  • hasDeviceFeature: デバイスが機能をサポートしているかどうかを確認します。 (pm list features
  • runDeviceTests(DeviceTestRunOptions options): DeviceTestRunOptions を使用して、ターゲット デバイスに対してインストゥルメンテーション テストを実行し、可能なオプションをすべて処理します。

Tradefed デバイス オブジェクトへのアクセスもできるようになります。

  • getDevice(): デバイスを操作する TF デバイス オブジェクトを返します。
  • getBuild(): ビルドに関する情報を取得するビルド情報 TF オブジェクトを返します。
  • getAbi(): テストの実行対象である ABI を返します。

Tradefed のサポート: クラスごとのデバイスの準備とクリーンアップ

JUnit4 の @BeforeClass@AfterClass は静的メソッドにのみ適用されるため、#getDevice() ハンドラを使用してデバイス固有で 1 回限りのクラスごとの設定やクリーンアップを実行することはできません。この問題を解決するには、Tradefed アノテーションを使用します。

  • @BeforeClassWithInfo: @BeforeClass アノテーションの前に実行
  • @AfterClassWithInfo: @AfterClass アノテーションの後に実行
   @BeforeClassWithInfo
   public static void beforeClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

   @AfterClassWithInfo
   public static void afterClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

TestInformation を使用すると、静的スコープと非静的スコープで使用できるデバイス プロパティとストア プロパティを使用できます。BaseHostJUnit4Test は、#getTestInformation() による非静的スコープでの TestInformation の取得をサポートしています。

BaseHostJUnit4Test を拡張していない場合、ITestInformationReceiver を実装すると TestInformation オブジェクトを受け取ることができます。

Tradefed でホストドリブン テストを設定する方法

Tradefed XML 設定ファイルでは、HostTest ランナーをによりホストドリブン テストが実行されます。

<test class="com.android.tradefed.testtype.HostTest" >
    <option name="class" value="android.sample.cts.SampleHostJUnit4DeviceTest" />
</test>