Ticaret Federasyonu'nda ana makineye dayalı 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.
  • Barındıran taraflı test: Yalnızca barındıran üzerinde çalışan ve yalnızca barındıran üzerinde 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.

Ana makineye dayalı testler, testin dayandığı harici cihazlarla etkileşim gerektiren ek kurulum adımları da gerektirebilir.

Barındıran 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. Böyle bir durumdaysanız ana makineye dayalı bir test yazmak en mantıklıdır.

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'yı kaldırmaya olanak tanır.
  • isPackageInstalled: Bir paketin yüklü olup olmadığını kontrol edin.
  • hasDeviceFeature: Cihazın bir özelliği destekleyip desteklemediğini kontrol edebilirsiniz. (pm list features)
  • runDeviceTests(DeviceTestRunOptions options): Olası tüm seçenekleri işlemek için DeviceTestRunOptions'ı kullanarak bir hedef cihaza karşı bir enstrümantasyon testi çalıştırın.

Tradefed cihaz nesnesine de erişim izni verin:

  • getDevice(): Cihazı çalıştırmak 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 odaklı 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>