VTS mendukung pengujian yang memerlukan interaksi antara beberapa perangkat Android.
Arsitektur
VTS menggunakan framework TradeFed untuk mendapatkan dan meneruskan serial perangkat untuk menguji modul.
Persyaratan perangkat, seperti jumlah perangkat dan jenis perangkat, ditentukan dalam konfigurasi rencana pengujian. Misalnya, Anda dapat menentukan rencana pengujian yang memerlukan dua perangkat Android dengan target build Sailfish.
Alokasi perangkat
Infrastruktur pengujian (biasanya penjadwal pengujian) mengalokasikan perangkat yang tersedia yang memenuhi persyaratan yang ditentukan dalam konfigurasi rencana pengujian ke framework VTS. Perangkat yang dialokasikan dicadangkan untuk rencana pengujian meskipun modul pengujian tidak menggunakannya. Biner agen VTS kemudian didorong ke dan dijalankan di semua perangkat yang dialokasikan (kecuali jika secara khusus diperintahkan untuk tidak dijalankan). Tindakan ini memastikan bahwa koneksi TCP untuk perintah shell dan HAL RPC tersedia untuk semua perangkat dalam skrip pengujian.
Persiapan pengujian
Framework menjalankan penyiapan pengujian untuk semua perangkat yang menerima nomor seri. Penyiapan target dapat berupa satu atau beberapa perangkat:
- Penyiapan target perangkat tunggal (contoh di
VtsDeviceInfoCollector):
- Hanya dapat ditentukan dalam konfigurasi rencana pengujian dengan daftar perangkat yang diperlukan (versi mendatang akan mengizinkan konfigurasi tingkat modul).
- Hanya menerima satu serial perangkat.
- Menjalankan tugas persiapan dan pembersihan terhadap perangkat tertentu.
- Penyiapan target multi-perangkat (contoh di
VtsPythonVirtualenvPreparer):
- Dapat ditentukan dalam konfigurasi rencana pengujian atau konfigurasi modul pengujian
- Menerima semua serial perangkat
- Jalankan tugas persiapan dan pembersihan untuk setiap perangkat atau semua perangkat.
Modul pengujian
Modul pengujian mendapatkan daftar perangkat setelah penyiapan pengujian selesai menyiapkan host/perangkat. Satu modul pengujian Python sisi host berjalan untuk setiap modul pengujian multi-perangkat. Perangkat Android yang dialokasikan dapat diakses dari modul pengujian Python sebagai daftar objek AndroidDevice:
devices = self.android_devices device1 = devices[0] device1_serial = device1.serial
Semua perangkat yang dialokasikan dicadangkan untuk rencana pengujian, meskipun modul pengujian dalam rencana hanya menggunakan satu perangkat.
Komunikasi perangkat selama pengujian
Pengujian multi-Android yang efektif melibatkan komunikasi antar-perangkat yang dialokasikan. Saat mengembangkan pengujian tersebut, Anda harus menentukan cara membangun komunikasi antara perangkat yang dialokasikan. Bagian berikut memberikan tiga contoh komunikasi (tetapi, developer pengujian bebas mendesain model lain).
Jenis 1: Pengujian HAL sisi host
Pengujian HAL sisi host dapat menggunakan driver HAL VTS yang didorong ke perangkat secara default:
Dalam skenario ini:
- Logika pengujian dijalankan di host.
- Skrip pengujian sisi host mengeluarkan panggilan RPC ke driver di setiap perangkat.
- Sisi host mengoordinasikan interaksi perangkat.
Jenis 2: Pengujian berbasis agen sisi host
Daripada menggunakan agen VTS di perangkat, pengujian sisi host juga dapat mengirim agennya sendiri (aplikasi atau biner) ke setiap perangkat:
Dalam skenario ini:
- Logika pengujian dijalankan di host.
- Aplikasi agen (atau biner) diinstal di setiap perangkat.
- Skrip pengujian sisi host mengeluarkan perintah ke aplikasi di setiap perangkat.
- Sisi host mengoordinasikan interaksi perangkat.
Misalnya, Pengujian Billion User Berikutnya di repo VTS saat ini adalah pengujian multi-perangkat berbasis aplikasi di sisi host.
Jenis 3: Pengujian HIDL sisi target
Pengujian HIDL multiperangkat sisi target menempatkan semua logika pengujian pada biner pengujian sisi perangkat, yang mengharuskan pengujian untuk menyinkronkan perangkat selama eksekusi pengujian:
Dalam skenario ini:
- Logika pengujian dijalankan di perangkat.
- Framework sisi host memberikan identifikasi perangkat awal.
- Biner pengujian sisi target memerlukan sinkronisasi:
- Biner pengujian yang sama untuk semua perangkat.
- Biner pengujian yang berbeda untuk setiap peran.
Contoh: Rencana pengujian multiperangkat
Contoh ini menentukan konfigurasi untuk dua perangkat:
- Perangkat 1 menyertakan penyedia build dan
penyiapan target
VtsDeviceInfoCollector
. - Perangkat 2 menyertakan penyiapan
FilePusher
tambahan yang mendorong sekelompok file terkait yang didorong host ke perangkat.
<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>
Contoh: Skrip pengujian Python sisi host
Untuk mengetahui detail dan contoh tentang penyiapan pengujian, lihat Penyiapan pengujian. Untuk contoh multi-perangkat sisi host lengkap, lihat codelab hello_world_multi.
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')