Scrivere un test senza dispositivo lato host in TF

Questa pagina spiega come scrivere un test lato host che non richiede un dispositivo, ad esempio un test eseguito su un'istanza GCE Linux. Per informazioni dettagliate sulla scrittura di un test basato sull'host che richiede un dispositivo, consulta la pagina Scrivere un test basato sull'host in Trade Federation.

Tipi di test lato host

Puoi eseguire diversi tipi di test lato host tramite Trade Federation (TF).

Test nativi (gtest)

Crea test nativi (gtest) per testare una piattaforma. Se il test non richiede un dispositivo, eseguilo su un host; in questo modo, il test verrà eseguito molto più velocemente. Per configurare l'esecuzione di questi test su un host di test, utilizza l'esecutore TF HostGTest.

Ecco un esempio di configurazione di test TradeFed:

<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 configurazione di test esegue un test gtest (hello_world_test) su un host. La configurazione di test di esempio può essere generata automaticamente. A meno che il test non richieda una configurazione o una pulizia speciale, puoi fare affidamento sulla generazione automatica della configurazione di test per creare configurazioni di test TF appropriate.

Per configurare un gtest lato host e attivare la generazione automatica della configurazione di test, imposta host_supported su true in Android.bp, come in hello_world_test.

Per ulteriori informazioni sulla scrittura di un test nativo, consulta Aggiungere un nuovo test nativo Esempio.

Test host JAR

I test host JAR (Java), come JUnit, sono test che non devono essere eseguiti su un dispositivo e che forniscono la copertura del codice del tuo progetto Java. Questi test possono essere configurati per essere eseguiti su un host di test utilizzando l'esecutore HostTest.

Esempio di configurazione di test TradeFed

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

La configurazione di test esegue un test JUnit lato host di HelloWorldHostTest. Tieni presente che la configurazione di test riportata sopra può essere generata automaticamente. A meno che il test non richieda una configurazione o una pulizia speciale, fai affidamento sulla generazione automatica della configurazione di test per creare una configurazione di test TradeFed appropriata.

Per ulteriori dettagli su come scrivere un test host JAR, consulta la pagina Test host JAR (Java).

Test host Java isolati

I test Java senza dispositivo possono essere eseguiti in un ambiente di isolamento con un leggero costo in termini di prestazioni. Tuttavia, prima di scegliere di utilizzare questo ambiente, è necessario tenere in considerazione alcuni aspetti importanti.

  • Questo è l'esecutore predefinito utilizzato per i test delle unità Robolectric e JUnit.
  • Tradefed supporta solo i test JUnit nell'ambiente di isolamento.
  • Sono supportate solo le dipendenze collegate staticamente. Nessuna dipendenza dichiarata con lib è inclusa nel classpath.
  • L'esecutore di isolamento inserisce solo l'esecutore shim e il JAR di test nel classpath.
  • Esiste un overhead fisso per ogni esecuzione di test eseguita con questo esecutore.

Esempio di configurazione di test Tradefed (isolata)

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

Esempio di configurazione Soong per la generazione automatica

Anziché creare manualmente la configurazione di test come sopra, Soong può generare automaticamente la configurazione utilizzando una dichiarazione come in questo esempio.

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

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

    static_libs: [
        "junit",
    ],
}

Test Robolectric

I test Robolectric utilizzano lo stesso esecutore dei test host isolati, con alcune opzioni speciali.

  • L'opzione robolectric-resources consente di passare alcune opzioni della riga di comando specifiche di Robolectric al sottoprocesso, nonché di aggiungere la build dell'albero di android-all al classpath del sottoprocesso. Mentre le altre due sono best practice, questa opzione è obbligatoria per eseguire i test Robolectric con successo.
  • L'opzione java-folder consente di modificare il runtime Java utilizzato dal sottoprocesso. Questo è necessario perché Robolectric preferisce versioni Java specifiche che potrebbero non essere in linea con la JVM preferita del sistema host.
  • L'opzione exclude-paths consente all'esecutore del sottoprocesso di evitare del tutto il caricamento di moduli specifici, il che è utile quando un JAR include classi estranee che potrebbero causare errori di caricamento. java. è un'esclusione comune per evitare di generare eccezioni SecurityException.

Esempio di configurazione 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>

Esempio di configurazione Soong per la generazione automatica di Robolectric

Anziché creare manualmente la configurazione di test come sopra, Soong può generare automaticamente la configurazione utilizzando una dichiarazione come in questo esempio.

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

Test Python

Se la logica di test è scritta in Python, utilizza il tipo di compilazione python_test_host per creare un file par che può essere eseguito da TF PythonBinaryHostTest.

Esempio di configurazione di test 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>

Impostazione della suite di test

Affinché il test lato host sia accessibile da TF per una determinata build, imposta l'impostazione del modulo di test `test_suites` su `general-tests`:

test_suites: ["general-tests"],

Con questa impostazione, il test viene pacchettizzato in general-tests.zip nella destinazione test_suites.