Escriba una prueba sin dispositivo del lado host en TF

Esta página le indica cómo escribir una prueba del lado del host que no requiera un dispositivo, como una prueba que se ejecuta en una instancia de Linux GCE. (Para obtener detalles sobre cómo escribir una prueba basada en host que requiera un dispositivo, consulte Escribir una prueba basada en host en Trade Federation ).

Tipos de pruebas del lado del host

Puede ejecutar varios tipos de pruebas del lado del host a través de Trade Federation (TF).

Pruebas nativas (gtest)

Cree pruebas nativas (gtests) para probar una plataforma. Si la prueba no requiere un dispositivo, ejecútela en un host; la prueba se ejecutará mucho más rápido de esa manera. Para configurar dichas pruebas para que se ejecuten en un host de prueba, utilice el ejecutor TF HostGTest .

Esta es una configuración de prueba de TradeFed de muestra:

<configuration description="Runs hello_world_test.">
    <option name="null-device" value="true" />
    <test class="com.android.tradefed.testtype.HostGTest" >
        <option name="module-name" value="hello_world_test" />
    </test>
</configuration>

La configuración de prueba ejecuta una prueba gtest ( hello_world_test ) en un host. La configuración de prueba de ejemplo se puede generar automáticamente. A menos que su prueba necesite una configuración o limpieza especial, puede confiar en la generación automática de configuración de prueba para crear configuraciones de prueba TF adecuadas.

Para configurar un gtest del lado del host y habilitar la generación automática de configuración de prueba, configure host_supported en true en Android.bp , como en hello_world_test .

Para obtener más información sobre cómo escribir una prueba nativa, consulte Agregar un nuevo ejemplo de prueba nativa .

Pruebas de host JAR

Las pruebas de host JAR (Java) , como JUnit, son pruebas que no necesitan ejecutarse en un dispositivo y que brindan cobertura de código de su proyecto Java. Estas pruebas se pueden configurar para ejecutarse en un host de prueba utilizando el ejecutor HostTest .

Ejemplo de configuración de prueba de TradeFed

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.HostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

La configuración de prueba ejecuta una prueba JUnit del lado host de HelloWorldHostTest . Tenga en cuenta que la configuración de prueba anterior se puede generar automáticamente. A menos que su prueba necesite una configuración o limpieza especial, confíe en la generación automática de configuración de prueba para crear la configuración de prueba TradeFed adecuada.

Para obtener más detalles sobre cómo escribir una prueba de host JAR, consulte la página Pruebas de host JAR (Java) .

Pruebas de host Java aisladas

Las pruebas de Java sin dispositivo se pueden ejecutar en un entorno aislado con un ligero costo de rendimiento. Sin embargo, hay que tener en cuenta algunas consideraciones importantes antes de optar por utilizar este entorno.

  • Este es el corredor predeterminado utilizado para las pruebas unitarias de Robolectric y JUnit.
  • Tradefed solo admite pruebas JUnit en el entorno de aislamiento.
  • Solo se admiten dependencias vinculadas estáticamente. No se incluyen dependencias declaradas con lib en el classpath.
  • El corredor de aislamiento solo coloca el corredor de compensación y su frasco de prueba en el classpath.
  • Hay una cierta cantidad de gastos generales fijos por ejecución de prueba ejecutada con este ejecutor.

Ejemplo de configuración de prueba Tradefed (aislado)

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.IsolatedHostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

Ejemplo de configuración de Soong para generación automática

En lugar de crear manualmente la configuración de prueba como se muestra arriba , Soong puede generar automáticamente la configuración utilizando una declaración como este ejemplo.

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

    srcs: ["test/**/*.java"],

    static_libs: [
        "junit",
    ],
}

Pruebas roboeléctricas

Las pruebas Robolectric utilizan el mismo corredor que las pruebas de host aislado, con algunas opciones especiales.

  • La opción robolectric-resources permite pasar algunas opciones de línea de comando específicas de Robolectric al subproceso y también agrega la compilación del árbol de android-all a la ruta de clases del subproceso. Si bien las otras dos son mejores prácticas, esta opción es obligatoria para ejecutar pruebas de Robolectric con éxito.
  • La opción java-folder permite cambiar el tiempo de ejecución de Java utilizado por el subproceso. Esto es necesario debido a que Robolectric prefiere determinadas versiones de Java que podrían no alinearse con la JVM preferida del sistema host.
  • La opción exclude-paths permite al ejecutor del subproceso evitar cargar módulos particulares, lo cual es útil cuando un JAR viene con clases extrañas que podrían causar errores de carga. java. es una exclusión común, para evitar generar excepciones SecurityException .

Ejemplo de configuración de Robolectric

<configuration description="Executes a Sample Robolectric Test">
    <option name="java-folder" value="prebuilts/jdk/jdk9/linux-x86/" />
    <option name="exclude-paths" value="java" />
    <option name="use-robolectric-resources" value="true" />
    <test class="com.android.tradefed.testtype.IsolatedHostTest">
        <option name="jar" value="RobolectricExampleTest.jar" />
    </test>
</configuration>

Ejemplo de configuración de Soong para autogeneración Robolectric

En lugar de crear manualmente la configuración de prueba como se muestra arriba , Soong puede generar automáticamente la configuración utilizando una declaración como este ejemplo.

android_robolectric_test {
    name: "HelloWorldRoboTest",
    srcs: [
        "src/**/*.java",
    ],

    // Include the testing libraries
    static_libs: [
        "mockito-robolectric-prebuilt",
        "platform-test-annotations",
        "testng",
        "truth-prebuilt",
    ],

    instrumentation_for: "HelloWorldApp",
}

prueba de pitón

Si la lógica de prueba está escrita en Python, use el tipo de compilación python_test_host para crear un archivo par que pueda ejecutar TF PythonBinaryHostTest .

Ejemplo de configuración de prueba de TradeFed

<configuration description="Config to run atest unittests">
    <test class="com.android.tradefed.testtype.python.PythonBinaryHostTest" >
        <option name="par-file-name" value="atest_unittests" />
        <option name="test-timeout" value="2m" />
    </test>
</configuration>

Configuración del conjunto de pruebas

Para que TF pueda acceder a la prueba del lado del host para una compilación determinada, establezca la configuración del módulo de prueba `test_suites` en `general-tests` :

test_suites: ["general-tests"],

Con esta configuración, la prueba se empaqueta en general-tests.zip en el destino test_suites .