Módulos para vários dispositivos

Este documento fornece instruções detalhadas sobre como criar uma experiência multidispositivo módulos e chama as limitações atuais quando conhecidas.

A amostra

Um módulo multidispositivo CTS com reconhecimento de Wi-Fi é fornecido. Ele envia uma mensagem de um dispositivo por Wi-Fi e verifica se o outro dispositivo a recebeu.

A origem do módulo está em packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/

Anotamos o exemplo com todos os comentários que consideramos úteis.

Etapa 1: criar a pasta do módulo

Recomendamos criar uma pasta para o módulo multidispositivo do pacote ao qual ele pertence. Por exemplo: cts/hostsidetests/multidevices/. Recomendamos isso para que todos os módulos multidispositivos permaneçam posicionados pelo menos primeiro, o que facilita a descoberta de exemplos.

Todos os arquivos deste módulo precisam ser colocados em uma pasta própria. Para exemplo: wifi_aware.

Etapa 2: criar o teste

É aqui que você implementa sua lógica de teste. Depende muito do que é que estão sendo testados.

Crie a origem do teste do Mobly, por exemplo: wifi_aware_test.py ser usada.

Etapa 3: criar o arquivo de build: Android.bp

Adicione um arquivo Android.bp como packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp Defina um módulo python_test_host, semelhante a:

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

Especifique os snippets para o teste com o campo de dados, que será empacotado com o binário e pode ser localizado e instalado no teste pelo ATest ou em Execução contínua.

Os pacotes do Mobly estão disponíveis para Android em external/mobly-bundled-snippets/.

Opcional: criar snippets personalizados

Alguns módulos para vários dispositivos podem exigir snippets personalizados do Mobly. O teste de amostra inclui um snippet com reconhecimento de Wi-Fi packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java, desenvolvido com o Mobly Snippet Lib, disponível no Android em: external/mobly-snippet-lib/ (link em inglês).

O snippet precisa ser definido com a regra android_test em Android.bp da seguinte forma: instrumentação padrão:

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

Etapa 4: criar a configuração do módulo: AndroidTest.xml

Adicione um arquivo AndroidTest.xml da seguinte forma: packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml Nesta configuração, você precisa especificar dois dispositivos para o teste, semelhante a:

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

Observe que:

  • Este teste de amostra depende do Mobly. Qualquer dependência pode ser especificada para PythonVirtualenvPreparer e será instalado com pip.
  • O mobly-par-file-name para MoblyBinaryHostTest precisa corresponder ao módulo como em Android.bp.
  • Especifique um mobly-test-timeout para o teste. Está em milissegundos e aplica-se à execução do binário completo do Python (todos os casos de teste juntos). Isso é necessário para evitar que os casos de teste fiquem para sempre em caso de alguns problemas.
  • Cada tag device pode conter uma configuração distinta em cada dispositivo, o Mobly config os receberá na mesma ordem especificada no XML.

Relacionado ao snippet de APK instalação:

  • O POC inicial foi atualizado para instalar APKs de snippet por meio do target_preparer devido a uma conversa com a equipe de cobertura: Para garantir as medições de cobertura não são excluídas muito cedo, desinstalando pelo Harness em vez de código de teste em binários Python, oferecem garantias melhores em termos de tempo.

Etapa 5: executar o teste localmente: atest

No momento, os testes multidispositivo são executados apenas em dispositivos físicos. Antes de executar teste, verifique se os dispositivos de teste estão no estado correto. O comando adb devices informará a lista de dispositivos conectados. Se a lista tiver dispositivos que não se destinam a testes, especifique os dispositivos para o teste usando -s .

Para testes de Wi-Fi, verifique se o Wi-Fi está ativado nos dispositivos após a redefinição para a configuração original.

Execute o teste localmente com atest:

$ atest CtsWifiAwareTestCases

O número de dispositivos usados vai aparecer no título do resumo do teste saída, algo como Test executed with 2 device(s).

Solução de problemas

Se o teste falhar durante a execução local devido a:

Erro do Virtualenv

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

Confira se virtualenv está no seu PATH. Como adicionar "~/.local/bin" para PATH deve corrigi-lo. se o virtualenv não estiver instalado, acesse: https://virtualenv.pypa.io/en/latest/installation.html

Deve haver pelo menos dois objetos de controle, sendo 1

Os módulos de teste são para vários dispositivos ou para um único dispositivo. Não há módulos mistos. Se você tentar executar um módulo de vários dispositivos sem várias dispositivos, você verá este erro:

Expected to get at least 2 controller objects, got 1

Executar o módulo no modo de vários dispositivos vai resolver o problema.

Para CTS: é possível usar a fragmentação para acioná-la (por exemplo: --shard-count 2) ou run cts-multidevces.