Çoklu cihaz testi

VTS, birden fazla Android cihazı arasında etkileşim gerektiren testleri destekler.

Mimari

VTS, cihaz serilerini alıp test modüllerine iletmek için TradeFed çerçevesini kullanır.

Şekil 1. VTS geçiş cihazı serileri.

Cihaz sayısı ve cihaz türü gibi cihaz gereksinimleri, test planı konfigürasyonunda belirtilir. Örneğin, Sailfish oluşturma hedeflerine sahip iki Android cihazı gerektiren bir test planı belirtebilirsiniz.

Cihaz tahsisi

Test altyapısı (genellikle test planlayıcısı), test planı yapılandırmasında belirtilen gereksinimleri karşılayan mevcut cihazları VTS çerçevesine tahsis eder. Tahsis edilen cihazlar, test modülü bunları kullanmıyor olsa bile test planı için ayrılır. VTS aracısı ikili dosyaları daha sonra tahsis edilen tüm cihazlara gönderilir ve bu cihazlarda çalıştırılır (özellikle çalıştırılmaması talimatı verilmediği sürece). Bu, kabuk komutlarına ve HAL RPC'lere yönelik TCP bağlantılarının bir test komut dosyasındaki tüm cihazlar için kullanılabilir olmasını sağlar.

Test hazırlayıcıları

Çerçeve, seri numaralarını aldığı tüm cihazlar için test hazırlayıcılarını çalıştırır. Hedef hazırlayıcılar tek veya çok cihazlı olabilir:

  • Tek cihazlı hedef hazırlayıcılar ( VtsDeviceInfoCollector örneğinde):
    • Yalnızca gerekli cihaz listesiyle test planı konfigürasyonunda belirtilebilir (gelecekteki sürümler modül düzeyinde konfigürasyona izin verecektir).
    • Yalnızca bir cihaz serisini alın.
    • Belirli bir cihazda hazırlama ve temizleme görevlerini çalıştırın.
  • Çoklu cihaz hedef hazırlayıcıları ( VtsPythonVirtualenvPreparer örneğinde):
    • Test planı konfigürasyonunda veya test modülü konfigürasyonunda belirtilebilir
    • Tüm cihaz serilerini alın
    • Her cihaz veya tüm cihazlar için hazırlama ve temizleme görevlerini çalıştırın.

Test modülleri

Test hazırlayıcıları ana bilgisayarı/cihazları kurmayı tamamladıktan sonra test modülleri cihazların bir listesini alır. Her çoklu cihaz test modülü için bir ana bilgisayar tarafı Python test modülü çalışır. Tahsis edilen Android cihazlara Python test modüllerinden AndroidDevice nesnelerinin bir listesi olarak erişilebilir:

devices = self.android_devices
device1 = devices[0]
device1_serial = device1.serial

Plandaki bir test modülü yalnızca bir cihaz kullanıyor olsa bile, tahsis edilen tüm cihazlar test planı için ayrılmıştır.

Test sırasında cihaz iletişimi

Etkili çoklu Android testleri, tahsis edilen cihazlar arasındaki iletişimi içerir. Bu tür testleri geliştirirken tahsis edilen cihazlar arasında iletişimin nasıl kurulacağını belirlemelisiniz. Aşağıdaki bölümlerde üç iletişim örneği verilmektedir (ancak test geliştiricileri başka modeller tasarlamakta özgürdür).

Tip 1: Ana bilgisayar tarafı HAL testleri

Ana bilgisayar tarafı HAL testleri, varsayılan olarak cihazlara gönderilen VTS HAL sürücülerini kullanabilir:

Şekil 2. Ana bilgisayar tarafı HAL testi.

Bu senaryoda:

  • Test mantığı ana bilgisayarda yürütülür.
  • Ana bilgisayar tarafı test komut dosyası, her aygıttaki sürücülere RPC çağrıları yayınlar.
  • Ana bilgisayar tarafı cihaz etkileşimlerini koordine eder.

