2015-04-03 2 views
58

Ho impostato il mio grado di script. Quando eseguo la build Gradle, tutto funziona e vengono eseguiti i test jUnit.Come eseguire il test Gradle quando tutti i test sono AGGIORNATI?

Dopo di che quando ho eseguito il test Gradle ottengo il seguente:

C:\Users\..\..\Project>gradle test 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:compileTestJava UP-TO-DATE 
:processTestResources UP-TO-DATE 
:testClasses UP-TO-DATE 
:test UP-TO-DATE 

Quando si esegue gradle clean, quindi Gradle costruire opere, ovviamente ... Voglio essere in grado di ripristinare solo i test , non costruire l'intero progetto: come dovrei farlo?

+3

Questo sembra non necessario, in base alle informazioni fornite. Se non sono stati modificati né il codice dell'applicazione né il codice di prova, perché è necessario rieseguire i test? – Jolta

+1

@Jolta Alcuni dei test nel mio codice sono relativi a input a 3 parti, sto eseguendo i miei test non solo per assicurarmi di non aver inserito alcun bug nel codice, anche per verificare se qualcosa cambia sul 3-party input che sto ricevendo – USer22999299

+2

Mi spiace essere pignolo, ma non penso che questo sia il modo corretto di pensare a questo: se hai input a 3 partiti variabili non è il modo corretto di trattare questo con prendi in giro questi input in qualche modo? I test dovrebbero in realtà riguardare il test del codice che stai scrivendo. Non sei in evidente pericolo di ottenere falsi positivi se ti affidi all'input di 3 persone per essere inaccettabile? La strategia non dovrebbe essere quella di gestire l'immissione dei problemi come parte del codice dell'app? –

risposta

72

Un'opzione utilizza il flag --rerun-tasks nello command line. Questo eseguirà nuovamente tutte le attività di test e tutte le attività da cui dipende.

Se si è interessati solo a rieseguire i test, un'altra opzione sarebbe quella di rendere gradle clean i risultati dei test prima di eseguire i test. Questo può essere fatto usando l'attività cleanTest.

Alcuni background: il plug-in Java definisce un'attività pulita per ciascuna delle altre attività. Secondo il documentation:

cleanTaskName - Elimina i file creati da attività specificato. cleanJar cancellerà il file JAR creato dall'attività jar e cleanTest eliminerà i risultati del test creati dall'attività di test.

Pertanto, tutto ciò che serve al fine di ri-eseguire i test è quello di eseguire anche il compito cleanTest, vale a dire:
gradle cleanTest test

16

altra opzione sarebbe quella di aggiungere in seguito nel vostro build.gradle:

test.outputs.upToDateWhen {false} 
+1

Ho usato questa tecnica per un ' funcTest' task che ho creato per eseguire test funzionali. – pharsicle

+0

Questo è un approccio molto migliore rispetto alla risposta accettata, in quanto verrà applicato solo all'attività desiderata. Il 'upToDateWhen' può essere utilizzato in qualsiasi modo" guidato dal codice "come proprietà di sistema, variabili di ambiente, proprietà del progetto, ecc. – mkobit

1

Inoltre, dover aggiungere --rerun-tasks è veramente ridondante. Non succede mai Creare un --no-rerun-tasks e fare --rerun-tasks default quando cleanTask

10

Ecco una soluzione che utilizza il file "build.gradle", nel caso in cui non si vuole modificare la riga di comando:

test { 
    dependsOn 'cleanTest' 
    //Your previous task details (if any) 
} 

Ed ecco l'output. Notare 2 modifiche rispetto all'output precedente:

1) Nell'output viene visualizzato un nuovo task "cleanTest".

2) "test" viene sempre pulito (ad es.mai 'UP-TO-DATE') in modo che venga eseguito ogni volta:

$ gradle build 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:findMainClass 
:jar 
:bootRepackage 
:assemble 
:cleanTest 
:compileTestJava UP-TO-DATE 
:processTestResources UP-TO-DATE 
:testClasses UP-TO-DATE 
:test 
:check 
:build 
0

Penso che questa sia una domanda valida dato che è possibile in Gradle per eseguire questo comando test, e quello che succede è che non succede nulla !

Ma vorrei mettere in dubbio la necessità di farlo, come ha detto Jolta nel suo commento: se nessun codice è cambiato perché è necessario ripetere il test? Se hai dubbi sull'input di terze parti, direi che devi tener conto di ciò nel codice dell'app. Se temi che il tuo codice possa essere "sfocato", cioè in grado di superare tutti i test per la prima volta ma non un secondo (o la 100a volta), non hai bisogno di riflettere sul motivo per cui hai questi dubbi e affrontali?

Personalmente penso che questo sia un (molto minore) errore di progettazione in Gradle: se tutto è completamente up-to-date, piuttosto che andare "COSTRUIRE DI SUCCESSO" si dovrebbe dire "NO Modifica a partire dall'ultimo BUILD SUCCESSFUL: nulla di fatto" .

+2

" non hai bisogno di pensare al motivo per cui hai questi dubbi e affrontali? ": Sì, ma per avere i dati a cui pensare, vorrei eseguire i test un paio di volte e vedere cosa succede. È così pazzo? – mhsmith

+0

Voto precedente? Un po 'arsh mate. Specialmente con (sospiro) nessuna spiegazione, probabilmente suggerendo che è stata fatta da un punto di vista dell'ignoranza ... Dimostrami che ho torto. –

+0

@mikerodent Sono parzialmente d'accordo con il tuo punto. Ci sono casi "facili", in genere semplici test dell'unità whitebox, in cui nessun cambio di codice significa nulla da ripetere. Pensa ai test con le dipendenze però. "Oh sì, la finestra mobile non funzionava ecc." Ci sono test in cui è l'infrastruttura (e in dev you) che imposta le dipendenze (sono "fornite") e non la build. In questi casi voglio sempre essere in grado di rieseguire. – dbalakirev