通商連合でホスト主導のテストを書く

このページでは、ホストによって駆動される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のホスト駆動型テストは、 DeviceJUnit4ClassRunnerJUnit4テストランナーによって駆動されます。テストクラスの全体的な構造は、通常のJUnit4テストと同じです。

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

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

  • installPackage :ターゲットデバイスにAPKをインストールできます。
  • installPackageAsUser :ターゲットデバイスにユーザーとしてAPKをインストールできます。
  • UninstallPackage:APKをアンuninstallPackageできます。
  • 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を拡張していない場合は、 TestInformationオブジェクトを受信するためにITestInformationReceiverを実装できます。

Tradefedでホスト駆動型テストを構成するにはどうすればよいですか?

Tradefed XML構成ファイルでは、ホスト駆動型テストはHostTestランナーを介して実行されます。

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