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.
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:
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:
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:
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')