Kiểm tra nhiều thiết bị

VTS hỗ trợ các bài kiểm tra yêu cầu tương tác giữa nhiều thiết bị Android.

Ngành kiến ​​​​trúc

VTS sử dụng khung TradeFed để lấy và chuyển số sê-ri thiết bị tới các mô-đun thử nghiệm.

Hình 1. Chuỗi thiết bị truyền VTS.

Yêu cầu về thiết bị, chẳng hạn như số lượng thiết bị và loại thiết bị, được chỉ định trong cấu hình kế hoạch kiểm tra. Ví dụ: bạn có thể chỉ định một kế hoạch thử nghiệm yêu cầu hai thiết bị Android có mục tiêu xây dựng Sailfish.

Phân bổ thiết bị

Cơ sở hạ tầng kiểm tra (thường là bộ lập lịch kiểm tra) phân bổ các thiết bị có sẵn đáp ứng các yêu cầu được chỉ định trong cấu hình kế hoạch kiểm tra cho khung VTS. Các thiết bị được phân bổ được dành riêng cho kế hoạch kiểm tra ngay cả khi mô-đun kiểm tra không sử dụng chúng. Sau đó, các tệp nhị phân tác nhân VTS được đẩy tới và chạy trên tất cả các thiết bị được phân bổ (trừ khi được hướng dẫn cụ thể là không chạy). Điều này đảm bảo rằng các kết nối TCP cho lệnh shell và HAL RPC có sẵn cho tất cả các thiết bị trong tập lệnh thử nghiệm.

Người chuẩn bị kiểm tra

Khung này chạy trình chuẩn bị kiểm tra cho tất cả các thiết bị nhận được số sê-ri. Trình chuẩn bị mục tiêu có thể là một hoặc nhiều thiết bị:

  • Trình chuẩn bị mục tiêu một thiết bị (ví dụ tại VtsDeviceInfoCollector ):
    • Chỉ có thể được chỉ định trong cấu hình kế hoạch thử nghiệm với danh sách thiết bị được yêu cầu (các phiên bản trong tương lai sẽ cho phép cấu hình cấp mô-đun).
    • Chỉ nhận được một thiết bị nối tiếp.
    • Chạy các tác vụ chuẩn bị và dọn dẹp trên một thiết bị cụ thể.
  • Trình chuẩn bị mục tiêu đa thiết bị (ví dụ tại VtsPythonVirtualenvPreparer ):
    • Có thể được chỉ định trong cấu hình kế hoạch kiểm tra hoặc cấu hình mô-đun kiểm tra
    • Nhận tất cả các serial của thiết bị
    • Chạy các tác vụ chuẩn bị và dọn dẹp cho từng thiết bị hoặc tất cả các thiết bị.

mô-đun thử nghiệm

Các mô-đun kiểm tra nhận được danh sách các thiết bị sau khi người chuẩn bị kiểm tra hoàn tất việc thiết lập máy chủ/thiết bị. Một mô-đun thử nghiệm Python phía máy chủ chạy cho từng mô-đun thử nghiệm trên nhiều thiết bị. Các thiết bị Android được phân bổ có thể truy cập được từ các mô-đun thử nghiệm Python dưới dạng danh sách các đối tượng AndroidDevice :

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

Tất cả các thiết bị được phân bổ đều được dành riêng cho kế hoạch thử nghiệm, mặc dù mô-đun thử nghiệm trong kế hoạch chỉ sử dụng một thiết bị.

Giao tiếp thiết bị trong quá trình thử nghiệm

Kiểm thử đa Android hiệu quả liên quan đến giao tiếp giữa các thiết bị được phân bổ. Khi phát triển các thử nghiệm như vậy, bạn phải xác định cách thiết lập liên lạc giữa các thiết bị được phân bổ. Các phần sau đây cung cấp ba ví dụ về giao tiếp (tuy nhiên, người phát triển thử nghiệm có thể tự do thiết kế các mô hình khác).

Loại 1: Kiểm tra HAL phía máy chủ

Kiểm tra HAL phía máy chủ có thể sử dụng trình điều khiển VTS HAL được đẩy tới các thiết bị theo mặc định:

Hình 2. Kiểm tra HAL phía máy chủ.

Trong kịch bản này:

  • Kiểm tra logic thực thi trên máy chủ.
  • Tập lệnh kiểm tra phía máy chủ thực hiện lệnh gọi RPC tới trình điều khiển trên mỗi thiết bị.
  • Phía máy chủ điều phối các tương tác của thiết bị.

Loại 2: Kiểm tra dựa trên tác nhân phía máy chủ

Thay vì sử dụng tác nhân VTS trên thiết bị, thử nghiệm phía máy chủ cũng có thể đẩy tác nhân (ứng dụng hoặc tệp nhị phân) của chính nó tới từng thiết bị:

Hình 3. Kiểm thử dựa trên tác nhân, phía máy chủ.

Trong kịch bản này:

  • Kiểm tra logic thực thi trên máy chủ.
  • Ứng dụng đại lý (hoặc nhị phân) cài đặt trên mỗi thiết bị.
  • Tập lệnh kiểm tra phía máy chủ đưa ra lệnh cho các ứng dụng trên mỗi thiết bị.
  • Phía máy chủ điều phối các tương tác của thiết bị.

Ví dụ: các bài kiểm tra Tỷ người dùng tiếp theo trong kho lưu trữ VTS hiện tại là các bài kiểm tra trên nhiều thiết bị, dựa trên ứng dụng và phía máy chủ.

Loại 3: Kiểm tra HIDL phía mục tiêu

Các bài kiểm tra HIDL đa thiết bị, phía mục tiêu đặt tất cả logic kiểm tra vào các tệp nhị phân kiểm tra phía thiết bị, yêu cầu kiểm tra để đồng bộ hóa các thiết bị trong quá trình thực hiện kiểm tra:

Hình 4. Kiểm tra HIDL dựa trên mục tiêu.

Trong kịch bản này:

  • Kiểm tra logic thực thi trên các thiết bị.
  • Khung phía máy chủ cung cấp nhận dạng thiết bị ban đầu.
  • Nhị phân thử nghiệm phía mục tiêu yêu cầu đồng bộ hóa:
    • Thử nghiệm nhị phân giống nhau cho tất cả các thiết bị.
    • Các tệp nhị phân thử nghiệm khác nhau cho từng vai trò.

Ví dụ: Kế hoạch kiểm tra nhiều thiết bị

Ví dụ này chỉ định cấu hình cho hai thiết bị:

  • Thiết bị 1 bao gồm nhà cung cấp bản dựng và trình chuẩn bị mục tiêu VtsDeviceInfoCollector .
  • Thiết bị 2 bao gồm một trình chuẩn bị FilePusher bổ sung để đẩy một nhóm các tệp liên quan do máy chủ điều khiển vào thiết bị.
<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>

Ví dụ: Tập lệnh kiểm tra Python phía máy chủ

Để biết chi tiết và ví dụ về người chuẩn bị kiểm tra, hãy xem Người chuẩn bị kiểm tra . Để biết ví dụ hoàn chỉnh về nhiều thiết bị phía máy chủ, hãy tham khảo lớp học lập trình 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')