Trade Federation'da ana makine odaklı test yazma

Bu sayfada, ana makine tarafından çalıştırılan JUnit4 tarzı bir cihaz testinin nasıl yazılacağı açıklanmaktadır. Bu, koşumun ana tarafının cihaza karşı işlemleri tetikleyeceği anlamına gelir.

"Ana makine tarafı" testleri ile "ana makine odaklı" testlerin biraz farklı olduğunu unutmayın:

  • Ana makine odaklı test: Ana makinede çalışan ve bir veya daha fazla cihazla etkileşimde bulunan bir testtir. Test edilen sistem (SUT) ana makinede değil, ana makineden test ediliyor.
  • Ana makine tarafı testi: Tamamen ana makinede çalışan ve yalnızca ana makinede bir şeyi test eden bir testtir (ör. birim testleri).

Neden araç testi yerine ana makine odaklı test oluşturmalıyım?

Bazı testlerde, cihazın genel durumunu etkilemeniz (ör. yeniden başlatma komutu verme) gerekebilir. Enstrümantasyon test durumunda yeniden başlatma işlemi enstrümantasyonu sonlandırır, test devam edemez ve sonuçlar kullanılamaz.

Sunucu tarafından yönlendirilen testler, testin bağlı olduğu harici cihazlarla etkileşim gerektiren ek kurulum adımlarına da yol açabilir.

Ana makine tarafından yönlendirilen bir test, bu kullanım alanlarını işleyebilir ve cihazın daha fazla senaryoyla gelişmiş şekilde test edilmesine olanak tanır. Bu durumda, sunucu odaklı bir test yazmak en mantıklı seçenektir.

TF'de ana makine odaklı testler nasıl yazılır?

Aşağıda bir örnek verilmiştir:

@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'daki ana makine odaklı testler, DeviceJUnit4ClassRunner JUnit4 test çalıştırıcısı tarafından yürütülür. Test sınıfının genel yapısı, normal bir JUnit4 testiyle aynıdır:

  • @BeforeClass
  • @Before
  • @Test
  • @After
  • @AfterClass
  • Assume, Assert

BaseHostJunit4Test'i genişletmek, aşağıdaki gibi yararlı test yardımcı programları API'sini devralmanın bir yoludur:

  • installPackage: Hedef cihaza APK yüklenmesine izin verir.
  • installPackageAsUser: Hedef cihazda APK'nın kullanıcı olarak yüklenmesine izin verir.
  • uninstallPackage: Bir APK'nın kaldırılmasına izin verir.
  • isPackageInstalled: Bir paketin yüklü olup olmadığını kontrol edin.
  • hasDeviceFeature: Cihazın bir özelliği destekleyip desteklemediğini kontrol edin. (pm list features)
  • runDeviceTests(DeviceTestRunOptions options): Olası tüm seçenekleri işlemek için DeviceTestRunOptions'ı kullanarak hedef cihaza karşı bir enstrümantasyon testi çalıştırın.

Ayrıca Tradefed cihaz nesnesine erişim de sağlayın:

  • getDevice(): Cihazı değiştirmek için bir TF cihaz nesnesi döndürür.
  • getBuild(): Derleme hakkında bilgi almak için bir derleme bilgisi TF nesnesi döndürür.
  • getAbi(): Testin üzerinde çalıştırıldığı ABI'yi döndürür.

Tradefed desteği: Sınıf başına cihaz hazırlama ve temizleme

JUnit4 @BeforeClass ve @AfterClass yalnızca statik yöntemler için geçerlidir. Bu nedenle, bazı cihaza özel, tek seferlik, sınıf başına kurulum veya temizleme işlemleri için #getDevice() işleyicisinin kullanılması mümkün değildir. Bu sorunu çözmek için Tradefed ek açıklamasını kullanın.

  • @BeforeClassWithInfo: @BeforeClass ek açıklamalarından önce çalışır.
  • @AfterClassWithInfo: @AfterClass ek açıklamalarından sonra çalışır.
   @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, cihazı kullanmanıza ve statik veya statik olmayan kapsamda kullanılabilen özellikleri depolamanıza olanak tanır. BaseHostJUnit4Test, #getTestInformation() aracılığıyla statik olmayan bir kapsamda TestInformation alınmasını destekler.

BaseHostJUnit4Test özelliğini genişletmiyorsanız TestInformation nesnesini almak için ITestInformationReceiver özelliğini uygulayabilirsiniz.

Tradefed'de ana makine tarafından yönlendirilen bir test nasıl yapılandırılır?

Tradefed XML yapılandırma dosyasında, ana makine tarafından yönlendirilen testler HostTest çalıştırıcısı aracılığıyla çalıştırılır.

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