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