撰寫商業聯盟的主機驅動測試

本頁面說明如何編寫由主機驅動的 JUnit4 風格裝置測試。也就是說,套件的主機端會觸發針對裝置的動作。

請注意,我們認為「主機端」測試和「主機驅動」測試略有不同:

  • 主機導向測試:在主機上執行的測試,可與一或多部裝置互動。測試系統 (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 針對目標裝置執行檢測設備測試,以便處理所有可能的選項。

同時提供換購裝置物件的存取權:

  • getDevice():傳回 TF 裝置物件,用於操控裝置。
  • getBuild():傳回 BuildInfo TF 物件,以便取得建構相關資訊。
  • getAbi():傳回測試執行的 ABI。

Tradefed 支援:依類別準備及清理裝置

JUnit4 @BeforeClass@AfterClass 僅適用於靜態方法,因此無法使用 #getDevice() 處理常式,針對每個類別執行某些裝置專屬的一次性設定或清理作業。如要解決這個問題,請使用 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>