在 Trade Federation 中編寫主機驅動的測試

本頁介紹如何撰寫由主機驅動的 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
  • Assume , Assert

擴充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()處理程序執行一些特定於裝置的、一次性的、按類別的設定或清理。若要解決此問題,請使用 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>