Trade Federation에서 호스트 기반 테스트 작성

이 페이지에서는 호스트에 기반하는 JUnit4 형식의 기기 테스트를 작성하는 방법을 설명합니다. 즉, 하네스의 호스트 측에서 기기에 대한 작업을 트리거합니다.

Google은 '호스트 측' 테스트와 '호스트 기반' 테스트에 약간의 차이가 있다고 간주합니다.

  • 호스트 기반 테스트는 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
  • 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를 확장하지 않는 경우 TestInformation 객체를 수신하기 위해 ITestInformationReceiver를 구현할 수 있습니다.

Tradefed에서 호스트 기반 테스트를 구성하는 방법

Tradefed XML 구성 파일에서는 호스트 기반 테스트가 HostTest 실행기를 통해 실행됩니다.

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