9
votes

Pourquoi Junit exécute-t-il des cas de test pour la théorie jusqu'à la première échec?

Récemment un nouveau concept de Les théories ont été ajoutées à Junit (depuis v4.4).

En un mot, vous pouvez marquer votre méthode de test avec @Theory annotation (au lieu de @Test ), rendez votre méthode de test paramétrée et déclarez une gamme de paramètres, Marqué avec @DaTapoints Annotation quelque part dans la même classe.

Junit exécutera séquentiellement votre méthode de test paramétré Passage des paramètres extraits de @datapoints l'un après l'autre. Mais seulement jusqu'à ce que la première invocation de ce type échoue (en raison de la raison).

Le concept semble être très similaire à @DataProviders à partir de TESTNG, mais lorsque nous utilisons des fournisseurs de données, tous les scénarios sont exécutés de leurs résultats d'exécution. Et c'est utile car vous pouvez voir combien de travaux scénarieux / ne fonctionnent pas et vous pouvez réparer votre programme plus efficacement.

Alors, je me demande quelle est la raison pour ne pas exécuter @Theory -Marked sur chaque @datapoint ? (Cela ne semble pas si difficile d'hériter du coureur des théories et de faire un coureur personnalisé qui ignorera les échecs, mais pourquoi n'avons-nous pas de comportement de la boîte?)

upd upd : J'ai créé une version tolérante de la faute du coureur de théories et la rendue disponible pour un accès public: https://github.com/rgorodischer/fault-tolérant-étères

Afin de le comparer avec le standard des théories standard StandardTheoresBehaviordemo, puis errenttolérantheoresBehaviordemo qui sont placés sous src / test /... Dossier.


0 commentaires

3 Réponses :


1
votes

AFAIK, l'idée est la même que avec des affirmations, la première défaillance arrête le test. C'est la différence entre les paramétrages et les théories.

paramétré prend un ensemble de points de données et exécute un ensemble de méthodes de test avec chacune d'elles. Les théories font la même chose, mais échouent lorsque la première affirmation échoue.

Essayez de regarder paramétrice . Peut-être que cela fournit ce que vous voulez.


1 commentaires

Voir l'UMD (Je pensais que vous pourriez le trouver intéressant).



3
votes

Rapporter plusieurs échecs dans un seul test est généralement un signe que Le test fait trop, comparé à ce qu'est un test unitaire à faire. Généralement cela signifie soit que le test est vraiment un fonctionnel / acceptation / test client ou, s'il s'agit d'un test unitaire, alors est trop grosse test unitaire. P>

Junit est conçu pour fonctionner mieux avec un certain nombre de petits tests. Ce Exécute chaque test dans une instance séparée de la classe de test. Ce Rapports échec de chaque test. Le code de configuration partagé est le plus naturel lorsque partage entre tests. C'est une décision de conception qui imprègne Junit, et lorsque vous décidez de signaler plusieurs échecs par test, vous commencez à lutte contre junit. Ceci n'est pas recommandé. P>

Les tests longs sont une odeur de conception et indiquent la probabilité d'un design problème. Kent Beck aime dire dans ce cas que "il y a un possibilité d'apprendre quelque chose à propos de votre conception. "Nous aimerions voir une langue modèle se développer autour de ces problèmes, mais il n'a pas encore été écrit. Source: http://junit.sourceforge.net/doc/faq/faq.htm # tests_12 p>

Pour ignorer les défaillances d'affirmation Vous pouvez également utiliser une règle de collecteur d'erreurs Junit: P>

La règle d'erreur du collecteur permet l'exécution d'un test de continuer après Le premier problème est trouvé (par exemple, pour collecter tous les éléments incorrects rangées dans une table, et signalez-les tous à la fois) p> BlockQuote>

Par exemple, vous pouvez écrire un test comme celui-ci. P>

public static class UsesErrorCollectorTwice {
  @Rule
  public ErrorCollector collector= new ErrorCollector();

  @Test
  public void example() {
    String x = [..]
    collector.checkThat(x, not(containsString("a")));
    collector.checkThat(y, containsString("b"));             
  }
}

0 commentaires

0
votes

Une théorie est fausse si un seul test est faux, en fonction de la définition d'une théorie. Si vos cas de test ne suivent pas cette règle, il serait faux de les appeler une "théorie".


2 commentaires

IMHO, à des fins d'ingénierie, ce n'est pas très utile. Après avoir exécuté des tests, vous souhaitez connaître autant que possible de l'exactitude de votre système. Encore une fois, je ne vois rien de mal à savoir, dans lequel et dans combien de cas la théorie est fausse. C'est bien mieux que de savoir que la théorie est fausse sans aucun détail.


Il est supposé que vous écrivez de petites unités de test, chacune des tâches testant votre application d'un seul côté. Parfois, ce chèque est mieux réalisé comme une théorie. Il ne peut pas d'une utilisation faible à des fins, car il est basé sur le principe de base de la logique pratique. S'il vous semble que c'est mauvais pour une utilisation chez certains sujets chez 99%, cela signifie que vous avez des problèmes pour comprendre le sujet.