2013-10-10 10 views
5

Sto utilizzando il test awesome plugin from Jake Wharton per le unità Android. Il mio obiettivo di prendere la briga di far funzionare questi test unitari è la velocità (feedback rapido TDD e tutto).Eseguire un singolo test Android (unità) da gradle senza caricare altre dipendenze di progetto

Sono riuscito a configurare correttamente e hanno alcune prove del campione in esecuzione come segue:

./gradlew test 

Ogni volta che esegue il test se ho notato il seguente output:

Relying on packaging to define the extension of the main artifact has been deprecated and is scheduled to be removed in Gradle 2.0 
The Test.testReportDir property has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the Test.getReports().getHtml().getDestination() property instead. 
The TaskContainer.add() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the create() method instead. 
:mySampleApp:preBuild UP-TO-DATE 
:mySampleApp:preDebugBuild UP-TO-DATE 
:mySampleApp:preReleaseBuild UP-TO-DATE 
:libraries:facebook:compileLint 
:libraries:facebook:copyReleaseLint UP-TO-DATE 
:libraries:facebook:mergeReleaseProguardFiles UP-TO-DATE 
:libraries:facebook:packageReleaseAidl UP-TO-DATE 
:libraries:facebook:preBuild UP-TO-DATE 
:libraries:facebook:preReleaseBuild UP-TO-DATE 
:libraries:facebook:prepareReleaseDependencies 
:libraries:facebook:compileReleaseAidl UP-TO-DATE 
:libraries:facebook:compileReleaseRenderscript UP-TO-DATE 
:libraries:facebook:generateReleaseBuildConfig UP-TO-DATE 
:libraries:facebook:mergeReleaseAssets UP-TO-DATE 
:libraries:facebook:mergeReleaseResources UP-TO-DATE 
:libraries:facebook:processReleaseManifest UP-TO-DATE 
:libraries:facebook:processReleaseResources UP-TO-DATE 
:libraries:facebook:generateReleaseSources UP-TO-DATE 
:libraries:facebook:compileRelease UP-TO-DATE 
:libraries:facebook:processReleaseJavaRes UP-TO-DATE 
:libraries:facebook:packageReleaseJar UP-TO-DATE 
:libraries:facebook:packageReleaseLocalJar UP-TO-DATE 
:libraries:facebook:packageReleaseRenderscript UP-TO-DATE 
:libraries:facebook:packageReleaseResources UP-TO-DATE 
:libraries:facebook:bundleRelease UP-TO-DATE 
:mySampleApp:prepareComAndroidSupportAppcompatV71800Library UP-TO-DATE 
:mySampleApp:preparemySampleAppandroidLibrariesFacebookUnspecifiedLibrary UP-TO-DATE 
:mySampleApp:prepareDebugDependencies 
:mySampleApp:compileDebugAidl UP-TO-DATE 
:mySampleApp:compileDebugRenderscript UP-TO-DATE 
:mySampleApp:generateDebugBuildConfig UP-TO-DATE 
:mySampleApp:mergeDebugAssets UP-TO-DATE 
:mySampleApp:mergeDebugResources UP-TO-DATE 
:mySampleApp:processDebugManifest UP-TO-DATE 
:mySampleApp:processDebugResources UP-TO-DATE 
:mySampleApp:generateDebugSources UP-TO-DATE 

Gradle sembra caricare TUTTE le dipendenze per il mio progetto.

Il mio test di esempio è la seguente:

package com.mycompany.mysampleapp; 

import org.junit.Test; 

import static org.fest.assertions.api.Assertions.assertThat; 

public class AdditionOperationsTest { 
    @Test public void testModulus() { 
    assertThat(1).isEqualTo(1); 
    } 
} 

Questo test dovrebbe effettivamente prendere una frazione di secondo per l'esecuzione. La mia comprensione è che tutto il precaricamento delle dipendenze del progetto sta impantanando.

Nei giorni buoni, vorrei essere sicuro di avere quello che mi serve nel CLASSPATH e proprio eseguire qualcosa di simile:

javac src/test/java/main/java/com/micromobs/pkk/AdditionOperationsTest.java 
java org.junit.runner.JUnitCore com.micromobs.pkk.AdditionOperationsTest 

Considerando che questo è un progetto Android con Gradle, sto assumendo mi sarebbe fare qualcosa di leggermente diverso come creare compiti specifici nel file gradle build, che include solo i miei file di test per il mio progetto di esempio, e quindi eseguire un comando gradle ./gradlew taskName?

Domanda: E 'possibile eseguire il singolo test "AdditionOperationsTest" nel contesto del mio progetto (com.mycompany.mysampleapp) da solo in modo che non carica le dipendenze di progetto esterni

Ecco come la mia configurazione file attualmente assomigliano:

# settings.gradle 
include ':libraries:gradle-android-test-plugin' 
include ':libraries:facebook', ':mysampleapp' 

# build.gradle 
... 
apply plugin: 'android-test' 

dependencies { 
    testCompile 'junit:junit:4.10' 
    testCompile 'org.robolectric:robolectric:2.1.+' 
    testCompile 'com.squareup:fest-android:1.0.+' 
} 

# location of my test files: 
androidproj/mysampleapp/src/test/java/main/com/mycompany/mysampleapp/AdditionOperationsTest.java 
+0

Sto provando a risolvere lo stesso problema. Penso che la cosa da fare sia avere un progetto multi-modulo in modo che i test esistano in un modulo separato, ma spero che non sia necessario. – Turnsole

+0

Sì, davvero non voglio rompere i miei test in moduli diversi. Sento che vorrei perdere la bontà di aver spostato il nostro intero progetto al gradle. Spero che questo sia solo un parametro stupido che devo aggiungere o un compito che devo dichiarare, che ignorerà le dipendenze esterne del progetto ed eseguirà il test esatto a cui punto e solo le dipendenze che richiede. –

risposta

4

Si dovrebbe essere in grado di farlo utilizzando il -acommand line option (senza ricostruzione delle dipendenze del progetto). L'esecuzione di gradle -a test dovrebbe comportare la mancata ricostruzione dei progetti libraries:facebook e mysampleapp.

MODIFICA: Come indicato di seguito, è possibile migliorare in modo significativo le prestazioni della build di Gradle utilizzando lo Gradle daemon.

+0

Grazie Benjamin, wow, è assolutamente giusto. Aggiungendo l'argomento si è assicurato che Facebook Lib non fosse stato ricostruito. Tuttavia noto che mi sono rasato solo pochi mseconds. Non ha fatto drasticamente accelerare il mio test :(Qualche suggerimento che puoi fornire per velocizzare il test, ad esempio come un lazy loading delle dipendenze solo se usato? Il test che ho non usa alcuna parte del "framework" e così Cheers dovrebbe essere eseguito veramente veloce Cheers –

+0

Non che io sappia. Quanto dura il test per eseguire? Potresti voler capire perché in realtà ci vuole tutto il tempo che ci vuole al momento (ad esempio il test effettua chiamate a sistemi esterni). –

+0

Tempo totale: 10,612 secondi. Penso che abbia più a che fare con l'installazione perché la classe di test per dire è solo una lezione di prova fittizia (esattamente la stessa di quella che ho postato nella domanda) che dovrebbe essere eseguita istantaneamente. Penso che gradle stia ricalcolando/ricompilando o facendo qualcosa per preparare l'intero progetto prima di eseguire un singolo test. –