Eseguire incondizionatamente un'attività in formica?
-
02-07-2019 - |
Domanda
Sto cercando di definire un'attività che emette (usando l'eco) un messaggio quando una destinazione completa l'esecuzione, indipendentemente dal fatto che quella destinazione abbia avuto successo o meno. In particolare, la destinazione esegue un'attività per eseguire alcuni test unitari e desidero emettere un messaggio che indica dove sono disponibili i risultati:
<target name="mytarget">
<testng outputDir="${results}" ...>
...
</testng>
<echo>Tests complete. Results available in ${results}</echo>
</target>
Sfortunatamente, se i test falliscono, l'attività fallisce e l'esecuzione si interrompe. Quindi il messaggio viene emesso solo se i test passano, l'opposto di quello che voglio. So di poter mettere l'attività prima dell'attività, ma questo renderà più facile per gli utenti perdere questo messaggio. È quello che sto cercando di fare?
Aggiornamento: risulta che sono stupido. Ho avuto haltOnFailure = & Quot; true & Quot; nel mio < testng > compito, che spiega il comportamento che stavo vedendo. Ora il problema è che l'impostazione su false fa sì che la compilazione generale della formica abbia successo anche se i test falliscono, il che non è quello che voglio. La risposta che segue usando l'attività sembra che potrebbe essere quello che voglio ..
Soluzione
La soluzione al tuo problema è utilizzare failureProperty
insieme alla proprietà haltOnFailure
dell'attività di testng in questo modo:
<target name="mytarget">
<testng outputDir="${results}" failureProperty="tests.failed" haltOnFailure="false" ...>
...
</testng>
<echo>Tests complete. Results available in ${results}</echo>
</target>
Quindi, altrove quando vuoi che la build fallisca, aggiungi un codice ant come questo:
<target name="doSomethingIfTestsWereSuccessful" unless="tests.failed">
...
</target>
<target name="doSomethingIfTestsFailed" if="tests.failed">
...
<fail message="Tests Failed" />
</target>
Puoi quindi chiamare doSomethingIfTestsFailed dove vuoi che la tua formica fallisca.
Altri suggerimenti
Puoi usare un blocco try-catch in questo modo:
<target name="myTarget">
<trycatch property="foo" reference="bar">
<try>
<testing outputdir="${results}" ...>
...
</testing>
</try>
<catch>
<echo>Test failed</echo>
</catch>
<finally>
<echo>Tests complete. Results available in ${results}</echo>
</finally>
</trycatch>
</target>
Secondo Ant docs , ci sono due proprietà che controllano se il processo di compilazione viene interrotto o meno se l'attività testng fallisce:
haltonfailure : interrompe il processo di creazione se si è verificato un errore durante il prova. Il valore predefinito è false.
haltonskipped : interrompe il processo di creazione se esiste almeno un test saltato. L'impostazione predefinita è false.
Non posso dire dallo snippet se stai impostando questa proprietà oppure no. Potrebbe valere la pena provare a impostare esplicitamente haltonfailure su false se è attualmente impostato su true.
Inoltre, supponendo che tu stia usando < exec > funzionalità in Ant, ci sono proprietà simili per controllare cosa succede se il comando eseguito fallisce:
failonerror : interrompe il processo di generazione se il comando termina con un codice di ritorno segnalazione non riuscita. Il valore predefinito è false.
failifexecutionfails : interrompi la generazione se non possiamo avviare il programma. Il valore predefinito è true.
Non posso dirlo in base allo snippet di codice parziale nel tuo post, ma suppongo che il colpevole più probabile sia failonerror o haltonfailure impostato su true.
Anche se stai mostrando un compito falso chiamato " testng " nel tuo esempio suppongo che tu stia usando il target junit.
In questo caso, è strano vedere questi risultati perché il target junit di default NON interrompe l'esecuzione in caso di fallimento del test.
Esiste un modo per dire effettivamente a ant di arrestare la compilazione su un errore o un errore junit usando gli attributi halt, ad es. haltonfailure :
<target name="junit" depends="junitcompile">
<junit printsummary="withOutAndErr" fork="yes" haltonfailure="yes">
Tuttavia, sia haltonfailure che haltonerror sono di default disattivati. Suppongo che potresti controllare il tuo file di build per vedere se una di queste bandiere è stata impostata. Possono anche essere impostati a livello globale, quindi una cosa che potresti provare è di impostarlo esplicitamente su & Quot; no & Quot; sulla propria attività per assicurarsi che venga sovrascritto nel caso in cui sia impostato nell'ambito globale.
Puoi eseguire il fork dell'attività di testng? Se sì, allora potresti voler usare quella funzione in modo che l'attività di testng venga eseguita su una JVM diversa.