comment puis-je réutiliser des tests JUnit dans une autre classe de tests?
Par exemple:
public TestClass1 {
@Test
public void testSomething(){...}
}
public TestClass2 {
@Test
public void testSomethingAndSomethingElse() {
// Somehow execute testSomething()
// and then test something else
}
}
Comme d'habitude, vous pouvez:
TestClass2
de TestClass1
TestClass1
à partir de TestClass2
à l'aide de la délégation:Exemple 1:
// Instantiate TestClass1 inside test method
public TestClass2 {
public void testSomethingAndSomethingElse1() {
new TestClass1().testSomething();
}
}
Exemple 2:
// Instantiate TestClass1 as a member of TestClass2
public TestClass2 {
private TestClass1 one = new TestClass1();
public void testSomethingAndSomethingElse1() {
one.testSomething();
}
}
Évitez le scénario, en général. Il est enclin à rendre les tests beaucoup plus fragiles. Si TestClass1
échoue, alors TestClass2
échoue implicitement, ce qui n'est pas souhaitable pour au moins les raisons suivantes:
Il est parfois utile de partager des sections de code de test, en particulier pour les tests d'intégration. Voici comment vous pouvez le faire sans dépendre des tests eux-mêmes:
public abstract BaseTests {
protected void somethingHelper() {
// Test something
}
}
public TestClass1 extends BaseTests {
@Test
public void testSomething(){
somethingHelper();
}
}
public TestClass2 extends BaseTests {
@Test
public void testSomethingAndSomethingElse() {
somethingHelper();
// and then test something else
}
}
Alternativement, vous pouvez utiliser une classe d'assistance et éviter complètement l'héritage. Les assertions et autres peuvent aller dans la méthode somethingHelper()
.
N'appelez pas directement une méthode à partir de TestClass1
dans TestClass2
. Les cas de test deviennent ainsi moins lisibles et peuvent conduire à spaghetti frittata .
Logiquement, il n'y a aucune raison d'appeler une méthode de test d'une autre. Tout outil qui exécute un test serait tout aussi facilement tous les tests du paquet. Mais si vous en aviez besoin, vous l'appelleriez comme n'importe quelle autre méthode d'une autre classe.
Ce que vous voudrez probablement faire, est d’effectuer une configuration commune aux deux méthodes de test. Vous pouvez placer le code that
dans une méthode d'utilitaire dans une classe commune et appeler le code commun dans les deux tests.
Ceci est courant pour exécuter un test avec une configuration différente. Ne vous inquiétez pas et allez-y.
A la première étape, créez votre propre test sans prendre en compte aucune configuration:
public abstract BaseTests {
@Test
protected void somethingHelper() {
// Test something
}
}
Ensuite, étendez la classe de test et ajoutez une configuration:
public TestClass1 extends BaseTests {
@Before
public void setup(){
// TODO: config
}
}
Il n’est pas nécessaire de faire une configuration spécifique, mais c’est très courant avec un système configurable (la fonctionnalité principale du système doit être valide pour chaque configuration).
Dans l'autre cas de test:
public TestClass2 extends BaseTests {
@Before
public void setup(){
// TODO: other config
}
}
Par exemple, il peut exister un processus de chiffrement et de déchiffrement dans lequel la séquence de chiffrement> déchiffrement doit être identifiée. D'autre part, il existe un algorithme différent à utiliser alors que le processus de test est unique.