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 thiết bị.
Kiến trúc
VTS sử dụng khung TradeFed để nhận và truyền sê-ri thiết bị để kiểm thử các mô-đun.
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 xây dựng Sailfish.
Phân bổ thiết bị
Cơ sở hạ tầng kiểm thử (thường là bộ lập lịch kiểm thử) sẽ phân bổ sẵn thiết bị đáp ứng các yêu cầu được quy định trong cấu hình kế hoạch thử nghiệm để khung VTS. Các thiết bị được phân bổ được dành riêng cho kế hoạch thử nghiệm ngay cả khi mô-đun kiểm thử không sử dụng chúng. Sau đó, tệp nhị phân tác nhân VTS được đẩy lên và chạy trên tất 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 giúp đảm bảo rằng kết nối TCP cho lệnh shell và HAL RPC có sẵn cho tất cả trong một tập lệnh kiểm thử.
Người chuẩn bị kiểm tra
Khung này chạy các trình chuẩn bị kiểm thử trên tất cả các thiết bị mà khung này 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ị:
- Trình chuẩn bị mục tiêu trên 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ác phiên bản trong tương lai sẽ cho phép định cấu hình ở cấp mô-đun).
- Chỉ nhận một 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ị nhắm 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 mô-đun kiểm thử cấu hình
- 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 người 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 từng thiết bị mô-đun kiểm thử. 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 Thiết bị Android đối tượng:
devices = self.android_devices device1 = devices[0] device1_serial = device1.serial
Mọi thiết bị được phân bổ đều được dành riêng cho kế hoạch kiểm thử, kể cả khi kiểm thử mô-đun trong gói chỉ đang sử dụng một thiết bị.
Hoạt động giao tiếp của thiết bị trong quá trình kiểm thử
Các thử nghiệm đa Android hiệu quả liên quan đến hoạt động giao tiếp giữa các mã được phân bổ thiết bị. Khi phát triển các kiểm thử đó, bạn phải xác định cách thiết lập hoạt động giao tiếp 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, nhà phát triển thử nghiệm có thể tuỳ ý thiết kế mô hình).
Loại 1: Kiểm thử HAL (Lớp trừu tượng phần cứng) phía máy chủ
Kiểm tra HAL (Lớp trừu tượng phần cứng) phía máy chủ có thể sử dụng trình điều khiển VTS HAL được đẩy tới thiết bị bằng mặc định:
Trong trường hợp này:
- Logic kiểm thử sẽ thực thi trên máy chủ lưu trữ.
- Tập lệnh kiểm thử phía máy chủ sẽ đưa ra các lệnh gọi RPC đến trình điều khiển trên từng thiết bị.
- Các hoạt động tương tác của thiết bị với toạ độ của máy chủ.
Loại 2: Thử nghiệm 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ị, bài kiểm thử phía máy chủ cũng có thể đẩy tác nhân (ứng dụng hoặc tệp nhị phân) cho từng thiết bị:
Trong trường hợp này:
- Logic kiểm thử sẽ thực thi trên máy chủ lưu trữ.
- Ứng dụng nhân viên hỗ trợ (hoặc tệp nhị phân) cài đặt trên mỗi thiết bị.
- Tập lệnh kiểm thử phía máy chủ sẽ đưa ra lệnh cho các ứng dụng trên từng thiết bị.
- Các hoạt động tương tác của thiết bị với toạ độ của máy chủ.
Ví dụ: Tiếp theo Tỷ lệ người dùng thử nghiệm trong kho lưu trữ VTS hiện tại là ở phía máy chủ, dựa trên ứng dụng, thử nghiệm nhiều thiết bị.
Loại 3: Kiểm thử HIDL phía mục tiêu
Hoạt động kiểm thử HIDL nhiều thiết bị phía mục tiêu đặt tất cả logic kiểm thử vào quy trình kiểm thử phía thiết bị tệp nhị phân yêu cầu kiểm thử để đồng bộ hoá thiết bị trong quá trình kiểm thử thực thi:
Trong trường hợp này:
- Logic kiểm thử sẽ 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.
- Tệp nhị phân kiểm thử phía đích 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 thử nghiệm nhiều thiết bị
Ví dụ sau chỉ định cấu hình cho 2 thiết bị:
- Thiết bị 1 bao gồm nhà cung cấp bản dựng và
VtsDeviceInfoCollector
người chuẩn bị mục tiêu. - Thiết bị 2 có thêm một trình chuẩn bị
FilePusher
để đẩ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 thử Python phía máy chủ
Để biết thông tin chi tiết và ví dụ về người chuẩn bị kiểm thử, hãy xem Người chuẩn bị kiểm thử. Để có trải nghiệm hoàn chỉnh ở phía máy chủ ví dụ về nhiều thiết bị, hãy tham khảo hello_world_multi lớp học lập trình.
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')