2008-09-24 9 views
6

J'essaie de définir une tâche qui émet (en utilisant echo) un message quand une cible termine l'exécution, qu'elle soit réussie ou non. Plus précisément, la cible exécute une tâche à exécuter des tests unitaires, et je veux émettre un message indiquant où les résultats sont disponibles:Exécuter inconditionnellement une tâche dans Ant?

<target name="mytarget"> 
    <testng outputDir="${results}" ...> 
    ... 
    </testng> 
    <echo>Tests complete. Results available in ${results}</echo> 
</target> 

Malheureusement, si les tests échouent, la tâche échoue et l'exécution avorte. Donc, le message est seulement sorti si les tests passent - le contraire de ce que je veux. Je sais que je peux mettre la tâche avant la tâche, mais cela permettra aux utilisateurs de manquer ce message plus facilement. Est ce que j'essaye de faire possible?

Mise à jour: Il s'avère que je suis bête. J'ai eu haltOnFailure = "true" dans ma tâche <testng>, ce qui explique le comportement que je voyais. Maintenant, le problème est que la définition de false entraîne la réussite de la génération de fourmis globale même si les tests échouent, ce qui n'est pas ce que je veux. La réponse ci-dessous à l'aide de la tâche semble que ce pourrait être ce que je veux ..

+0

Quel est le réglage de votre attribut haltonfailure? – toolkit

Répondre

4

La solution à votre problème est d'utiliser le failureProperty conjointement avec la propriété haltOnFailure de la tâche testng comme ceci:

<target name="mytarget"> 
    <testng outputDir="${results}" failureProperty="tests.failed" haltOnFailure="false" ...> 
    ... 
    </testng> 
    <echo>Tests complete. Results available in ${results}</echo> 
</target> 

Puis, ailleurs si vous voulez que la compilation vous ne parvenez pas ajouter du code fourmi comme celui-ci :

<target name="doSomethingIfTestsWereSuccessful" unless="tests.failed"> 
    ... 
</target> 

<target name="doSomethingIfTestsFailed" if="tests.failed"> 
    ... 
    <fail message="Tests Failed" /> 
</target> 

vous pouvez ensuite appeler doSomethingIfTestsFailed où vous voulez que votre fourmi echec de.

+0

Je devais ajouter une dépendance à doSomethingIfTestsFailed, mais cela a fonctionné. Merci! –

5

Selon le Ant docs, il y a deux propriétés qui contrôlent si le processus de construction est arrêté ou pas si la tâche testng échoue:

haltonfailure - Arrêtez le processus de construction si une erreur s'est produite lors du test . Par défaut à false.

haltonskipped - Arrêtez le processus de construction s'il y a au moins un test ignoré. La valeur par défaut est false.

Je ne peux pas dire à partir de l'extrait si vous définissez cette propriété ou non. Peut être utile d'essayer de définir explicitement haltonfailure sur false si elle est actuellement définie sur true.

En outre, en supposant que vous utilisez la < exec fonctionnalité > dans Ant, il y a des propriétés similaires pour contrôler ce qui se passe si la commande exécutée échoue:

failonerror - Arrêtez le buildprocess si les sorties de commande avec un code de retour défaillance de signalisation. Par défaut à false.

failifexecutionfails - Arrête la génération si nous ne pouvons pas démarrer le programme. Par défaut à true.

ne peut pas dire basée sur l'extrait de code partiel dans votre post, mais je pense que le coupable le plus probable est failonerror ou haltonfailure étant définie sur true.

5

Vous pouvez utiliser un bloc try-catch comme ceci:

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

Bien que vous montrez une tâche fausse appelée « testng » dans votre exemple, je suppose que vous utilisez la cible de JUnit.

Dans ce cas, il est étrange que vous voyiez ces résultats parce que la cible junit n'interrompt PAS l'exécution lors d'un échec de test.

Il existe un moyen de dire à ant de stopper la construction sur une erreur de junit ou une erreur en utilisant les attributs halt, par exemple. haltonfailure:

<target name="junit" depends="junitcompile"> 
    <junit printsummary="withOutAndErr" fork="yes" haltonfailure="yes"> 

Cependant, les deux haltonfailure et haltonerror sont par défaut désactivée. Je suppose que vous pouvez vérifier votre fichier de construction pour voir si l'un de ces drapeaux ont été définis. Ils peuvent même être définis globalement, donc une chose que vous pourriez essayer est de le mettre explicitement à "non" sur votre tâche pour vous assurer qu'il est substitué au cas où il est défini dans la portée globale.

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

+1

En fait, testng n'est pas une fausse cible. J'utilise TestNG plutôt que JUnit, mais l'idée est la même. –

0

Pouvez-vous bifurquer la tâche testng? Si oui, vous pouvez utiliser cette fonction pour que la tâche testng s'exécute sur une JVM différente.