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.

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:

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:

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:

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
VtsDeviceInfoCollectorhedef hazırlayıcı bulunur. - 2. cihazda, ana makine tarafından yönlendirilen bir grup ilgili dosyayı cihaza gönderen ek bir
FilePusherhazı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')