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 ..

È stato utile?

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.

http://ant.apache.org/manual/Tasks/junit.html

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top