Scrivere un test senza dispositivi 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 dettagli sulla scrittura di un test gestito da host che richiede un dispositivo, fare riferimento a Scrivere un test gestito da 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 (gtests) per testare una piattaforma. Se il test non richiede un dispositivo, eseguilo su un host; il test verrà eseguito molto più velocemente in questo modo. Per configurare tali test da eseguire su un host di test, utilizzare il runner TF HostGTest .

Questo è 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 del 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 tuo test non richieda una configurazione o una pulizia speciale, puoi fare affidamento sulla generazione automatica della configurazione del test per creare configurazioni di test TF adeguate.

Per configurare un gtest lato host e abilitare la generazione automatica della configurazione del test, impostare host_supported su true in Android.bp , come in hello_world_test .

Per ulteriori informazioni sulla scrittura di un test nativo, consulta Aggiunta di un nuovo esempio di test nativo .

Test host JAR

I test host JAR (Java) , come JUnit, sono test che non necessitano di essere eseguiti su un dispositivo e che forniscono la copertura del codice del tuo progetto Java. Tali test possono essere configurati per l'esecuzione su un host di test utilizzando il runner 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 del test esegue un test JUnit sul lato host di HelloWorldHostTest . Tieni presente che la configurazione di test di cui sopra può essere generata automaticamente. A meno che il tuo test non richieda una configurazione o una pulizia speciale, fai affidamento sulla generazione automatica della configurazione del test per creare la corretta configurazione del test TradeFed.

Per ulteriori dettagli su come scrivere un test host JAR, fare riferimento alla pagina Test host JAR (Java) .

Test host Java isolati

I test Java senza dispositivo possono essere eseguiti in un ambiente isolato con un leggero costo in termini di prestazioni. Tuttavia, ci sono alcune considerazioni importanti da fare prima di scegliere di utilizzare questo ambiente.

  • Questo è il runner predefinito utilizzato per i test unitari 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.
  • Il corridore di isolamento mette solo il corridore di spessore e il barattolo di prova sul percorso di classe.
  • C'è una certa quantità di spese generali fisse per ogni esecuzione di test eseguita con questo corridore.

Esempio di configurazione del test Tradefed (isolato)

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

Esempio di configurazione di Soong per la generazione automatica

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

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

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

    static_libs: [
        "junit",
    ],
}

Prove robotelettriche

I test Robolectric utilizzano lo stesso corridore dei test su host isolato, con alcune opzioni speciali.

  • L'opzione robolectric-resources consente di passare alcune opzioni della riga di comando specifiche di Robolectric al sottoprocesso e aggiunge la build ad albero di android-all al classpath del sottoprocesso. Sebbene le altre due siano 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. Ciò è necessario poiché Robolectric preferisce particolari versioni Java che potrebbero non essere in linea con la JVM preferita del sistema host.
  • L'opzioneexclude exclude-paths consente al runner del sottoprocesso di evitare del tutto di caricare particolari moduli, il che è utile quando un JAR viene fornito con 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 di Soong per l'autogenerazione Robolectric

Invece di creare manualmente la configurazione di test come sopra , Soong può generare automaticamente la configurazione utilizzando una dichiarazione come 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",
}

Prova Python

Se la logica del test è scritta in Python, utilizzare il tipo di build python_test_host per creare un file par che possa 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é TF possa accedere al test lato host per una determinata build, impostare l'impostazione `test_suites` del modulo di test su `general-tests` :

test_suites: ["general-tests"],

Con questa impostazione, il test viene compresso in general-tests.zip sulla destinazione test_suites .