Pengujian multiperangkat

VTS mendukung pengujian yang memerlukan interaksi antara beberapa aplikasi Android perangkat.

Arsitektur

VTS menggunakan framework TradeFed untuk mendapatkan dan lulus seri perangkat untuk diuji modul.

Gambar 1. VTS yang meneruskan seri perangkat.

Persyaratan perangkat, seperti jumlah perangkat dan jenis perangkat, yang ditentukan dalam konfigurasi rencana pengujian. Misalnya, Anda dapat menentukan rencana pengujian yang membutuhkan dua perangkat Android dengan target build Sailfish.

Alokasi perangkat

Infrastruktur pengujian (biasanya penjadwal pengujian) mengalokasikan perangkat yang memenuhi persyaratan yang ditentukan dalam konfigurasi paket pengujian untuk kerangka kerja VTS. Perangkat yang dialokasikan dicadangkan untuk paket pengujian meskipun tidak digunakan modul pengujian tersebut. Biner agen VTS kemudian didorong dan dijalankan pada semua perangkat yang dialokasikan (kecuali jika diinstruksikan secara khusus untuk tidak berjalan). Hal ini memastikan bahwa koneksi TCP untuk perintah {i>shell<i} dan RPC HAL tersedia untuk semua perangkat tertentu dalam skrip pengujian.

Persiapan tes

Framework menjalankan persiapan pengujian untuk semua perangkat yang menerima pengujian nomor seri. Mempersiapkan target dapat berupa satu atau beberapa perangkat:

  • Mempersiapkan target perangkat tunggal (contoh di VtsDeviceInfoCollector):
    • Hanya dapat ditentukan dalam konfigurasi paket pengujian dengan daftar perangkat (versi mendatang akan mengizinkan konfigurasi level modul).
    • Hanya terima satu seri perangkat.
    • Jalankan tugas persiapan dan pembersihan di perangkat tertentu.
  • Pemicu target multiperangkat (contoh di VtsPythonVirtualenvPreparer):
    • Dapat ditentukan dalam konfigurasi paket pengujian atau modul pengujian konfigurasi
    • Terima semua seri perangkat
    • Jalankan tugas persiapan dan pembersihan untuk setiap perangkat atau semua perangkat.

Modul pengujian

Modul pengujian mendapatkan daftar perangkat setelah persiapan pengujian selesai disiapkan {i>host/perangkat<i}. Satu modul pengujian Python sisi host berjalan untuk setiap multi-perangkat modul pengujian. Perangkat Android yang dialokasikan dapat diakses dari modul pengujian Python sebagai daftar PerangkatAndroid objek:

devices = self.android_devices
device1 = devices[0]
device1_serial = device1.serial

Semua perangkat yang dialokasikan dicadangkan untuk rencana pengujian, meskipun modul dalam rencana hanya menggunakan satu perangkat.

Komunikasi perangkat selama pengujian

Pengujian multi-Android yang efektif melibatkan komunikasi antara perangkat. Saat mengembangkan pengujian tersebut, Anda harus menentukan cara menetapkan komunikasi antar perangkat yang dialokasikan. Bagian berikut memberikan tiga contoh komunikasi (namun, developer pengujian bebas mendesain ).

Tipe 1: Pengujian HAL sisi host

Tes HAL sisi {i>host<i} dapat menggunakan {i>driver<i} VTS HAL yang didorong ke perangkat oleh default:

Gambar 2. Pengujian HAL sisi host.

Dalam skenario ini:

  • Logika pengujian dijalankan pada 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

Alih-alih menggunakan agen VTS di perangkat, pengujian sisi host juga dapat mendorong agen (aplikasi atau biner) ke setiap perangkat:

Gambar 3. Pengujian berbasis agen dan sisi host.

Dalam skenario ini:

  • Logika pengujian dijalankan pada host.
  • Penginstalan aplikasi agen (atau biner) di setiap perangkat.
  • Skrip pengujian sisi host mengeluarkan perintah ke aplikasi di setiap perangkat.
  • Sisi host mengoordinasikan interaksi perangkat.

Misalnya, Berikutnya Pengujian Miliaran Pengguna di repo VTS saat ini terdiri dari sisi host, berbasis aplikasi, pengujian multiperangkat.

Tipe 3: Pengujian HIDL sisi target

Pengujian HIDL multiperangkat sisi target menempatkan semua logika pengujian pada pengujian sisi perangkat biner, yang mengharuskan pengujian menyinkronkan perangkat selama pengujian eksekusi:

Gambar 4. Pengujian HIDL berbasis target.

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 berbeda untuk setiap peran.

Contoh: Rencana pengujian multiperangkat

Contoh ini menetapkan konfigurasi untuk dua perangkat:

  • Perangkat 1 menyertakan penyedia build dan Mempersiapkan target VtsDeviceInfoCollector.
  • Perangkat 2 menyertakan preparer FilePusher tambahan yang mendorong sekelompok file yang terkait dengan {i>host<i} di 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 terkait persiapan ujian, lihat Persiapan pengujian. Untuk sisi host lengkap contoh multi-perangkat, lihat halo_dunia_multi codelab ini.

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