Çoklu cihaz testi

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

Mimari

VTS, cihaz seri numaralarını almak ve test modüllerine iletmek için TradeFed çerçevesini kullanır.

Şekil 1. VTS'nin cihaz seri numaralarını iletmesi.

Cihaz sayısı ve cihaz türleri gibi cihaz gereksinimleri, test planı yapılandırmasında belirtilir. Örneğin, Sailfish derleme hedefleri olan iki Android cihaz gerektiren bir test planı belirtebilirsiniz.

Cihaz ataması

Test altyapısı (genellikle test planlayıcısı), test planı yapılandırmasında belirtilen koşulları karşılayan mevcut cihazları VTS çerçevesine ayırır. Atanan cihazlar, test modülü tarafından kullanılmasa bile test planı için ayrılır. Ardından, VTS aracısı ikili dosyaları, ayrılan tüm cihazlara gönderilir ve çalıştırılır (çalıştırılmaması gerektiği özel olarak belirtilmediği sürece). Bu sayede, kabuk komutları ve HAL RPC'leri için TCP bağlantıları, test komut dosyasındaki tüm cihazlar tarafından kullanılabilir.

Test hazırlayanlar

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

  • Tek cihazlı hedef hazırlayıcılar (örnek: VtsDeviceInfoCollector):
    • Yalnızca test planı yapılandırmasında gerekli cihaz listesiyle belirtilebilir (sonraki sürümlerde modül düzeyinde yapılandırmaya izin verilecektir).
    • Yalnızca bir cihaz seri numarası alın.
    • Belirli bir cihazda hazırlama ve temizleme görevlerini çalıştırın.
  • Çok cihazlı hedef hazırlayıcılar (örnek: VtsPythonVirtualenvPreparer):
    • Test planı yapılandırmasında veya test modülü yapılandırmasında belirtilebilir
    • Tüm cihaz seri numaralarını alma
    • Her cihaz veya tüm cihazlar için hazırlık ve temizleme görevlerini çalıştırın.

Test modülleri

Test hazırlayıcıları ana makineyi/cihazları kurmayı tamamladıktan sonra test modülleri cihazların listesini alır. Her çok cihazlı test modülü için bir ana makine tarafı Python test modülü çalıştırılır. Ayrılan Android cihazlara Python test modüllerinden AndroidDevice nesnelerinin 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 ayrılan tüm cihazlar test planı için ayrılır.

Test sırasında cihaz iletişimi

Etkili çoklu Android testleri, ayrılan cihazlar arasındaki iletişimi içerir. Bu tür testleri geliştirirken, ayrılan cihazlar arasında nasıl iletişim kurulacağını belirlemeniz gerekir. Aşağıdaki bölümlerde üç iletişim örneği verilmiştir (ancak test geliştiricileri başka modeller tasarlayabilir).

1. Tür: Ana makine tarafında HAL testleri

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

Şekil 2. Barındıran taraflı HAL testi.

Bu senaryoda:

  • Test mantığı ana makinede yürütülür.
  • Ana makine tarafındaki test komut dosyası, her cihazdaki sürücülere RPC çağrıları gönderir.
  • Ana makine tarafı, cihaz etkileşimlerini koordine eder.

2. Tür: Ana makine tarafında temsilci tabanlı testler

Ana makine tarafındaki testler, cihazda VTS aracıları kullanmak yerine her cihaza kendi aracısını (uygulama veya ikili) de gönderebilir:

Şekil 3. Ana makine tarafında, temsilciye dayalı test.

Bu senaryoda:

  • Test mantığı ana makinede yürütülür.
  • Temsilci uygulaması (veya ikili dosya) her cihaza yüklenir.
  • Barındırıcı taraflı test komut dosyası, her cihazdaki uygulamalara komut verir.
  • Ana makine tarafı, cihaz etkileşimlerini koordine eder.

Örneğin, mevcut VTS deposundaki Next Billion User testleri, barındırıcı tarafında, uygulama tabanlı, çok cihazlı testlerdir.

3. Tür: Hedef taraflı HIDL testleri

Hedef taraflı, çok cihazlı HIDL testleri tüm test mantığını cihaz taraflı test ikililerine yerleştirir. Bu da testlerin, test yürütülürken cihazları senkronize etmesini gerektirir:

Şekil 4. Hedefe dayalı HIDL testi.

Bu senaryoda:

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

Örnek: Çok cihazlı test planı

Bu örnekte, iki cihaz için yapılandırma belirtilmiştir:

  • 1. cihazda bir derleme sağlayıcı ve VtsDeviceInfoCollector hedef hazırlayıcı bulunur.
  • 2. cihaz, ana makine tarafından yönlendirilen bir grup dosyayı 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: Barındıran taraflı Python test komut dosyası

Test hazırlayıcılar hakkında ayrıntılı bilgi ve örnekler için Test hazırlayıcılar başlıklı makaleyi inceleyin. Ana makine tarafında birden fazla cihazla ilgili tam bir örnek için hello_world_multicodelab'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')