Çoklu cihaz testi

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

Mimari

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

1. Şekil. VTS'nin geçtiği cihaz seri numaraları.

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

Cihaz ataması

Test altyapısı (genellikle test planlayıcı), test planı yapılandırmasında belirtilen koşulları karşılayan kullanılabilir cihazları VTS çerçevesine ayırır. Ayrılan cihazlar, test modülü bunları kullanmasa bile test planı için ayrılır. VTS aracısı ikili dosyaları daha sonra, özellikle çalıştırılmaması talimatı verilmediği sürece, ayrılan tüm cihazlara gönderilir ve bu cihazlarda çalıştırılır. Bu, kabuk komutları ve HAL RPC'leri için TCP bağlantılarının bir test komut dosyasındaki tüm cihazlarda kullanılabilmesini 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 cihaz hedefi hazırlayıcıları (örnek: VtsDeviceInfoCollector):
    • Yalnızca gerekli cihaz listesini içeren test planı yapılandırmasında belirtilebilir (gelecek sürümlerde modül düzeyinde yapılandırmaya izin verilecek).
    • Yalnızca bir cihaz seri numarası alırsınız.
    • Belirli bir cihazda hazırlama ve temizleme görevlerini çalıştırma.
  • Ç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ırlama ve temizleme görevlerini çalıştırın.

Test modülleri

Test hazırlayıcılar ana makineyi/cihazları kurmayı bitirdikten sonra test modülleri bir cihaz listesi 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

Plana 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ında iletişimi içerir. Bu tür testler geliştirirken ayrılan cihazlar arasında iletişimin nasıl kurulacağını belirlemeniz gerekir. Aşağıdaki bölümlerde üç iletişim örneği verilmiştir (ancak test geliştiriciler başka modeller de tasarlayabilir).

1. tür: Ana makine tarafı HAL testleri

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

Şekil 2. Ana makine tarafı 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 aracı tabanlı testler

Cihazda VTS aracıları kullanmak yerine, ana makine tarafındaki bir test kendi aracısını (uygulama veya ikili) her cihaza gönderebilir:

Şekil 3. Ana makine tarafında, aracı tabanlı test.

Bu senaryoda:

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

Örneğin, mevcut VTS deposundaki Sonraki Milyar Kullanıcı testleri, ana makine tarafında, uygulamaya dayalı ve çok cihazlı testlerdir.

3. Tür: Hedef tarafı HIDL testleri

Hedef tarafındaki çok cihazlı HIDL testleri, tüm test mantığını cihaz tarafındaki test ikililerine yerleştirir. Bu da 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 makine tarafındaki çerçeve, cihazın ilk tanımlanmasını sağlar.
  • Hedef taraftaki test ikili programının senkronize edilmesi gerekir:
    • Tüm cihazlar için aynı test ikilisi.
    • Her rol için farklı test ikilileri.

Örnek: Çok cihazlı test planı

Bu örnekte iki cihazın yapılandırması belirtilmektedir:

  • 1. cihazda bir derleme sağlayıcı ve VtsDeviceInfoCollector hedef hazırlayıcı bulunur.
  • 2. cihazda, ana makine tarafından yönlendirilen bir grup ilgili dosyayı cihaza gönderen ek bir FilePusher hazırlayıcı bulunur.
<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 makine tarafında Python test komut dosyası

Test hazırlayıcılarla ilgili ayrıntılar ve örnekler için Test hazırlayıcılar başlıklı makaleyi inceleyin. Tam bir ana makine tarafı çok cihazlı örnek 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')