web-dev-qa-db-fra.com

Comment spécifier les dépendances de test JUnit?

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

Bien que cela soit correct et que je souhaite toujours que les deux tests soient exécutés, il serait bien que l'on puisse annoter une dépendance de test avec XTest.testFoo () pointant vers YTest.testBar (). De cette façon, on pourrait immédiatement voir quelles fonctionnalités utilisées par X.foo () échouent également, et ce qui ne l'est pas.

Existe-t-il une telle annotation dans JUnit ou ailleurs? Quelque chose comme:

public XTest {

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

}
52
Egon Willighagen

JExample et TestNG ont quelque chose comme ça.

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

24
Esko Luontola

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

17
Jose Muanis

org.junit.FixMethodOrder

@FixMethodOrder (MethodSorters.NAME_ASCENDING) Cela va au-dessus de votre classe de test unitaire.

Vous pouvez nommer vos méthodes public void step1_methodName etc.

5
Aditya Digumarti

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

4
Thomas Lötzer

Il n'y a vraiment pas quelque chose comme ça que je sache. (Edit: vous apprenez quelque chose de nouveau chaque jour :)) À mon avis, ce n'est pas si mal que ça (bien que je puisse voir qu'il est utile, surtout lorsque JUnit est utilisé pour d'autres formes de tests automatisés - par exemple, l'intégration tests). Vos tests, OMI, ne sont pas au sens strict du mot "tests unitaires" (du moins pas le test de X#foo()). Les tests pour X#foo() devraient réussir ou échouer selon niquement selon l'implémentation de X#foo(). Il ne doit pas dépendre de Y#foo().

Ce que je ferais à votre place, c'est de simuler Y et d'implémenter quelque chose comme MockY#foo() avec un comportement très simple et contrôlé, et de l'utiliser dans les tests de X#foo().

Cela dit, avec 15 000 tests, je peux voir à quel point ce serait pénible à refactoriser. :)

1
Jack Leow

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

1
Boris Pavlović