web-dev-qa-db-fra.com

Comment réutiliser des tests JUnit existants dans une autre classe de test?

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
    }
}
22
tk2000

Comme d'habitude, vous pouvez:

  1. Etend TestClass2 de TestClass1
  2. Accédez à 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();
    }
}
7
AlexR

É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:

  • Le code est testé plus d'une fois, ce qui gaspille le temps d'exécution.
  • Les tests ne doivent pas s'appuyer les uns sur les autres, ils doivent être aussi découplés que possible
  • Si cela devient un motif, il deviendra plus difficile d'identifier quelle section de code est cassée en examinant quels tests échouent, ce qui en fait partie intégrante.

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 .

32
seanhodges

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.

1
Rajesh J Advani

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.

0
مصطفی