VTS hỗ trợ các bài 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 để nhận và chuyển số sê-ri của thiết bị đến các mô-đun kiểm thử.

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ử) phân bổ các thiết bị hiện có đá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 chuyển đế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à RPC HAL có sẵn cho tất cả các thiết bị trong kịch bản kiểm tra.
Trình chuẩn bị kiểm thử
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. Trình chuẩn bị mục tiêu có thể là trình chuẩn bị một thiết bị 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 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 của 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 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ử nhận được danh sách thiết bị sau khi 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ủ chạy cho mỗi mô-đun kiểm thử nhiều thiết bị. Bạn có thể truy cập 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ử, mặc dù 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 bài kiểm thử nhiều thiết bị Android hiệu quả 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 bài 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ự thiết kế các mô hình khác).
Loại 1: Bài kiểm thử HAL phía máy chủ
Bài kiểm thử HAL phía máy chủ có thể sử dụng trình điều khiển HAL VTS được chuyển đến thiết bị theo mặc định:

Trong trường hợp này:
- Logic kiểm thử thực thi trên máy chủ.
- Kịch bản kiểm tra phía máy chủ đưa ra các lệnh gọi RPC đến 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 giữa các thiết bị.
Loại 2: Bài kiểm thử 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ị, bài kiểm thử phía máy chủ cũng có thể chuyển tác nhân riêng (ứng dụng hoặc tệp nhị phân) đến từng thiết bị:

Trong trường hợp này:
- Logic kiểm thử thực thi trên máy chủ.
- Ứng dụng tác nhân (hoặc tệp nhị phân) cài đặt trên từng thiết bị.
- Kịch bản kiểm tra phía máy chủ đưa ra các lệnh đến ứng dụng trên từng thiết bị.
- Phía máy chủ điều phối các lượt tương tác giữa các thiết bị.
Ví dụ: các bài kiểm thử Người dùng tỷ người tiếp theo trong kho lưu trữ VTS hiện tại là các bài kiểm thử nhiều thiết bị dựa trên ứng dụng phía máy chủ.
Loại 3: Bài 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 mục tiêu đặ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ị, yêu cầu các bài kiểm thử đồng bộ hoá thiết bị trong quá trình thực thi kiểm thử:

Trong trường hợp này:
- Logic kiểm thử thực thi trên thiết bị.
- Khung phía máy chủ cung cấp thông tin nhận dạng thiết bị ban đầu.
- Tệp nhị phân kiểm thử 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ử 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 trì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 trình chuẩn bị
FilePusherbổ sung, trình này chuyển một nhóm tệp liên quan do máy chủ đ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ụ: Kịch bản kiểm tra Python phía máy chủ
Để 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 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')