Chạy kiểm thử trên nhiều thiết bị

Trang này giúp bạn sử dụng Bộ kiểm thử Liên minh thương mại với nhiều thiết bị trong quá trình kiểm thử.Trước tiên, bạn nên làm quen với cách sử dụng thông thường như mô tả trong ví dụ toàn diện.

Điểm khác biệt khi sử dụng nhiều thiết bị là gì?

Có một số điểm khác biệt khi định cấu hình và chạy kiểm thử trên nhiều thiết bị trong Trade Federation, cụ thể:

Mọi cấu hình một thiết bị hiện có đều hợp lệ cho chế độ nhiều thiết bị.

<! -- TODO: Làm rõ câu ở trên bằng cách thêm ví dụ về trường hợp sử dụng trên một thiết bị liên quan đến chế độ nhiều thiết bị trong câu thứ hai. -->>

Nhiều cấu hình thiết bị

Tài liệu này giả định rằng bạn đã quen thuộc với cấu hình kiểm thử TF thông thường. Dưới đây là cấu hình kiểm thử thông thường với hai thiết bị:

<configuration description="A simple multi-devices example in Tradefed">

    <device name="device1">
        <target_preparer class="com.android.tradefed.targetprep.DeviceSetup" />
    </device>

    <device name="device2">
        <target_preparer class="com.android.tradefed.targetprep.DeviceSetup" />
    </device>

    <option name="log-level" value="verbose" />
    <test class="com.android.tradefed.HelloWorldMultiDevices" />

    <logger class="com.android.tradefed.log.FileLogger" />
    <result_reporter class="com.android.tradefed.result.ConsoleResultReporter" />

</configuration>

Một số điều cần đề cập về cấu trúc:

  • Đối với mỗi thiết bị cần thiết, bạn sẽ thấy một <device>.
  • <build_provider>, <target_preparer>, <device_recovery>, <device_requirements><device_options> (nếu cần) phải được đưa vào thẻ <device>; nếu không, một ngoại lệ sẽ được gửi.
  • thuộc tính name cho <device> là bắt buộc và phải là duy nhất trong tất cả các thiết bị có trong cấu hình. Mã này dùng để tham chiếu đến thiết bị cụ thể được liên kết với nó. Điều này cho phép kiểm thử nhắm đến một thiết bị cụ thể.
  • <option> có thể có phạm vi toàn cục khi nằm ở gốc của cấu hình hoặc bị giới hạn ở phạm vi thiết bị khi được chỉ định bên trong thẻ <device>.

Tất cả các quy tắc khác áp dụng cho cấu hình một thiết bị vẫn được áp dụng tại đây. Hãy xem ví dụ Hello World bên dưới để biết thêm thông tin chi tiết.

Cập nhật dòng lệnh

Khi chỉ định các tuỳ chọn trên dòng lệnh TF, bạn cũng có thể chỉ định phạm vi thiết bị bằng cách sử dụng {<device name>}, trong đó <device name> là tên được chỉ định trong cấu hình XML.

Trong ví dụ trên, các tuỳ chọn sau được cho phép:

  • --com.android.tradefed.targetprep.DeviceSetup:disable
  • --device-setup:disable

Bạn chỉ có thể nhắm đến một trong các đối tượng build_provider của thiết bị bằng cách sử dụng tên thiết bị, như sau:

--{device2}device-setup:disable

Trong ví dụ này, device2 bỏ qua quá trình thiết lập thiết bị trong khi device1 thì không.

TF chọn thiết bị như thế nào?

Trade Federation tìm một thiết bị khớp với device_requirements (thường là phiên bản thiết bị, sản phẩm, v.v.) theo thứ tự xuất hiện của thiết bị trong cấu hình. Mỗi khi một thiết bị được phân bổ, TF sẽ cố gắng phân bổ thiết bị tiếp theo. Nếu không thể phân bổ tất cả thiết bị, tất cả thiết bị sẽ được phát hành và lệnh sẽ được thử lại khi tất cả thiết bị được so khớp.

TF chuẩn bị thiết bị như thế nào?

Bước chuẩn bị cho nhiều thiết bị hầu như giống với bước chuẩn bị cho một thiết bị. Mỗi thiết bị được chuẩn bị bằng cách gọi <target_preparer> theo thứ tự xuất hiện bên trong <device>.

