2008-10-07 6 views
20

Je voudrais que ça hurle hooray à chaque fois qu'une déclaration assertive réussit, ou à tout le moins qu'elle affiche le nombre d'affirmations réussies qui ont été rencontrées.Puis-je rendre JUnit plus bavard?

J'utilise JUnit4.

Des suggestions?

+0

Pourquoi voulez-vous exactement cela? J'essaie toujours de suivre la règle du silence (http://www.catb.org/~esr/writings/taoup/html/ch01s06.html#id2878450), c'est pourquoi je demande –

+0

Cela pourrait être un moyen utile de voyez si quelqu'un "peaufine" les cas de test pour les faire passer en supprimant les assertions inconfortables ... –

+4

Parce qu'il me donne les fuzzies chaudes quand ce nombre monte légitimement. :) –

Répondre

13

Si vous voulez voir une sortie pour chaque assertion réussie, une autre approche simple qui ne nécessite aucune dépendance externe ou code source, serait de définir votre propre classe Assert qui délègue toutes les méthodes à la La classe JUnit Assert standard, ainsi que la journalisation des assertions réussies (les assertions échouées seront signalées comme d'habitude par la classe JUnit).

Vous exécutez ensuite une recherche-remplacement globale sur vos classes de test à partir de "org.junit.Assert" => "com.myco.test.Assert", qui doit corriger toutes les instructions d'importation statiques et régulières.

Vous pouvez également ensuite migrer facilement votre approche du plus silencieux-est-mieux-camp et changer la classe wrapper pour signaler que le nombre total d'assertions passées par test ou par classe, etc.

0

Je suis sûr que vous pouvez créer un TestRunner personnalisé qui fait cela. Nous nous sommes retrouvés avec quelque chose de similaire dans notre cadre de tests unitaires maison (un clone de NUnit). Oh, attendez - maintenant que je relis votre question, si vous voulez vraiment la sortie pour chaque affirmation réussie, vous devrez creuser plus dans la plomberie. Le TestRunner n'est appelé qu'une seule fois pour chaque début/fin du test, donc il comptera et échouera. teste, pas les assertions.

Ce n'est pas vraiment un problème pour moi, puisque je tends généralement vers une assertion par test.

2

Difficile à faire. Toutes les méthodes assert sont des membres statiques de la classe Assert, ce qui implique que RunNotifier (qui compte les tests réussis et échoués) n'est pas à portée de main. Si vous ne vous abstenez pas d'un hack ungly: prenez les sources de JUnit, corrigez-les pour stocker le notificateur en cours dans un champ statique de Assert lors des tests de sorte que les méthodes statiques puissent rapporter des affirmations réussies à ce notificateur.

-1

Pouvez-vous considérer?

1) télécharger JUnit la source
2) pour modifier la org.junit.Assert de classe pour faire toutes les modifications que vous cherchez

4

Vous pouvez utiliser AOP (avec Spring ou AspectJ) définissent pointcuts sur tous assert méthodes dans la classe junit.framework.Assert. En utilisant spring, vous pouvez implémenter votre propre classe après avoir renvoyé un avis (http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-advice-after-returning) qui ne sera appelé que si la méthode assert est passée (sinon elle déclenche une exception: junit.framework.AssertionFailedError .) Dans votre propre classe, vous pouvez implémenter un simple compteur et imprimer à la fin.

3

Êtes-vous vraiment intéressé par une affirmation qui réussit? Normalement, les seules affirmations intéressantes sont celles qui échouent.

Étant moi-même, j'essaie dévot JUnit fervent et faire la sortie du tests aussi silencieux que possible, car il améliore le rapport signal sur bruit quand quelque chose ne passe pas.Le meilleur test est celui où tout passe et il n'y a pas un peep de stdout

Vous pouvez toujours travailler sur votre test unitaire jusqu'à ce qu'il réussisse et exécutez "grep Assert test.java | wc -l ". :-)

+7

Ouais, je le suis vraiment. –

0

Je ne Je pense que JUnit a pour but de compter les assertions correspondantes ou d'imprimer des informations plus détaillées. Si les tests sont atomiques, vous y trouverez la plupart des informations. Donc, je passerais en revue mes tests.

Vous pouvez également établir un fichier journal dans JUnit. C'est possible, mais cela diminuera les performances d'exécution des tests ...

7

Ajout d'informations qui m'auraient été utiles lorsque je voulais que JUnit soit plus bavard et trébuché sur cette question. Peut-être que cela aidera d'autres testeurs à l'avenir.

Si vous utilisez JUnit Ant, et que vous voulez voir quels tests sont en cours d'exécution, vous pouvez ajouter ce qui suit à votre tâche:

<junit showoutput="true" printsummary="on" enabletestlistenerevents="true" fork="@{fork}" forkmode="once" haltonfailure="no" timeout="1800000"> 

Notez que showoutput, printsummary et enabletestlistenerevents sont ce qui a aidé, pas les autres attributs de la tâche. Si vous définissez ces derniers, vous obtiendrez une sortie comme:

Running com.foo.bar.MyTest 
junit.framework.TestListener: tests to run: 2 
junit.framework.TestListener: startTest(myTestOne) 
junit.framework.TestListener: endTest(myTestOne) 
junit.framework.TestListener: startTest(myTestTwo) 
junit.framework.TestListener: endTest(myTestTwo) 
Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.495 sec 

C'était utile pour moi quand mes tests ont été et je temporiser n'étais pas sûr que les tests prenaient en fait trop longtemps, et quels tests a été annulé parce que ils ont eu la malchance de courir quand le temps était écoulé.

Questions connexes