Trade Federation'da ana makine odaklı test yazma

Bu sayfada, ana makine tarafından yönlendirilen JUnit4 tarzı bir cihaz testinin nasıl yazılacağı açıklanmaktadır. Bu, kablo demeti ana makine tarafının cihaza yönelik işlemleri tetikleyeceği anlamına gelir.

"Ana makine taraflı" testleri ve "ana makine odaklı" testleri biraz farklı kabul ettiğimizi unutmayın:

  • Ana makine tarafından yönlendirilen test: Ana makinede çalışan ve bir veya daha fazla cihazla etkileşime geçen bir testtir. Test edilen sistem (SUT), ana makinede değil ancak ana makineden test edilmektedir.
  • Ana makine tarafında test: Yalnızca 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ısınız?

Bazı testler, cihazın genel durumunu etkilemenizi (ör. yeniden başlatma komutu gönderme) gerektirebilir. Enstrümantasyon test durumunda, yeniden başlatma enstrümantasyonu sonlandırır, test devam edemez ve sonuç alınamaz.

Barındıran tarafından yürütülen testler, testin bağlı olduğu harici cihazlarla etkileşim gerektiren ek kurulum adımlarını da tetikleyebilir.

Ana makine tarafından yönlendirilen testler bu kullanım alanlarını ele alabilir ve cihazın daha fazla senaryoda ileri seviye test edilmesine olanak tanıyabilir. Bu durumda, barındırıcı odaklı bir test yazmak en mantıklı seçenektir.

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

Aşağıda örneği 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 tarafından yürütülen testler, DeviceJUnit4ClassRunner JUnit4 test çalıştırıcı 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ğıdakiler gibi yararlı test yardımcı programları API'sini devralmanın bir yoludur:

  • installPackage: Hedef cihaza APK yüklemenize olanak tanır.
  • installPackageAsUser: Hedef cihazda kullanıcı olarak APK yüklemenize olanak tanır.
  • uninstallPackage: APK'ların kaldırılmasına olanak tanır.
  • 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 parametresini kullanarak bir hedef cihaza karşı bir enstrümantasyon testi çalıştırın.

Tradefed cihaz nesnesine de erişim izni verin:

  • 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 ç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, cihaza özgü, sınıf başına tek seferlik kurulum veya temizleme işlemleri yapmak için #getDevice() işleyicisini kullanmak mümkün değildir. Bu sorunu çözmek için Tradefed ek açıklamaları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ı ve statik veya statik olmayan kapsamda kullanılabilen mülkleri kullanmanıza olanak tanır. BaseHostJUnit4Test, TestInformation değerini #getTestInformation() aracılığıyla statik olmayan bir kapsamda almayı destekler.

BaseHostJUnit4Test'ü genişletmiyorsanız TestInformation nesnesini almak için ITestInformationReceiver'ü uygulayabilirsiniz.

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

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

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