멀티 디바이스 모듈

이 문서에서는 멀티스크린 모듈을 만드는 방법에 관한 단계별 안내를 제공하고 알려진 경우 현재 제한사항을 설명합니다.

샘플

CTS Wi-Fi 인식 멀티스크린 모듈이 제공됩니다. Wi-Fi를 통해 한 기기에서 메시지를 전송하고 다른 기기에서 메시지를 수신하는지 확인합니다.

모듈의 소스는 packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/에 있습니다.

Google에서는 유용하다고 생각되는 만큼 예시에 주석을 달았습니다.

1단계: 모듈 폴더 만들기

멀티스크린 모듈이 속한 도구 모음 프로젝트에 멀티스크린 모듈의 폴더를 만드는 것이 좋습니다. cts/hostsidetests/multidevices/를 예로 들 수 있습니다. 이렇게 하면 모든 멀티스크린 모듈이 적어도 처음에는 함께 배치된 상태로 유지되어 예시를 더 쉽게 검색할 수 있습니다.

이 모듈의 모든 파일은 자체 모듈 폴더에 배치해야 합니다. 예를 들면 다음과 같습니다. wifi_aware

2단계: 테스트 만들기

여기에서 테스트 로직을 구현합니다. 테스트는 대상에 따라 크게 달라집니다.

Mobly 테스트 소스(예: wifi_aware_test.py)를 만듭니다.

3단계: 빌드 파일(Android.bp) 만들기

Android.bp 파일(예: packages/modules/Wifi/tests/hostsidetests/multidevices/test/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 번들 스니펫은 Android의 external/mobly-bundled-snippets/에 제공됩니다.

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

일부 멀티 디바이스 모듈에는 맞춤 Mobly 스니펫이 필요할 수 있습니다. 샘플 테스트에는 Wi-Fi 인식 스니펫(packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java에 있음)이 포함되어 있습니다. 이는 Android의 external/mobly-snippet-lib/에서 제공되는 Mobly 스니펫 라이브러리로 빌드됩니다.

스니펫은 표준 계측처럼 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) 만들기

AndroidTest.xml 파일(예: packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/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와 함께 설치됩니다.
  • MoblyBinaryHostTestmobly-par-file-name은 Android.bp에서와 같이 모듈 이름과 일치해야 합니다.
  • 테스트의 mobly-test-timeout을 지정합니다. 이는 밀리초 단위이며 전체 Python 바이너리 실행(모든 테스트 사례 포함)에 적용됩니다. 일부 문제 발생 시 테스트 사례가 영구적으로 중단되지 않게 하는 데 필요합니다.
  • device 태그는 기기마다 고유한 설정을 포함할 수 있습니다. Mobly 구성은 XML에 지정된 동일한 순서로 이를 수신합니다.

스니펫 APK 설치와 관련된 경우:

  • 적용 범위팀과의 대화로 인해 target_preparer를 통해 스니펫 APK를 설치하도록 초기 POC가 업데이트되었습니다. 적용 범위 측정이 너무 일찍 삭제되지 않도록 하려고 Python 바이너리의 테스트 코드가 아닌 하네스로 제거하면 타이밍 측면에서 보장성이 더 높아집니다.

5단계: 로컬에서 테스트 실행하기(atest)

현재 멀티스크린 테스트는 실제 기기에서만 실행됩니다. 테스트를 실행하기 전에 테스트 기기가 적절한 상태에 있는지 확인합니다. adb devices 명령어는 연결된 기기 목록을 보고해야 합니다. 목록에 테스트용이 아닌 기기가 포함되어 있으면 -s 플래그를 사용하여 테스트용 기기를 지정합니다.

Wi-Fi 테스트의 경우 초기화 후 기기의 Wi-Fi가 사용 설정되어 있는지 확인합니다.

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

$ atest CtsWifiAwareTestCases

atest 출력의 요약 제목에 사용된 기기 수가 Test executed with 2 device(s)와 같이 표시됩니다.

문제 해결

다음과 같은 이유로 로컬에서 실행할 때 테스트가 실패하는 경우

Virtualenv 오류

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