Mô-đun nhiều thiết bị

Tài liệu này cung cấp hướng dẫn từng bước về cách tạo mô-đun nhiều thiết bị và nêu ra các giới hạn hiện tại (nếu có).

Mẫu

Cung cấp mô-đun nhiều thiết bị có khả năng nhận biết Wi-Fi CTS. Ứng dụng này gửi tin nhắn từ một thiết bị qua wifi và xác minh thiết bị kia nhận được tin nhắn đó.

Nguồn của mô-đun này nằm tại packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/.

Chúng tôi đã chú thích vào ví dụ này với nhiều nhận xét mà chúng tôi thấy hữu ích.

Bước 1: Tạo thư mục mô-đun

Bạn nên tạo một thư mục cho mô-đun nhiều thiết bị trong dự án bộ chứa mô-đun đó. Ví dụ: cts/hostsidetests/multidevices/. Bạn nên làm như vậy để tất cả các mô-đun nhiều thiết bị vẫn được đặt cùng nhau ít nhất là ở bước đầu tiên, nhờ đó bạn có thể dễ dàng khám phá các ví dụ.

Tất cả tệp cho mô-đun này phải được đặt trong thư mục mô-đun riêng. Ví dụ: wifi_aware.

Bước 2: Tạo kiểm thử

Đây là nơi bạn triển khai logic kiểm thử. Điều này phụ thuộc nhiều vào nội dung đang được kiểm thử.

Tạo nguồn kiểm thử Mobly, chẳng hạn như: wifi_aware_test.py.

Bước 3: Tạo tệp bản dựng: Android.bp

Thêm tệp Android.bp như packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp. Xác định mô-đun python_test_host, tương tự như:

python_test_host {
    name: "CtsWifiAwareTestCases",
    main: "wifi_aware_test.py",
    srcs: ["wifi_aware_test.py"],
    test_suites: [
        "cts",
        "general-tests",
    ],
    test_options: {
        unit_test: false,
    },
    data: [
          // Package the snippet with the mobly test
        ":wifi_aware_snippet",
    ],
}

Chỉ định các đoạn mã cho kiểm thử bằng trường dữ liệu. Trường này sẽ được đóng gói bằng tệp nhị phân và có thể được ATest tìm thấy và cài đặt trong kiểm thử hoặc trong quá trình Thực thi liên tục.

Đoạn mã đi kèm Mobly có trong Android tại external/mobly-bundled-snippets/.

Không bắt buộc: Tạo đoạn mã tuỳ chỉnh

Một số mô-đun nhiều thiết bị có thể yêu cầu đoạn mã AdMob tuỳ chỉnh. Bài kiểm thử mẫu bao gồm một đoạn mã nhận biết Wi-Fi tại packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java, được tạo bằng Mobly Snippet Lib, có trong Android tại: external/mobly-snippet-lib/.

Đoạn mã phải được xác định bằng quy tắc android_test trong Android.bp như đo lường chuẩn:

android_test {
    name: "wifi_aware_snippet",
    sdk_version: "current",
    srcs: [
        "CallbackUtils.java",
        "WifiAwareSnippet.java",
    ],
    manifest: "AndroidManifest.xml",
    static_libs: [
        "androidx.test.runner",
        "guava",
        "mobly-snippet-lib",
    ],
}

Bước 4: Tạo cấu hình mô-đun: AndroidTest.xml

Thêm một tệp AndroidTest.xml như packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml. Trong cấu hình kiểm thử này, bạn cần chỉ định hai thiết bị cho kiểm thử, tương tự như:

<configuration description="Config for CTS Wifi Aware test cases">
    <option name="test-suite-tag" value="cts" />
    <option name="config-descriptor:metadata" key="component" value="wifi" />
    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
    <option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />

    <device name="device1">
        <!-- For coverage to work, the APK should not be uninstalled until after coverage is pulled.
             So it's a lot easier to install APKs outside the python code.
        -->
        <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
            <option name="test-file-name" value="wifi_aware_snippet.apk" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
            <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
            <option name="run-command" value="wm dismiss-keyguard" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.PythonVirtualenvPreparer">
          <!-- Any python dependencies can be specified and will be installed with pip -->
          <option name="dep-module" value="mobly" />
        </target_preparer>
    </device>
    <device name="device2">
        <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
            <option name="test-file-name" value="wifi_aware_snippet.apk" />
        </target_preparer>
        <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
            <option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
            <option name="run-command" value="wm dismiss-keyguard" />
        </target_preparer>
    </device>

    <test class="com.android.tradefed.testtype.mobly.MoblyBinaryHostTest">
      <!-- The mobly-par-file-name should match the module name -->
      <option name="mobly-par-file-name" value="CtsWifiAwareTestCases" />
      <!-- Timeout limit in milliseconds for all test cases of the python binary -->
      <option name="mobly-test-timeout" value="60000" />
    </test>
