63 votes

JUnit - Spécifier la dépendance d'un test par rapport à d'autres tests (sans sauter l'un ou l'autre) ?

Notre boîte à outils compte plus de 15 000 JUnit et de nombreux tests sont connus pour échouer si un autre test échoue. Par exemple, si la méthode X.foo() utilise la fonctionnalité de Y.bar() et que YTest.testBar() échoue, alors XTest.testFoo() échouera également. Évidemment, XTest.testFoo() peut aussi échouer à cause de problèmes spécifiques à X.foo().

Bien que ce soit bien et que je veuille toujours que les deux tests soient exécutés, il serait agréable de pouvoir annoter une dépendance de test avec XTest.testFoo() pointant vers YTest.testBar(). De cette façon, on pourrait voir immédiatement quelle fonctionnalité utilisée par X.foo() échoue également, et quoi d'autre.

Une telle annotation est-elle disponible dans JUnit ou ailleurs ? Quelque chose comme :

public XTest {

  @Test
  @DependsOn(method=org.example.tests.YTest#testBar)
  public void testFoo() {
     // Assert.something();
  }

}

0 votes

C'est une vieille rengaine, cependant : si X.foo() utilise Y.bar(), le test doit( !) simuler Y.bar(), sinon votre test n'est pas un test unitaire (mais un test d'intégration). L'idée générale des tests unitaires est de ne pas avoir de dépendances. Cependant, je suis ici pour une raison ;-)

27voto

Esko Luontola Points 53877

JUnit ne le peut tout simplement pas encore (au moment de la rédaction de cet article, 2022).

Mais les deux JExample y TestNG avoir quelque chose comme ça.

  • Ces bibliothèques fournissent leur propre programme d'exécution des tests, qui prend en charge leur mécanisme de dépendance.
  • Et les deux peuvent être utilisés parallèlement à JUnit (sans avoir besoin de réécrire les classes existantes).
  • Mais TestNG semble plus prometteur.

Je ne sais pas si c'est utile, mais si vous l'essayez, revenez nous voir pour nous dire si c'était utile.

3 votes

Oui, ça semble être un excellent début : chem-bla-ics.blogspot.com/2010/08/

1 votes

Il est utile dans les situations où ClassA.methodA() invoque ClassB.methodB() et les deux prennent beaucoup de temps. Dans ce cas, vous pouvez spécifier que testMethodA() dépend de testMethodB(), c'est-à-dire que si testMethodB() échoue, testMethodA() échoue également. sans exécution .

0 votes

@Cherry : Ça ressemble à une excuse pour ne pas écrire. tests rapides . Quelques options pour améliorer la conception : (1) rendre la méthodeB rapide, (2) faire en sorte que la méthodeA ne dépende pas de la méthodeB, (3), utiliser un double de test pour la classeB lors du test de la classeA.

19voto

Jose Muanis Points 374

Il y a une contribution à JUnit qui aborde ce problème : https://github.com/junit-team/junit.contrib/tree/master/assumes

Mise à jour 2022 ; On suppose qu'il est sorti maintenant, mais cela ne fait que sauter des tests, ce qui n'est pas ce que le PO demande.

0 votes

Cela ne semble pas encore disponible dans maven central (voir search.maven.org/#search%7Cga%7C1%7Cjunit-contrib ). Comment l'utilisez-vous ? Ou utilisez-vous quelque chose d'autre maintenant ?

4voto

Thomas Lötzer Points 8388

Vous pouvez déclarer les dépendances de test dans TestNG La syntaxe est presque la même que dans votre exemple. Je ne pense pas que JUnit offre quelque chose de similaire.

1voto

Boris Pavlović Points 22207

En conception axée sur le comportement bibliothèque jBehave il y a un mot-clé GivenScenarios qui importe une liste de scénarios qui sont exécutés avant le scénario principal. Cela donne l'opportunité de définir des dépendances et d'avoir un point d'échec. La journalisation de jBehave vous dira si le test échoue dans la section des dépendances ou du corps principal.

1voto

Jack Leow Points 11081

Il n'y a vraiment rien de tel à ma connaissance. (Edit : on apprend quelque chose de nouveau tous les jours :)) À mon avis, ce n'est pas une si mauvaise chose (bien que je puisse voir que c'est utile, surtout lorsque JUnit est utilisé pour d'autres formes de tests automatisés - par exemple, les tests d'intégration). Vos tests, IMO, ne sont pas dans le sens le plus strict du mot "tests unitaires" (au moins pas le test de X#foo() ). Les tests de X#foo() devrait réussir ou échouer selon seulement sur la mise en œuvre de X#foo() . Il ne doit pas dépendre de Y#foo() .

Ce que je ferais à votre place, c'est de supprimer Y et d'implémenter quelque chose du genre MockY#foo() avec un comportement très simple et contrôlé, et l'utiliser en X#foo() Les tests de l'entreprise.

Cela dit, avec 15 000 tests, je peux voir comment cela pourrait être une douleur à remanier :)

2 votes

Je ne vois pas pourquoi les tests unitaires ne peuvent pas avoir de dépendances... notre boîte à outils définit des objets de données et des algorithmes... si un objet de données échoue, comment voulez-vous que l'algorithme corrige automatiquement cela ? Peut-être que le nom des deux méthodes foo() était trompeur...

0 votes

Seuls des tests fictifs stricts ne présenteraient aucune dépendance les uns par rapport aux autres (et ils peuvent encore le faire...). En général, de telles dépendances sont toujours possibles et doivent refléter les dépendances dans la conception OO. Je pense que maintenir une telle annotation sur tous les tests ajouterait à la complexité sans bénéfice significatif, mais avoir une telle annotation dans quelques cas principaux peut être bénéfique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X