2015-07-30 4 views
7

Voglio capire di più sull'attività ConnectedAndroidTest Gradle. Vedo che è usato per installare l'applicazione e testare gli apk ed eseguire i test.Quali sono le liste di attività eseguite da ConnectedAndroidTest?

Ma quali sono i singoli passaggi che fa? (eventuali attività gradle)

"gradle build" sembra generare l'apk dell'applicazione. Quale attività genera l'apk di test? E come funziona (ConnectedAndroidTest) installare l'applicazione e testare l'apk? E come inizia i test?

Grazie mille.

risposta

17

Il mio primo SO rispondere, si prega di essere gentile;)

Ma quali sono le singole fasi che lo fa? (Compiti Gradle se presente)

Quindi, se volete una panoramica di alto livello di ciò compiti ConnectedAndroidTest dipende, solo in esecuzione ./gradlew connectedAndroidTest o ./gradlew cAT (senza l'opzione -q) sarà in uscita il nome di ogni attività che cAT dipende da prima che sia eseguito da solo. Il compito in sé non può avere altri compiti al suo interno, ma può dipendere da altri che lo precedono.

Dalla risposta this, l'attività gradle build è in realtà qualcosa di java correlata e non è ciò che è responsabile della creazione dell'apk di test. Invece, è l'attività assembleAndroidTest che arriva prima dello connectedAndroidTest che lo fa. Hai ragione riguardo allo connectedAndroidTest, ma in realtà installa ed esegue l'apk di test. Ma arriverò a come un po '. Il resto della mia risposta va più nel dettaglio di quanto sia necessario per utilizzare l'attività in modo efficace, ma è utile se vuoi capire come funziona.

Alcuni retroscena
Come molti altri Android Gradle plug-in attività, connectedAndroidTest è effettivamente messo insieme ad un certo punto nella fase di esecuzione a causa delle diverse varianti di build (debug, release, sapore 1, 2 ecc sapore). Quindi connectedAndroidTest non è disponibile nella fase di configurazione (quando viene eseguita la maggior parte della logica di script di build). Invece, una volta creato, è impostato come connectedInstrumentTestproprietà (in pratica, un campo) della proprietà testVariants nell'oggetto android.

Come esempio di chiarimenti, se si desidera accedere a questo compito di manipolare in qualche modo (magari aggiungere un Action alla fine di esso), si può fare qualcosa di simile nel file build.gradle:

android { 
    testVariants.all { variant -> 
    variant.connectedInstrumentTest.doLast { 
     println "This will be executed right after our connectedInstrumentTest!" 
     println "The name of the test type: $connectedInstrumentTest.name" 
     println "The type of test $connectedInstrumentTest.class"  
    } 
    } 
} 

e quindi eseguire ./gradlew -q cAT

quindi, ecco, io sono l'aggiunta un'azione alla fine di qualsiasi compito è stato costruito e assegnato alla proprietà connectedInstrumentTest, che è annidato abbastanza profonda nell'oggetto android. Questo compito sarà probabilmente connectedDebugAndroidTest o qualcosa di simile.

Cosa sta facendo?
Ora, dalla proprietà type che ho inserito nell'ultima println, possiamo vedere che la classe dell'attività è in realtà com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask_Decorated.Per essere onesti, non sono ancora troppo sicuro da dove provenga la parte , ma una ricerca su Google per il resto del nome della classe ci fornisce lo source code per la classe base dell'attività.

L'attività principale Action è denominata runTests() e mostra più o meno come l'attività esegue ciò che fa. Se segui un po 'il codice sorgente, alla fine scopri che il comando adb pm install verrà utilizzato per installare l'apk.

Anche se non riuscivo a trovarlo, ho il sospetto che da qualche altra parte si usi il comando adb adb shell am instrument -w com.package.name/android.support.test.runner.AndroidJUnitRunner per guidare finalmente i test.

Quindi spero che non sia stato troppo confuso - ho imparato la maggior parte di questo molto recentemente così alcune cose potrebbero non essere al 100%. Suggerirei di utilizzare i documenti gradle, in particolare come creare un plug-in personalizzato e un'attività personalizzata, e anche la documentazione degli strumenti Android gradle plug-in.

+0

Quindi 'connectedAndroidTest' esegue effettivamente' build' e 'compile'? –

+0

'@IgorGanapolsky,' connectedAndroidTest' dipende direttamente da 'assembleDebug' (assembla l'APK di debug) e' assembleDebugAndroidTest' (assembla l'APK di test). Questi due compiti compilano tutto. Ci sono anche le attività 'installDebug' e' installDebugAndroidTest', ma non sono chiaro esattamente dove si trovano nell'albero delle dipendenze. Devono succedere dopo le attività di 'assemble *' e prima che i test funzionino (ovviamente), ma non sono sicuro di dove. – AutonomousApps

2

Per rispondere alla domanda più generale "quale è l'elenco delle attività che esegue l'attività <taskName>?", Esistono due semplici modi per individuarlo per qualsiasi attività specificata.

Il primo è:

./gradlew tasks --all | grep <taskName> 

dove <taskName> dovrebbe essere sostituito con qualsiasi compito che ti interessano. Ad es., ./gradlew tasks --all | grep connectedDebugAndroidTest. Tieni presente che sto analizzando il numero grep per risparmiarmi la fatica di passare manualmente alla lista di tutte le attività.

La seconda è:

utilizzare il plugin task-tree. Una volta applicato, l'utilizzo è simile al seguente:

./gradlew <taskName> taskTree 

Oppure, come faccio di solito preferisco:

./gradlew <taskName> taskTree --no-repeat -quiet 

Quest'ultima opzione rende l'uscita un po 'meno ingombrante.