การทดสอบหลายอุปกรณ์

VTS รองรับการทดสอบที่ต้องมีปฏิสัมพันธ์ระหว่างอุปกรณ์ Android หลายเครื่อง

สถาปัตยกรรม

VTS ใช้เฟรมเวิร์ก TradeFed เพื่อรับและส่งซีเรียลอุปกรณ์เพื่อทดสอบโมดูล

รูปที่ 1. VTS ที่ส่งผ่านซีเรียลของอุปกรณ์

ข้อกำหนดของอุปกรณ์ เช่น จำนวนอุปกรณ์และประเภทอุปกรณ์ ระบุไว้ในการกำหนดค่าแผนการทดสอบ ตัวอย่างเช่น คุณสามารถระบุแผนการทดสอบที่ต้องใช้อุปกรณ์ Android 2 เครื่องที่มีเป้าหมายบิลด์ Sailfish

การจัดสรรอุปกรณ์

โครงสร้างพื้นฐานการทดสอบ (โดยปกติคือตัวกำหนดเวลาการทดสอบ) จะจัดสรรอุปกรณ์ที่มีอยู่ซึ่งเป็นไปตามข้อกำหนดที่ระบุไว้ในการกำหนดค่าแผนการทดสอบให้กับกรอบงาน VTS อุปกรณ์ที่จัดสรรไว้จะถูกสงวนไว้สำหรับแผนการทดสอบ แม้ว่าโมดูลทดสอบจะไม่ได้ใช้งานก็ตาม จากนั้นไบนารีเอเจนต์ VTS จะถูกส่งไปยังและรันบนอุปกรณ์ที่จัดสรรทั้งหมด (เว้นแต่ได้รับคำแนะนำเป็นพิเศษว่าอย่ารัน) สิ่งนี้ทำให้แน่ใจได้ว่าการเชื่อมต่อ TCP สำหรับคำสั่งเชลล์และ HAL RPC จะพร้อมใช้งานสำหรับอุปกรณ์ทั้งหมดในสคริปต์ทดสอบ

ผู้เตรียมการทดสอบ

เฟรมเวิร์กเรียกใช้ตัวจัดเตรียมการทดสอบสำหรับอุปกรณ์ทั้งหมดที่ได้รับหมายเลขซีเรียล ผู้จัดเตรียมเป้าหมายอาจเป็นอุปกรณ์เดียวหรือหลายอุปกรณ์:

  • ผู้จัดเตรียมเป้าหมายแบบอุปกรณ์เดียว (ตัวอย่างที่ VtsDeviceInfoCollector ):
    • สามารถระบุได้เฉพาะในการกำหนดค่าแผนการทดสอบด้วยรายการอุปกรณ์ที่ต้องการ (เวอร์ชันในอนาคตจะอนุญาตให้มีการกำหนดค่าระดับโมดูล)
    • รับอนุกรมอุปกรณ์เดียวเท่านั้น
    • รันงานการเตรียมการและล้างข้อมูลกับอุปกรณ์เฉพาะ
  • ผู้จัดเตรียมเป้าหมายหลายอุปกรณ์ (ตัวอย่างที่ VtsPythonVirtualenvPreparer ):
    • สามารถระบุได้ในการกำหนดค่าแผนการทดสอบหรือการกำหนดค่าโมดูลทดสอบ
    • รับซีเรียลอุปกรณ์ทั้งหมด
    • รันงานการเตรียมการและล้างข้อมูลสำหรับแต่ละอุปกรณ์หรืออุปกรณ์ทั้งหมด

โมดูลทดสอบ

โมดูลทดสอบจะได้รับรายชื่ออุปกรณ์หลังจากที่ผู้จัดเตรียมการทดสอบเสร็จสิ้นการตั้งค่าโฮสต์/อุปกรณ์ โมดูลทดสอบ Python ฝั่งโฮสต์หนึ่งโมดูลทำงานสำหรับโมดูลทดสอบหลายอุปกรณ์แต่ละโมดูล อุปกรณ์ Android ที่จัดสรรสามารถเข้าถึงได้จากโมดูลทดสอบ Python เป็นรายการออบเจ็กต์ AndroidDevice :

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

