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 mevcut 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ı ikilileri daha sonra, özellikle çalıştırılmaması istenmediğ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 çeşitli cihazlar olabilir:
- Tek cihazlı hedef 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ın seri numarasını alabilirsiniz.
- Belirli bir cihazda hazırlama ve temizleme görevlerini çalıştırma.
- Çeşitli cihaz 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ı tamamladıktan sonra test modüllerine cihaz listesi gönderilir. Her çeşitli cihazlar 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: Sunucu tarafında aracı tabanlı testler
Cihazda VTS aracılarını kullanmak yerine, ana makine tarafındaki bir test kendi aracısını (uygulama veya ikili program) 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 Next Billion User testleri, ana makine tarafında, uygulamaya dayalı ve çeşitli cihaz testleridir.
3. Tür: Hedef tarafı HIDL testleri
Hedef tarafındaki çeşitli cihaz HIDL testleri, tüm test mantığını cihaz tarafındaki test ikili programlarına yerleştirir. Bu nedenle, testlerin test işlemi sırasında cihazları senkronize etmesi gerekir:

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: Çeşitli cihazlar 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 aktaran 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ı çeşitli cihazlar örneği 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')