</configuration>

Lưu ý:

  • Bài kiểm thử mẫu này có phần phụ thuộc trên Mobly. Bạn có thể chỉ định mọi phần phụ thuộc cho PythonVirtualenvPreparer và sẽ cài đặt bằng pip.
  • mobly-par-file-name cho MoblyBinaryHostTest phải khớp với tên mô-đun như trong Android.bp.
  • Hãy chỉ định mobly-test-timeout cho kiểm thử. Thời gian này tính bằng mili giây và áp dụng cho quá trình thực thi tệp nhị phân python hoàn chỉnh (tất cả các trường hợp kiểm thử cùng nhau). Điều này là cần thiết để tránh trường hợp các trường hợp kiểm thử bị treo vĩnh viễn trong trường hợp xảy ra một số vấn đề.
  • Mỗi thẻ device có thể chứa một chế độ thiết lập riêng biệt trên mỗi thiết bị. Cấu hình Mobly sẽ nhận các chế độ thiết lập đó theo thứ tự như đã chỉ định trong tệp XML.

Liên quan đến việc cài đặt tệp APK của đoạn mã:

  • POC ban đầu đã được cập nhật để cài đặt đoạn mã apk thông qua target_preparer do cuộc trò chuyện với nhóm Mức độ sử dụng: Để đảm bảo các phép đo phạm vi không bị xoá quá sớm, việc gỡ cài đặt bằng Khai thác thay vì bằng mã kiểm thử trong tệp nhị phân Python sẽ đảm bảo tốt hơn về thời gian.

Bước 5: Chạy kiểm thử cục bộ: atest

Hiện tại, các bài kiểm thử nhiều thiết bị chỉ chạy trên thiết bị thực. Trước khi chạy kiểm thử, hãy xác minh rằng thiết bị kiểm thử của bạn đang ở trạng thái thích hợp. Lệnh adb devices sẽ báo cáo danh sách các thiết bị đã kết nối. Nếu danh sách chứa các thiết bị không dùng để kiểm thử, hãy chỉ định các thiết bị cho kiểm thử bằng cờ -s.

Đối với các bài kiểm thử Wi-Fi, hãy đảm bảo bạn đã bật Wi-Fi cho các thiết bị (sau khi đặt lại về trạng thái ban đầu).

Bạn có thể chạy kiểm thử cục bộ bằng atest:

$ atest CtsWifiAwareTestCases

Bạn sẽ thấy số lượng thiết bị được sử dụng trong tiêu đề tóm tắt trong đầu ra của kiểm thử, chẳng hạn như Test executed with 2 device(s).

Khắc phục sự cố

Nếu kiểm thử không thành công khi chạy cục bộ do:

Lỗi Virtualenv

java.io.IOException: Cannot run program
"virtualenv": error=2, No such file or directory

Vui lòng đảm bảo virtualenv nằm trong PATH. Bạn có thể khắc phục vấn đề này bằng cách thêm "~/.local/bin" vào PATH. Nếu chưa cài đặt virtualenv, hãy làm theo hướng dẫn tại: https://virtualenv.pypa.io/en/latest/installation.html

Dự kiến sẽ nhận được ít nhất 2 đối tượng tay điều khiển, nhưng chỉ nhận được 1

Mô-đun kiểm thử có thể là mô-đun nhiều thiết bị hoặc một thiết bị, không có mô-đun hỗn hợp. Nếu cố gắng chạy mô-đun nhiều thiết bị mà không có nhiều thiết bị, bạn sẽ thấy lỗi này:

Expected to get at least 2 controller objects, got 1

Việc thực thi mô-đun ở chế độ nhiều thiết bị sẽ giải quyết được vấn đề.

Đối với CTS: Bạn có thể sử dụng tính năng phân đoạn để kích hoạt tính năng này (Ví dụ: --shard-count 2) hoặc run cts-multidevces.