Pengujian multi-perangkat

VTS mendukung pengujian yang memerlukan interaksi antara beberapa perangkat Android.

Arsitektur

VTS menggunakan kerangka TradeFed untuk mendapatkan dan meneruskan serial perangkat untuk menguji modul.

Gambar 1. Serial perangkat passing VTS.

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 kerangka VTS. Perangkat yang dialokasikan dicadangkan untuk rencana pengujian meskipun modul pengujian tidak menggunakannya. Biner agen VTS kemudian didorong dan dijalankan pada semua perangkat yang dialokasikan (kecuali jika diinstruksikan secara khusus untuk tidak dijalankan). Hal ini memastikan bahwa koneksi TCP untuk perintah shell dan HAL RPC tersedia untuk semua perangkat dalam skrip pengujian.

Persiapan tes

Kerangka kerja ini menjalankan pembuat pengujian untuk semua perangkat yang menerima nomor seri. Pembuat target dapat berupa perangkat tunggal atau multi-perangkat:

  • Pembuat target satu perangkat (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.
    • Jalankan tugas persiapan dan pembersihan pada perangkat tertentu.
  • Pembuat target multi-perangkat (contoh di VtsPythonVirtualenvPreparer ):
    • Dapat ditentukan dalam konfigurasi rencana pengujian atau konfigurasi modul pengujian
    • Terima semua serial perangkat
    • Jalankan tugas persiapan dan pembersihan untuk setiap perangkat atau semua perangkat.

Modul uji

Modul pengujian mendapatkan daftar perangkat setelah pembuat pengujian selesai menyiapkan host/perangkat. Satu modul pengujian Python sisi host dijalankan 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 tersebut hanya menggunakan satu perangkat.

Komunikasi perangkat selama pengujian

Pengujian multi-Android yang efektif melibatkan komunikasi antar perangkat yang dialokasikan. Saat mengembangkan pengujian semacam itu, Anda harus menentukan cara menjalin komunikasi antar perangkat yang dialokasikan. Bagian berikut memberikan tiga contoh komunikasi (namun, pengembang pengujian bebas merancang model lain).

Tipe 1: Tes HAL sisi host

Pengujian HAL sisi host dapat menggunakan driver VTS HAL yang dikirimkan ke perangkat secara default:

Gambar 2. Tes 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.

Tipe 2: Tes berbasis agen sisi host

Daripada menggunakan agen VTS pada perangkat, pengujian sisi host juga dapat memasukkan agennya sendiri (aplikasi atau biner) ke setiap perangkat:

Gambar 3. Tes berbasis agen di sisi host.

Dalam skenario ini:

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

Misalnya, pengujian Miliaran Pengguna Berikutnya di repo VTS saat ini adalah pengujian multi-perangkat di sisi host, berbasis aplikasi.

Tipe 3: Tes HIDL sisi target

Pengujian HIDL multi-perangkat sisi target menempatkan semua logika pengujian pada biner pengujian sisi perangkat, yang memerlukan pengujian untuk menyinkronkan perangkat selama pelaksanaan pengujian:

Gambar 4. Tes HIDL berbasis target.

Dalam skenario ini:

  • Logika pengujian dijalankan pada perangkat.
  • Kerangka kerja sisi host menyediakan 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 multi-perangkat

Contoh ini menentukan konfigurasi untuk dua perangkat:

  • Perangkat 1 mencakup penyedia build dan pembuat target VtsDeviceInfoCollector .
  • Perangkat 2 menyertakan pembuat FilePusher tambahan yang mengirimkan sekelompok file terkait berbasis 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 detail dan contoh tentang pembuat ujian, lihat Penyiap ujian . Untuk contoh lengkap multi-perangkat sisi host, 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')