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

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à truyền số sê-ri thiết bị để kiểm thử các mô-đun.

Hình 1. VTS chuyển số sê-ri 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 hai 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ị 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ổ đượ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 và chạy trên tất 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 các lệnh shell và HAL RPC đều có sẵn cho tất cả các thiết bị trong tập lệnh kiểm thử.

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ả thiết bị mà nó 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 trên một thiết bị (ví dụ tại VtsDeviceInfoCollector):
    • Chỉ có thể chỉ định trong cấu hình kế hoạch kiểm thử với 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 được 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 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 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 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 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ả thiết bị được phân bổ đều được dành riêng cho kế hoạch kiểm thử, mặc dù mô-đun kiểm thử trong kế hoạch chỉ sử dụng một thiết bị.

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

Các thử nghiệm nhiều 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 chương trình 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 ba 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 thiết bị theo mặc định:

Hình 2. Kiểm thử 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ủ phát 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 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ị, quy trình 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) của riêng quy trình kiểm thử đó đế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ủ.

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 cài đặt trên mỗi thiết bị.
  • Tập lệnh kiểm thử phía máy chủ phát 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 lượt tương tác với thiết bị.

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

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

Các 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 kiểm thử đồng bộ hoá các thiết bị trong quá trình thực thi kiểm thử:

Hình 4. Kiểm thử 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 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á:
    • Tệp nhị phân kiểm thử giống nhau cho tất 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 hai 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 một trình chuẩn bị FilePusher bổ sung đẩy 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ụ: 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ử. Để biết ví dụ đầy đủ về nhiều thiết bị ở phía máy chủ lưu trữ, 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')