VTS รองรับการทดสอบที่ต้องมีการโต้ตอบระหว่างอุปกรณ์ Android หลายเครื่อง
สถาปัตยกรรม
VTS ใช้เฟรมเวิร์ก TradeFed เพื่อรับและส่งหมายเลขอุปกรณ์ไปยังโมดูลทดสอบ
ข้อกำหนดของอุปกรณ์ เช่น จำนวนอุปกรณ์และประเภทอุปกรณ์ จะ ระบุไว้ในการกำหนดค่าแผนการทดสอบ เช่น คุณระบุแผนการทดสอบ ที่ต้องใช้อุปกรณ์ Android 2 เครื่องที่มีเป้าหมายการสร้าง Sailfish ได้
การจัดสรรอุปกรณ์
โครงสร้างพื้นฐานการทดสอบ (โดยปกติคือตัวกำหนดเวลาการทดสอบ) จะจัดสรรอุปกรณ์ที่พร้อมใช้งาน ซึ่งเป็นไปตามข้อกำหนดที่ระบุในการกำหนดค่าแผนการทดสอบให้กับเฟรมเวิร์ก VTS ระบบจะสงวนอุปกรณ์ที่จัดสรรไว้สำหรับแผนการทดสอบ แม้ว่าโมดูลการทดสอบจะไม่ได้ใช้อุปกรณ์เหล่านั้นก็ตาม จากนั้นระบบจะพุชไบนารีของเอเจนต์ VTS ไปยังอุปกรณ์ที่จัดสรรทั้งหมดและเรียกใช้ในอุปกรณ์เหล่านั้น (เว้นแต่จะได้รับคำสั่งเฉพาะไม่ให้เรียกใช้) ซึ่งจะช่วยให้มั่นใจได้ว่าการเชื่อมต่อ TCP สำหรับคำสั่งเชลล์และ HAL RPC จะพร้อมใช้งานสำหรับอุปกรณ์ทั้งหมดในสคริปต์ทดสอบ
ผู้เตรียมการทดสอบ
เฟรมเวิร์กจะเรียกใช้เครื่องมือเตรียมการทดสอบสำหรับอุปกรณ์ทั้งหมดที่ได้รับหมายเลขซีเรียล ผู้เตรียมเป้าหมายอาจใช้อุปกรณ์เครื่องเดียวหรือหลายเครื่องก็ได้
- ผู้เตรียมเป้าหมายแบบอุปกรณ์เดียว (ตัวอย่างที่
VtsDeviceInfoCollector):
- ระบุได้เฉพาะในการกำหนดค่าแผนการทดสอบที่มีรายการอุปกรณ์ที่จำเป็น (เวอร์ชันในอนาคตจะอนุญาตการกำหนดค่าระดับโมดูล)
- รับซีเรียลของอุปกรณ์เพียง 1 รายการ
- เรียกใช้การเตรียมและการล้างข้อมูลในอุปกรณ์ที่เฉพาะเจาะจง
- ตัวเตรียมเป้าหมายแบบหลายอุปกรณ์ (ตัวอย่างที่
VtsPythonVirtualenvPreparer):
- ระบุได้ในการกำหนดค่าแผนการทดสอบหรือการกำหนดค่าโมดูลการทดสอบ
- รับหมายเลขซีเรียลของอุปกรณ์ทั้งหมด
- เรียกใช้งานการเตรียมและการล้างข้อมูลสำหรับอุปกรณ์แต่ละเครื่องหรืออุปกรณ์ทั้งหมด
โมดูลทดสอบ
โมดูลทดสอบจะได้รับรายการอุปกรณ์หลังจากผู้เตรียมการทดสอบตั้งค่าโฮสต์/อุปกรณ์เสร็จแล้ว โมดูลการทดสอบ Python ฝั่งโฮสต์ 1 โมดูลจะทำงานสำหรับโมดูลการทดสอบแบบหลายอุปกรณ์แต่ละโมดูล เข้าถึงอุปกรณ์ Android ที่จัดสรรได้จากโมดูลทดสอบ Python ในรูปแบบรายการของออบเจ็กต์ AndroidDevice
devices = self.android_devices device1 = devices[0] device1_serial = device1.serial
ระบบจะสงวนอุปกรณ์ที่จัดสรรทั้งหมดไว้สำหรับแผนการทดสอบ แม้ว่าโมดูลการทดสอบในแผนจะใช้อุปกรณ์เพียงเครื่องเดียวก็ตาม
การสื่อสารกับอุปกรณ์ระหว่างการทดสอบ
การทดสอบ Android หลายเครื่องที่มีประสิทธิภาพต้องมีการสื่อสารระหว่างอุปกรณ์ที่จัดสรร เมื่อพัฒนาการทดสอบดังกล่าว คุณต้องพิจารณาวิธีสร้าง การสื่อสารระหว่างอุปกรณ์ที่จัดสรร ส่วนต่อไปนี้จะแสดงตัวอย่างการสื่อสาร 3 ตัวอย่าง (อย่างไรก็ตาม นักพัฒนาการทดสอบสามารถออกแบบโมเดลอื่นๆ ได้)
ประเภทที่ 1: การทดสอบ HAL ฝั่งโฮสต์
การทดสอบ HAL ฝั่งโฮสต์สามารถใช้ไดรเวอร์ VTS HAL ที่ระบบพุชไปยังอุปกรณ์ได้โดยค่าเริ่มต้น
ในสถานการณ์นี้
- ตรรกะการทดสอบจะทำงานในโฮสต์
- สคริปต์ทดสอบฝั่งโฮสต์จะเรียก RPC ไปยังไดรเวอร์ในอุปกรณ์แต่ละเครื่อง
- ฝั่งโฮสต์จะประสานงานการโต้ตอบของอุปกรณ์
ประเภทที่ 2: การทดสอบที่ใช้ตัวแทนฝั่งโฮสต์
การทดสอบฝั่งโฮสต์ยังสามารถพุชเอเจนต์ของตัวเอง (แอปหรือไบนารี) ไปยังอุปกรณ์แต่ละเครื่องได้ด้วย แทนที่จะใช้เอเจนต์ VTS ในอุปกรณ์
ในสถานการณ์นี้
- ตรรกะการทดสอบจะทำงานในโฮสต์
- แอปตัวแทน (หรือไบนารี) จะติดตั้งในอุปกรณ์แต่ละเครื่อง
- สคริปต์ทดสอบฝั่งโฮสต์จะส่งคำสั่งไปยังแอปในแต่ละอุปกรณ์
- ฝั่งโฮสต์จะประสานงานการโต้ตอบของอุปกรณ์
ตัวอย่างเช่น การทดสอบ Next Billion User ในที่เก็บ VTS ปัจจุบันเป็นการทดสอบฝั่งโฮสต์ที่อิงตามแอป และทดสอบในอุปกรณ์หลายเครื่อง
ประเภทที่ 3: การทดสอบ HIDL ฝั่งเป้าหมาย
การทดสอบ HIDL แบบหลายอุปกรณ์ฝั่งเป้าหมายจะวางตรรกะการทดสอบทั้งหมดไว้ในไบนารีการทดสอบฝั่งอุปกรณ์ ซึ่งกำหนดให้การทดสอบต้องซิงค์อุปกรณ์ระหว่างการดำเนินการทดสอบ
ในสถานการณ์นี้
- ตรรกะการทดสอบจะทำงานบนอุปกรณ์
- เฟรมเวิร์กฝั่งโฮสต์จะระบุอุปกรณ์เริ่มต้น
- ไบนารีการทดสอบฝั่งเป้าหมายต้องมีการซิงโครไนซ์ ดังนี้
- ไบนารีการทดสอบเดียวกันสำหรับอุปกรณ์ทั้งหมด
- ไบนารีการทดสอบที่แตกต่างกันสำหรับแต่ละบทบาท
ตัวอย่าง: แผนการทดสอบแบบหลายอุปกรณ์
ตัวอย่างนี้ระบุการกำหนดค่าสำหรับอุปกรณ์ 2 เครื่อง
- อุปกรณ์ 1 มีผู้ให้บริการบิลด์และ
VtsDeviceInfoCollector
เครื่องมือเตรียมเป้าหมาย - อุปกรณ์ 2 มี
FilePusher
ผู้เตรียมข้อมูลเพิ่มเติมที่ส่ง กลุ่มไฟล์ที่เกี่ยวข้องซึ่งโฮสต์เป็นผู้ขับเคลื่อนไปยังอุปกรณ์
<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>
ตัวอย่าง: สคริปต์ทดสอบ Python ฝั่งโฮสต์
ดูรายละเอียดและตัวอย่างเกี่ยวกับผู้เตรียมการทดสอบได้ที่ ผู้เตรียมการทดสอบ ดูตัวอย่างแบบหลายอุปกรณ์ฝั่งโฮสต์ทั้งหมดได้ที่ hello_world_multi codelab
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')