Différence entre setUp () et setUpBeforeClass ()

159

Lors des tests unitaires avec JUnit, il existe deux méthodes similaires, setUp()et setUpBeforeClass(). Quelle est la différence entre ces méthodes? Aussi, quelle est la différence entre tearDown()et tearDownAfterClass()?

Voici les signatures:

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}
Sagar Varpe
la source

Réponses:

204

Les méthodes @BeforeClasset @AfterClassannotées seront exécutées exactement une fois pendant votre exécution de test - au tout début et à la fin du test dans son ensemble, avant toute autre exécution. En fait, ils sont exécutés avant même que la classe de test ne soit construite, c'est pourquoi ils doivent être déclarés static.

Les méthodes @Beforeet @Afterseront exécutées avant et après chaque scénario de test, elles seront donc probablement exécutées plusieurs fois au cours d'un test.

Supposons donc que vous ayez trois tests dans votre classe, l'ordre des appels de méthode serait:

setUpBeforeClass()

  (Test class first instance constructed and the following methods called on it)
    setUp()
    test1()
    tearDown()

  (Test class second instance constructed and the following methods called on it)
    setUp()
    test2()
    tearDown()

  (Test class third instance constructed and the following methods called on it)
    setUp()
    test3()
    tearDown()

tearDownAfterClass()
Andrzej Doyle
la source
15

Pensez à "BeforeClass" comme un initialiseur statique pour votre cas de test - utilisez-le pour initialiser des données statiques - des choses qui ne changent pas dans vos cas de test. Vous devez absolument faire attention aux ressources statiques qui ne sont pas thread-safe.

Enfin, utilisez la méthode annotée «AfterClass» pour nettoyer toute configuration que vous avez effectuée dans la méthode annotée «BeforeClass» (sauf si leur autodestruction est suffisante).

"Avant" et "Après" sont destinés à l'initialisation spécifique au test unitaire. J'utilise généralement ces méthodes pour initialiser / réinitialiser les simulations de mes dépendances. Évidemment, cette initialisation n'est pas spécifique à un test unitaire, mais générale à tous les tests unitaires.

madhurtanwani
la source
BTW si vous commencez à écrire un test unitaire, je recommanderais ce pot de mon blog. Il contient également des pointeurs vers d'autres excellents documents sur les tests unitaires: madhurtanwani.blogspot.com/search/label/mock
madhurtanwani
7

setUpBeforeClass est exécuté avant toute exécution de méthode juste après le constructeur (exécuté une seule fois)

setUp est exécuté avant chaque exécution de méthode

tearDown est exécuté après chaque exécution de méthode

tearDownAfterClass est exécuté après toutes les autres exécutions de méthode, est la dernière méthode à être exécutée. (exécuter une seule fois le déconstructeur)

netbrain
la source
5

Depuis le Javadoc :

Parfois, plusieurs tests doivent partager une configuration coûteuse en calcul (comme la connexion à une base de données). Bien que cela puisse compromettre l'indépendance des tests, il s'agit parfois d'une optimisation nécessaire. L'annotation d'une public static voidméthode no-arg avec @BeforeClassentraîne son exécution une fois avant l'une des méthodes de test de la classe. Les @BeforeClassméthodes des superclasses seront exécutées avant celles de la classe courante.

Justin King
la source
La différence étant que setUpBeforeClass est exécuté avant l'un des tests et est exécuté une fois; setUp est exécuté une fois avant chaque test (et est généralement utilisé pour réinitialiser l'état de test à une valeur connue-bonne entre les tests).
Syntaxe du