อุปกรณ์ที่จัดสรรทั้งหมดจะถูกสงวนไว้สำหรับแผนการทดสอบ แม้ว่าโมดูลทดสอบในแผนจะใช้อุปกรณ์เพียงเครื่องเดียวเท่านั้น

การสื่อสารของอุปกรณ์ระหว่างการทดสอบ

การทดสอบ Android หลายเครื่องที่มีประสิทธิภาพเกี่ยวข้องกับการสื่อสารระหว่างอุปกรณ์ที่จัดสรร เมื่อพัฒนาการทดสอบดังกล่าว คุณต้องกำหนดวิธีสร้างการสื่อสารระหว่างอุปกรณ์ที่จัดสรร ส่วนต่อไปนี้มีตัวอย่างการสื่อสารสามตัวอย่าง (อย่างไรก็ตาม นักพัฒนาทดสอบมีอิสระที่จะออกแบบรุ่นอื่นๆ)

ประเภทที่ 1: การทดสอบ HAL ฝั่งโฮสต์

การทดสอบ HAL ฝั่งโฮสต์สามารถใช้ไดรเวอร์ VTS HAL ที่ถูกพุชไปยังอุปกรณ์ตามค่าเริ่มต้น:

รูปที่ 2 การทดสอบ HAL ฝั่งโฮสต์

ในสถานการณ์สมมตินี้:

  • ตรรกะทดสอบดำเนินการบนโฮสต์
  • สคริปต์ทดสอบฝั่งโฮสต์จะออกการเรียก RPC ไปยังไดรเวอร์ในแต่ละอุปกรณ์
  • ด้านโฮสต์ประสานงานการโต้ตอบของอุปกรณ์

ประเภทที่ 2: การทดสอบตามเอเจนต์ฝั่งโฮสต์

แทนที่จะใช้ตัวแทน VTS บนอุปกรณ์ การทดสอบฝั่งโฮสต์ยังสามารถส่งตัวแทนของตัวเอง (แอปหรือไบนารี) ไปยังแต่ละอุปกรณ์ได้:

รูปที่ 3 การทดสอบบนฝั่งโฮสต์โดยใช้เอเจนต์

ในสถานการณ์สมมตินี้:

  • ตรรกะทดสอบดำเนินการบนโฮสต์
  • แอปตัวแทน (หรือไบนารี) ติดตั้งบนอุปกรณ์แต่ละเครื่อง
  • สคริปต์ทดสอบฝั่งโฮสต์จะออกคำสั่งไปยังแอปบนอุปกรณ์แต่ละเครื่อง
  • ด้านโฮสต์ประสานงานการโต้ตอบของอุปกรณ์

ตัวอย่างเช่น การทดสอบ Next Billion User ใน VTS repo ปัจจุบันเป็นการทดสอบฝั่งโฮสต์ ตามแอป และหลายอุปกรณ์

ประเภทที่ 3: การทดสอบ HIDL ฝั่งเป้าหมาย

การทดสอบ HIDL ฝั่งเป้าหมายแบบหลายอุปกรณ์ใส่ตรรกะการทดสอบทั้งหมดไว้ในไบนารีการทดสอบฝั่งอุปกรณ์ ซึ่งต้องมีการทดสอบเพื่อซิงโครไนซ์อุปกรณ์ระหว่างการดำเนินการทดสอบ:

รูปที่ 4 การทดสอบ HIDL ตามเป้าหมาย

ในสถานการณ์สมมตินี้:

  • ตรรกะทดสอบดำเนินการบนอุปกรณ์
  • เฟรมเวิร์กฝั่งโฮสต์ระบุการระบุอุปกรณ์เบื้องต้น
  • ไบนารีทดสอบฝั่งเป้าหมายต้องมีการซิงโครไนซ์:
    • ไบนารีทดสอบเดียวกันสำหรับอุปกรณ์ทั้งหมด
    • ไบนารีทดสอบที่แตกต่างกันสำหรับแต่ละบทบาท

ตัวอย่าง: แผนการทดสอบหลายอุปกรณ์

ตัวอย่างนี้ระบุการกำหนดค่าสำหรับอุปกรณ์สองเครื่อง:

  • อุปกรณ์ 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')