2010-09-14 2 views
5

J'ai plusieurs cas de test même et si la logique est différente, la sortie doit être égale sur chacun d'eux. Je pensais donc à les généraliser et à ne placer la méthode Assert qu'une seule fois.Est-ce que l'affirmation de la méthode tearDown (@After) est fausse?

Est-il possible de mieux faire que celui-ci:

static public class Tests() { 

    private static String expected = null; 
    private String actual = null; 

    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 
     expected = new String("My Desired Output"); 
    } 

    @Before 
    public void setUp() { 
     actual = new String(); 
    } 

    @Test 
    public void test1() throws Exception { 
     actual = ... 
    } 

    @Test 
    public void test2() throws Exception { 
     actual = ... 
    } 

    @After 
    public void tearDown() throws Exception { 
     assertThat(actual, is(equalTo(expected))); 
    } 

    @AfterClass 
    public static void tearDownAfterClass() { 
    } 
} 

méthode en cours:

@Test 
public void runTests() { 
    Result result = JUnitCore.runClasses(Tests.class); 
    assertThat(result.getRunCount(), is(2)); 
    assertThat(result.getFailureCount(), is(0)); 
} 

Répondre

7

Oui, affirmer dans la méthode tearDown est une mauvaise idée. Cette méthode existe, selon la documentation JUnit, à

Déchirez l'appareil, par exemple, fermez une connexion réseau. Cette méthode est appelée après l'exécution d'un test.

Je pense que le stockage de vos valeurs attendues et réelles dans la classe de test est une mauvaise idée en général. Ces variables dépendent du test, donc stockez-les dans votre cas de test et faites votre affirmation dans le cas de test. Par exemple:

public class FooTest { 

    @Test 
    public void testFoo() { 
     Object expected = // ... 
     Object actual = // ... 

     assertThat(actual, is(equalsTo(expected))); 
    } 

} 

En outre, je vois dans votre code que tous les tests ont la même valeur attendue. Cela peut être une bonne idée de varier vos tests afin que les valeurs retournées soient toujours différentes. Tester une seule valeur attendue tout le temps vous assure que le code fonctionne pour ce résultat attendu. Essayez avec un peu plus, peut-être très différent, et essayez de tester quelques cas de coin.

+0

La classe que je suis en train de tester est en quelque sorte une classe de construction, donc je peux construire ma sortie en utilisant différentes méthodes. En faisant ces tests, je peux m'assurer que toutes mes méthodes fonctionnent et que la sortie est générée correctement. J'ai déjà détecté un bug dans l'une de mes méthodes. – Alexander

+0

En outre, l'utilisation de la statique dans votre test est une mauvaise idée. – emory

+0

@emory, vous voulez dire affirmer contre une variable statique ou en utilisant des méthodes statiques ou les deux? – Alexander

4

Si vous devez généraliser alors vous pourriez créer une méthode comme

private void testIt (String actual) { 
    assertThat(actual, is(equalTo(expected))); 
} 

et appelez-le de toutes vos méthodes de test.

Si et quand un test échoue, il sera plus évident que le test a échoué.

Questions connexes