Cómo escribir una prueba sin dispositivos del host en TF

En esta página, se explica cómo escribir una prueba del host que no requiera un dispositivo, como una prueba que se ejecuta en una instancia de GCE de Linux. (Para obtener detalles sobre cómo escribir una prueba dirigida por el host que requiere un dispositivo, consulta Cómo escribir una prueba dirigida por el host en Trade Federation).

Tipos de pruebas del host

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

Pruebas nativas (gtest)

Crea pruebas nativas (gtests) para probar una plataforma. Si la prueba no requiere un dispositivo, ejecútala en un host. De esta manera, la prueba se ejecutará mucho más rápido. Para configurar esas pruebas para que se ejecuten en un host de prueba, usa el ejecutor de TF HostGTest.

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

<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 tu prueba necesite una configuración o limpieza especiales, puedes usar la generación automática de configuración de prueba para crear configuraciones de prueba de TF adecuadas.

Para configurar un gtest del host y habilitar la generación automática de la configuración de prueba, establece 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, consulta Cómo agregar un ejemplo de prueba nativa nueva.

Pruebas de host de JAR

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

Configuración de prueba de TradeFed de muestra

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

La configuración de la prueba ejecuta una prueba JUnit del host de HelloWorldHostTest. Ten en cuenta que la configuración de prueba anterior puede generarse automáticamente. A menos que tu prueba necesite una configuración o limpieza especiales, usa la generación automática de configuración de prueba para crear la configuración de prueba de TradeFed adecuada.

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

Pruebas de host de Java aisladas

Las pruebas de Java sin dispositivos se pueden ejecutar en un entorno de aislamiento con un ligero costo de rendimiento. Sin embargo, hay algunas consideraciones importantes que debes tener en cuenta antes de elegir usar este entorno.

  • Este es el ejecutor predeterminado que se usa para las pruebas de unidades de Robolectric y JUnit.
  • Tradefed solo admite pruebas de JUnit en el entorno de aislamiento.
  • Solo se admiten dependencias vinculadas de forma estática. No se incluyen dependencias declaradas con lib en la ruta de acceso a clases.
  • El ejecutor de aislamiento solo coloca el ejecutor de shim y el jar de prueba en la ruta de acceso de clases.
  • Hay una cantidad fija de sobrecarga por ejecución de prueba que se ejecuta con este ejecutor.

Configuración de prueba de Tradefed de muestra (aislada)

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

Configuración de Soong de muestra para la generación automática

En lugar de crear la configuración de prueba de forma manual como se muestra anteriormente, Soong puede generar la configuración automáticamente con una declaración como la de este ejemplo.

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

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

    static_libs: [
        "junit",
    ],
}

Pruebas de Robolectric

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

  • La opción robolectric-resources permite que se pasen algunas opciones de línea de comandos específicas de Robolectric al subproceso y agrega la compilación de árbol de android-all a la ruta de acceso de clases del subproceso. Si bien las otras dos son prácticas recomendadas, esta opción es obligatoria para ejecutar pruebas de Robolectric con éxito.
  • La opción java-folder permite cambiar el entorno de ejecución de Java que usa el subproceso. Esto es necesario porque Robolectric prefiere versiones particulares de Java que podrían no alinearse con la JVM preferida del sistema host.
  • La opción exclude-paths permite que el ejecutor de subprocesos evite cargar módulos particulares, lo que es útil cuando un archivo JAR incluye clases ajenas que podrían causar errores de carga. java. es una exclusión común para evitar arrojar excepciones SecurityException.

Configuración de Robolectric de muestra

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

Configuración de Soong de ejemplo para la generación automática de Robolectric

En lugar de crear la configuración de prueba de forma manual como se muestra anteriormente, Soong puede generar automáticamente la configuración con una declaración como la de 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 Python

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

Configuración de prueba de TradeFed de muestra

<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 paquete de pruebas

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

test_suites: ["general-tests"],

Con este parámetro de configuración, la prueba se empaqueta en general-tests.zip en el destino test_suites.