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 connectedInstrumentTest
proprietà (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.
Quindi 'connectedAndroidTest' esegue effettivamente' build' e 'compile'? –
'@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