다중 장치 제품군

이 문서는 다중 장치 모듈을 만드는 방법에 대한 단계별 지침을 제공하고 알려진 경우 현재 제한 사항을 설명합니다.

샘플

CTS Wi-Fi 인식 다중 장치 모듈이 제공됩니다. Wi-Fi를 통해 한 장치에서 메시지를 보내고 다른 장치에서 메시지를 수신하는지 확인합니다.

모듈의 소스는 cts/hostsidetests/multidevices/wifi_aware 에 있습니다.

우리는 유용하다고 생각하는 만큼의 주석을 예제에 추가했습니다.

1단계: 모듈 폴더 만들기

다중 장치 모듈이 속한 제품군 프로젝트에 폴더를 만드는 것이 좋습니다. 예: cts/hostsidetests/multidevices/ . 모든 다중 장치 모듈이 최소한 처음에는 함께 배치되어 예제를 더 쉽게 찾을 수 있도록 권장합니다.

이 모듈의 모든 파일은 자체 모듈 폴더 아래에 있어야 합니다. 예: wifi_aware .

일반적으로 모듈에 대한 OWNERS 파일이 필요하며 버그 구성 요소가 이 파일에 지정되어야 합니다. 예는 cts/hostsidetests/multidevices/wifi_aware/OWNERS 를 참조하십시오.

2단계: 테스트 만들기

여기에서 테스트 로직을 구현합니다. 테스트 대상에 크게 의존합니다.

Wi-Fi_aware_test.py 와 같은 Mobly 테스트 소스를 만듭니다.

3단계: 빌드 파일 생성: Android.bp

cts/hostsidetests/multidevices/wifi_aware/Android.bp 와 같은 Android.bp 파일을 추가합니다. 다음과 유사한 python_test_host 모듈을 정의합니다.

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",
    ],
}

바이너리로 패킹되고 ATest 또는 연속 실행으로 테스트에서 찾아 설치할 수 있는 데이터 필드를 사용하여 테스트에 대한 스니펫을 지정합니다.

Mobly Bundled Snippet은 Android의 external/mobly-bundled-snippets/ 에서 사용할 수 있습니다.

선택 사항: 맞춤 스니펫 만들기

일부 다중 장치 모듈에는 맞춤형 Mobly 스니펫이 필요할 수 있습니다. 샘플 테스트에는 cts/hostsidetests/multidevices/wifi_aware/snippet/ 의 Wi-Fi 인식 스니펫이 포함되어 있습니다. 이 스니펫은 Android의 external/mobly-snippet-lib/ 에서 사용할 수 있는 Mobly Snippet Lib로 빌드됩니다.

스니펫은 표준 계측처럼 Android.bp에서 android_test 규칙으로 정의해야 합니다.

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",
    ],
}

4단계: 모듈 구성 만들기: AndroidTest.xml

cts/hostsidetests/multidevices/wifi_aware/AndroidTest.xml 과 같은 AndroidTest.xml 파일을 추가합니다. 이 테스트 구성에서는 다음과 유사한 테스트를 위해 두 개의 장치를 지정해야 합니다.

<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>

참고:

  • 이 샘플 테스트는 Mobly에 종속되어 있습니다. PythonVirtualenvPreparer 에 대해 모든 종속성을 지정할 수 있으며 pip와 함께 설치됩니다.
  • MoblyBinaryHostTest의 MoblyBinaryHostTest mobly-par-file-name 은 Android.bp에서와 같이 모듈 이름과 일치해야 합니다.
  • 테스트에 대해 mobly-test-timeout 을 지정하십시오. 밀리초 단위이며 완전한 파이썬 바이너리 실행(모든 테스트 케이스 함께)에 적용됩니다. 이것은 일부 문제의 경우 테스트 케이스가 영원히 중단되는 것을 피하기 위해 필요합니다.
  • device 태그는 각 장치에 대한 고유한 설정을 포함할 수 있습니다. Mobly 구성은 XML에 지정된 것과 동일한 순서로 이를 수신합니다.

스니펫 APK 설치 관련:

  • Coverage 팀과의 대화로 인해 target_preparer를 통해 스니펫 apk를 설치하도록 초기 POC가 업데이트되었습니다. Coverage 측정이 너무 일찍 삭제되지 않도록 하기 위해 Python 바이너리의 테스트 코드가 아닌 Harness로 제거하는 것이 타이밍 측면에서 더 나은 보장을 제공합니다.

5단계: 로컬에서 테스트 실행: atest

현재 다중 장치 테스트는 물리적 장치에서만 실행됩니다. 테스트를 실행하기 전에 테스트 장치가 적절한 상태인지 확인하십시오. 명령 adb devices 는 연결된 장치 목록을 보고해야 합니다. 목록에 테스트용이 아닌 장치가 포함된 경우 -s 플래그를 사용하여 테스트용 장치를 지정하십시오.

Wi-Fi 테스트의 경우 기기에 Wi-Fi가 활성화되어 있는지 확인하십시오(초기화 후).

test를 사용하여 로컬에서 테스트를 실행할 수 있습니다.

$ atest CtsWifiAwareTestCases

테스트 결과의 요약 제목에 사용된 장치 수가 Test executed with 2 device(s) 같이 표시되어야 합니다.

문제 해결

다음으로 인해 로컬에서 실행할 때 테스트가 실패하는 경우:

가상 환경 오류

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

virtualenv 가 PATH에 있는지 확인하십시오. PATH에 "~/.local/bin"을 추가하면 해결됩니다. virtualenv가 설치되지 않은 경우 https://virtualenv.pypa.io/en/latest/installation.html을 따르십시오.

최소한 2개의 컨트롤러 개체를 얻을 것으로 예상되며 1개를 얻었습니다.

테스트 모듈은 다중 장치 또는 단일 장치이며 혼합 모듈은 없습니다. 다중 장치 없이 다중 장치 모듈을 실행하려고 하면 다음 오류가 표시됩니다.

Expected to get at least 2 controller objects, got 1

다중 장치 모드에서 모듈을 실행하면 문제가 해결됩니다.

CTS의 경우: 샤딩을 사용하여 트리거하거나(예: --shard-count 2) run cts-multidevces 수 있습니다.