Kiểm thử trên nhiều thiết bị

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

Kiến trúc

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

Hình 1. VTS truyền số sê-ri của thiết bị.

Các 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 thử. Ví dụ: bạn có thể chỉ định một kế hoạch kiểm thử yêu cầu 2 thiết bị Android có mục tiêu bản dựng Sailfish.

Phân bổ thiết bị

Cơ sở hạ tầng kiểm thử (thường là trình lập lịch kiểm thử) sẽ 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 thử cho khung VTS. Các thiết bị được phân bổ sẽ được dành riêng cho kế hoạch kiểm thử, ngay cả khi mô-đun kiểm thử không sử dụng các thiết bị đó. Sau đó, các tệp nhị phân của tác nhân VTS sẽ được đẩy đến và chạy trên tất cả các thiết bị được phân bổ (trừ phi 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 một tập lệnh kiểm thử.

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

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

  • Người chuẩn bị mục tiêu cho một thiết bị (ví dụ: tại VtsDeviceInfoCollector):
    • Chỉ có thể được chỉ định trong cấu hình kế hoạch kiểm thử bằng danh sách thiết bị bắt buộc (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 một số sê-ri thiết bị.
    • 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 cho nhiều thiết bị (ví dụ: tại VtsPythonVirtualenvPreparer):
    • Có thể được chỉ định trong cấu hình kế hoạch kiểm thử hoặc cấu hình mô-đun kiểm thử
    • Nhận tất cả số sê-ri 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ả thiết bị.

Mô-đun kiểm thử

Các mô-đun kiểm thử sẽ nhận được danh sách thiết bị sau khi các trình chuẩn bị kiểm thử hoàn tất việc thiết lập máy chủ/thiết bị. Một mô-đun kiểm thử Python phía máy chủ sẽ chạy cho mỗi mô-đun kiểm thử nhiều thiết bị. Bạn có thể truy cập vào các thiết bị Android được phân bổ từ các mô-đun kiểm thử 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 kiểm thử, ngay cả khi một mô-đun kiểm thử trong kế hoạch chỉ sử dụng một thiết bị.

Giao tiếp giữa các thiết bị trong quá trình kiểm thử

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

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

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

Hình 2. Thử nghiệm HAL phía máy chủ.

Trong trường hợp này:

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

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

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

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

Trong trường hợp này:

  • Logic kiểm thử thực thi trên máy chủ.
  • Ứng dụng (hoặc tệp nhị phân) của tác nhân sẽ cài đặt trên mỗi thiết bị.
  • Tập lệnh kiểm thử phía máy chủ sẽ gửi các lệnh đến ứng dụng trên mỗi thiết bị.
  • Phía máy chủ điều phối các lượt tương tác với thiết bị.

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

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

Các bài kiểm thử HIDL nhiều thiết bị phía đích đặt tất cả logic kiểm thử trên các tệp nhị phân kiểm thử phía thiết bị, điều này đòi hỏi các bài kiểm thử phải đồng bộ hoá các thiết bị trong quá trình thực thi kiểm thử:

Hình 4. Thử nghiệm HIDL dựa trên mục tiêu.

Trong trường hợp này:

  • Logic kiểm thử thực thi trên các thiết bị.
  • Khung phía máy chủ cung cấp thông tin nhận dạng thiết bị ban đầu.
  • Thử nghiệm nhị phân phía mục tiêu yêu cầu đồng bộ hoá:
    • Cùng một tệp nhị phân kiểm thử cho tất cả các thiết bị.
    • Các tệp nhị phân kiểm thử khác nhau cho từng vai trò.

Ví dụ: Kế hoạch kiểm thử trên nhiều thiết bị

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

  • Thiết bị 1 bao gồm một trình cung cấp bản dựng và trình chuẩn bị mục tiêu VtsDeviceInfoCollector.
  • Thiết bị 2 có thêm một trình chuẩn bị FilePusher giúp đẩy một nhóm các tệp liên quan do máy chủ lưu trữ điều khiển đến 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 thử Python phía máy chủ lưu trữ

Để biết thông tin chi tiết và ví dụ về trình chuẩn bị kiểm thử, hãy xem phần Trình chuẩn bị kiểm thử. Để xem ví dụ đầy đủ về nhiều thiết bị phía máy chủ, hãy tham khảo 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')