Bạn cũng có thể sử dụng <multi_target_preparer> được chỉ định ở thư mục gốc của cấu hình để bật các bước chuẩn bị yêu cầu nhiều thiết bị, chẳng hạn như ghép nối thiết bị. Phương thức này chạy sau bước target_preparer.

Một giải pháp thay thế là <pre_multi_target_preparer> chạy trước bước target_preparer.

  • Bạn nên sử dụng <pre_multi_target_preparer> để thiết lập phải được thực hiện trước khi thiết lập từng thiết bị.
  • Bạn nên sử dụng <multi_target_preparer> để thiết lập những chế độ phải được thực hiện sau khi thiết lập từng thiết bị.

Ví dụ:

thiết bị flash 1 (target_preparer) thiết bị flash 2 (target_preparer) kết nối bluetooth kết nối cả hai thiết bị (multi_target_preparer)

Viết mã kiểm thử nhiều thiết bị

Khi viết kiểm thử trên một thiết bị thông thường, bạn sẽ triển khai giao diện IDeviceTest.

Để các chương trình kiểm thử nhận được các thiết bị đang được kiểm thử, bạn có thể triển khai IMultiDeviceTest hoặc IInvocationContextReceiver.

IMultiDeviceTest cung cấp cho bạn bản đồ trực tiếp của thiết bị đến IBuildInfo của thiết bị đó, trong khi IInvocationContextReceiver sau đó cung cấp cho bạn ngữ cảnh hoàn chỉnh (thiết bị, IBuildInfo và siêu dữ liệu).

Sau đó, bạn có thể sử dụng các API ITestDevice thông thường mà TF đưa vào để viết mã kiểm thử.

Chưa có API nào để thực hiện các thao tác từ thiết bị này sang thiết bị khác, chẳng hạn như device1.sync(device2). Nếu bạn cho rằng mình có trường hợp sử dụng thuyết phục cần được hỗ trợ, hãy gửi lý do của bạn vào danh sách android-platform.

Ví dụ về lời chào trên nhiều thiết bị

Chúng tôi đã thêm một cấu hình mẫu giống như Hello World: multi-devices.xml Cũng có một ví dụ về cách triển khai multi_target_preparer HelloWorldMultiTargetPreparer cho biết cách nhận danh sách thiết bị và bản dựng của các thiết bị đó.

Đây là ví dụ đầy đủ bao gồm:

  • Đang phân bổ 2 thiết bị
  • Truy cập vào cả hai thiết bị thông qua multi_target_preparer
  • Chạy kiểm thử sử dụng hai thiết bị

Sau khi tạo Tradefed, bạn có thể sử dụng lệnh sau trong shell TF:

run example/multi-devices

Bạn sẽ thấy một số kết quả chứa nội dung sau:

08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device '00b4e73b4cbcd162' with build id '3146108'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device 'LP5A390056' with build id '3146108'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device '00b4e73b4cbcd162' from context with build 'com.android.tradefed.build.DeviceBuildInfo@c99cbc1'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device 'LP5A390056' from context with build 'com.android.tradefed.build.DeviceBuildInfo@b41f20c5'

Bạn cần kết nối hai thiết bị để chạy mã trên. Bạn có thể kiểm tra điều này qua: adb devices

Khi lệnh gọi đang diễn ra, bạn có thể theo dõi lệnh gọi đó như các thiết bị đơn lẻ bằng list ilist d:

tf >list i
Command Id  Exec Time  Device                          State
1           0m:35      [00b4e73b4cbcd162, LP5A390056]  fetching build
tf >list d
Serial            State      Product   Variant   Build   Battery
00b4e73b4cbcd162  Allocated  bullhead  bullhead  NRD90O  100
LP5A390056        Allocated  shamu     shamu     NRD90I  100

Bạn sẽ có thể thấy các thiết bị liên quan đến mỗi lệnh gọi, cũng như tất cả các thiết bị có sẵn và trạng thái tương ứng của các thiết bị đó.

Xin lưu ý rằng trong ví dụ này, chúng tôi đã gọi hai thiết bị trong cấu hình device1device2; bạn nên đặt tên mô tả rõ hơn (nếu có thể), tuỳ thuộc vào loại thiết bị mà bạn thực sự muốn đặt.