VTS รองรับการทดสอบที่ต้องมีการโต้ตอบระหว่างอุปกรณ์ Android หลายเครื่อง
สถาปัตยกรรม
VTS ใช้เฟรมเวิร์ก TradeFed เพื่อรับและส่งซีเรียลของอุปกรณ์ไปยังโมดูลทดสอบ
ข้อกำหนดของอุปกรณ์ เช่น จำนวนอุปกรณ์และประเภทอุปกรณ์ จะระบุไว้ในการกำหนดค่าแผนทดสอบ เช่น คุณสามารถระบุแผนการทดสอบที่ต้องใช้อุปกรณ์ Android 2 เครื่องที่มีเป้าหมายการสร้าง Sailfish
การจัดสรรอุปกรณ์
โครงสร้างพื้นฐานการทดสอบ (โดยปกติคือเครื่องมือตั้งเวลาการทดสอบ) จะจัดสรรอุปกรณ์ที่มีอยู่ซึ่งเป็นไปตามข้อกำหนดที่ระบุในการกำหนดค่าแผนทดสอบให้กับเฟรมเวิร์ก VTS ระบบจะสงวนอุปกรณ์ที่จัดสรรไว้สำหรับแผนการทดสอบ แม้ว่าโมดูลทดสอบจะไม่ได้ใช้อุปกรณ์ดังกล่าวก็ตาม จากนั้นระบบจะพุชและเรียกใช้ไบนารีของตัวแทน VTS ในอุปกรณ์ทั้งหมดที่จัดสรร (เว้นแต่จะได้รับแจ้งให้ไม่เรียกใช้) วิธีนี้ช่วยให้มั่นใจว่าการเชื่อมต่อ TCP สําหรับคําสั่งเชลล์และ HAL RPC จะพร้อมใช้งานสําหรับอุปกรณ์ทั้งหมดในสคริปต์ทดสอบ
ผู้เตรียมการทดสอบ
เฟรมเวิร์กจะเรียกใช้เครื่องมือเตรียมการทดสอบสำหรับอุปกรณ์ทั้งหมดที่ได้รับหมายเลขซีเรียล ผู้เตรียมเป้าหมายอาจเป็นอุปกรณ์เครื่องเดียวหรือหลายเครื่องก็ได้ ดังนี้
- เครื่องมือเตรียมเป้าหมายอุปกรณ์เครื่องเดียว (ดูตัวอย่างที่ VtsDeviceInfoCollector)
- ระบุได้เฉพาะในการกําหนดค่าแผนทดสอบที่มีรายการอุปกรณ์ที่จําเป็น (เวอร์ชันในอนาคตจะอนุญาตให้กําหนดค่าระดับโมดูลได้)
- รับหมายเลขซีเรียลของอุปกรณ์ได้เพียงรายการเดียว
- เรียกใช้งานการเตรียมและล้างข้อมูลในอุปกรณ์ที่เฉพาะเจาะจง
- เครื่องมือเตรียมเป้าหมายสำหรับอุปกรณ์หลายเครื่อง (ดูตัวอย่างได้ที่ 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 ในอุปกรณ์ การทดสอบฝั่งโฮสต์สามารถพุชตัวแทน (แอปหรือไบนารี) ของตัวเองไปยังอุปกรณ์แต่ละเครื่องได้ ดังนี้
ในสถานการณ์นี้
- ตรรกะการทดสอบจะทํางานบนโฮสต์
- แอปตัวแทน (หรือไบนารี) ติดตั้งในอุปกรณ์แต่ละเครื่อง
- สคริปต์ทดสอบฝั่งโฮสต์จะออกคำสั่งไปยังแอปในอุปกรณ์แต่ละเครื่อง
- ฝั่งโฮสต์จะประสานงานการโต้ตอบของอุปกรณ์
ตัวอย่างเช่น การทดสอบผู้ใช้อีก 1,000 ล้านคนในรีโป 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')