Tip 2: Ana bilgisayar tarafı aracı tabanlı testler

Ana bilgisayar tarafı testi, cihazda VTS aracılarını kullanmak yerine kendi aracısını (uygulama veya ikili dosya) her cihaza da gönderebilir:

Şekil 3. Ana bilgisayar tarafı, aracı tabanlı test.

Bu senaryoda:

  • Test mantığı ana bilgisayarda yürütülür.
  • Aracı uygulaması (veya ikili dosya) her cihaza yüklenir.
  • Ana bilgisayar tarafı test komut dosyası, her cihazdaki uygulamalara komutlar verir.
  • Ana bilgisayar tarafı cihaz etkileşimlerini koordine eder.

Örneğin, mevcut VTS deposundaki Sonraki Milyar Kullanıcı testleri ana bilgisayar tarafı, uygulama tabanlı, çoklu cihaz testleridir.

Tip 3: Hedef taraftaki HIDL testleri

Hedef tarafı, çok cihazlı HIDL testleri, tüm test mantığını cihaz tarafındaki test ikili dosyalarına yerleştirir; bu, testlerin, test yürütme sırasında cihazları senkronize etmesini gerektirir:

Şekil 4. Hedefe dayalı HIDL testi.

Bu senaryoda:

  • Test mantığı cihazlarda yürütülür.
  • Ana bilgisayar tarafı çerçevesi, ilk cihaz tanımlamasını sağlar.
  • Hedef tarafı test ikili dosyası senkronizasyon gerektirir:
    • Tüm cihazlar için aynı test ikili dosyası.
    • Her rol için farklı test ikili dosyaları.

Örnek: Çoklu cihaz test planı

Bu örnek, iki cihazın yapılandırmasını belirtir:

  • Cihaz 1, bir yapı sağlayıcısı ve VtsDeviceInfoCollector hedef hazırlayıcısını içerir.
  • Cihaz 2, ana bilgisayar tarafından yönlendirilen ilgili dosyaların bir grubunu cihaza gönderen ek bir FilePusher hazırlayıcı içerir.
<configuration description="VTS Codelab Plan">
  ...
<device name="device1">
<build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
<target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" />
</device>
<device name="device2" >
<build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
<target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" />
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
<option name="push-group" value="HostDrivenTest.push" />
</target_preparer>
</device>
<option name="compatibility:include-filter" value="VtsCodelabHelloWorldMultiDeviceTest" />
</configuration>

Örnek: Ana bilgisayar tarafı Python test komut dosyası

Test hazırlayıcılarına ilişkin ayrıntılar ve örnekler için bkz. Test hazırlayıcıları . Ana bilgisayar tarafındaki çoklu cihaz örneğinin tamamı için hello_world_multi codelab'e bakın.

def setUpClass(self):
logging.info('number of device: %s', self.android_devices)
asserts.assertEqual(len(self.android_devices), 2, 'number of device is wrong.')
self.dut1 = self.android_devices[0]
self.dut2 = self.android_devices[1]
self.shell1 = self.dut1.shell
self.shell2 = self.dut2.shell

def testSerialNotEqual(self):
'''Checks serial number from two device not being equal.'''
command = 'getprop | grep ro.serial'
res1 = self.shell1.Execute(command)
res2 = self.shell2.Execute(command)

def getSerialFromShellOutput(output):
'''Get serial from getprop query'''
return output[const.STDOUT][0].strip().split(' ')[-1][1:-1]
serial1 = getSerialFromShellOutput(res1)
serial2 = getSerialFromShellOutput(res2)

logging.info('Serial number of device 1 shell output: %s', serial1)
logging.info('Serial number of device 2 shell output: %s', serial2)
asserts.assertNotEqual(serial1, serial2, 'serials from two devices should not be the same')
asserts.assertEqual(serial1, self.dut1.serial, 'serial got from device system property is different from allocated serial')
asserts.assertEqual(serial2, self.dut2.serial, 'serial got from device system property is different from allocated serial')