Різниця між @Before, @BeforeClass, @BeforeEach та @BeforeAll


432

У чому головна відмінність

  • @Before і @BeforeClass
    • і в JUnit 5 @BeforeEachі@BeforeAll
  • @After і @AfterClass

Згідно з JUnit Api @Before використовується в наступному випадку:

Під час написання тестів прийнято виявити, що для запуску декількох тестів потрібні подібні об'єкти, перш ніж вони можуть працювати.

Тоді як @BeforeClassможна використовувати для встановлення з'єднання з базою даних. Але не могли @Beforeзробити те ж саме?

Відповіді:


623

Позначений код @Beforeвиконується перед кожним випробуванням, а @BeforeClassпрацює один раз перед усім тестовим кріпленням. Якщо у вашому тестовому класі є десять тестів, @Beforeкод буде виконаний десять разів, але @BeforeClassбуде виконаний лише один раз.

Взагалі, ви використовуєте, @BeforeClassколи для декількох тестів потрібно ділити один і той же обчислювально дорогий інсталяційний код. Встановлення підключення до бази даних підпадає під цю категорію. Ви можете переміщувати код @BeforeClassзсередини @Before, але ваш тестовий запуск може зайняти більше часу. Зауважте, що позначений код @BeforeClassзапускається як статичний ініціалізатор, тому він запускається до того, як буде створений екземпляр класу вашого тестового приладдя.

В JUnit 5 , теги @BeforeEachі @BeforeAllє еквівалентами @Beforeі @BeforeClassв JUnit 4. Їх імена трохи більш показові , коли вони біжать, вільно витлумачено: «перед кожними тестами» і «один раз , перш ніж всі випробування.


4
А, тепер приклад із з'єднанням БД має сенс. Дякую!
користувач1170330

6
@pacoverflow @BeforeClasстатичний. Він працює до створення екземплярів тестового класу.
dasblinkenlight

1
Майте на увазі, що при використанні @BeforeClass ваш метод / параметр повинен бути статичним
tiagocarvalho92

Це не пов'язано безпосередньо, але це спосіб обчислити лічильник "Тести за категорією" .
Bsquare ℬℬ

Я лише додам, що це @BeforeAllможе бути нестатично, і закликати при кожному новому запуску тестового примірника. Дивіться відповідну відповідь stackoverflow.com/a/55720750/1477873
Сергій

124

Різниця між кожною приміткою:

+-------------------------------------------------------------------------------------------------------+
¦                                       Feature                            ¦   Junit 4    ¦   Junit 5   ¦
¦--------------------------------------------------------------------------+--------------+-------------¦
¦ Execute before all test methods of the class are executed.               ¦ @BeforeClass ¦ @BeforeAll  ¦
¦ Used with static method.                                                 ¦              ¦             ¦
¦ For example, This method could contain some initialization code          ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute after all test methods in the current class.                     ¦ @AfterClass  ¦ @AfterAll   ¦
¦ Used with static method.                                                 ¦              ¦             ¦
¦ For example, This method could contain some cleanup code.                ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute before each test method.                                         ¦ @Before      ¦ @BeforeEach ¦
¦ Used with non-static method.                                             ¦              ¦             ¦
¦ For example, to reinitialize some class attributes used by the methods.  ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute after each test method.                                          ¦ @After       ¦ @AfterEach  ¦
¦ Used with non-static method.                                             ¦              ¦             ¦
¦ For example, to roll back database modifications.                        ¦              ¦             ¦
+-------------------------------------------------------------------------------------------------------+

Більшість приміток в обох версіях однакові, але деякі відрізняються.

Довідково

Порядок виконання.

Пустий прапорець -> необов'язкова примітка.

введіть тут опис зображення


10

До і до класу JUnit

@BeforeАнотація до функції буде виконуватися перед кожною тестовою функцією в класі, що має @Testанотацію, але функція з @BeforeClassбуде виконуватися лише один раз перед усіма тестовими функціями в класі.

Аналогічно функція з @Afterанотацією буде виконуватися після кожної тестової функції в класі, що має @Testанотацію, але функція з @AfterClassбуде виконуватися лише один раз після всіх тестових функцій у класі.

SampleClass

public class SampleClass {
    public String initializeData(){
        return "Initialize";
    }

    public String processDate(){
        return "Process";
    }
 }

SampleTest

public class SampleTest {

    private SampleClass sampleClass;

    @BeforeClass
    public static void beforeClassFunction(){
        System.out.println("Before Class");
    }

    @Before
    public void beforeFunction(){
        sampleClass=new SampleClass();
        System.out.println("Before Function");
    }

    @After
    public void afterFunction(){
        System.out.println("After Function");
    }

    @AfterClass
    public static void afterClassFunction(){
        System.out.println("After Class");
    }

    @Test
    public void initializeTest(){
        Assert.assertEquals("Initailization check", "Initialize", sampleClass.initializeData() );
    }

    @Test
    public void processTest(){
        Assert.assertEquals("Process check", "Process", sampleClass.processDate() );
    }

}

Вихідні дані

Before Class
Before Function
After Function
Before Function
After Function
After Class

У 5 червня

@Before = @BeforeEach
@BeforeClass = @BeforeAll
@After = @AfterEach
@AfterClass = @AfterAll

1
Дуже хороший приклад.
kanaparthikiran

2
import org.junit.Assert
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test

class FeatureTest {
    companion object {
        private lateinit var heavyFeature: HeavyFeature
        @BeforeClass
        @JvmStatic
        fun beforeHeavy() {
            heavyFeature = HeavyFeature()
        }
    }

    private lateinit var feature: Feature

    @Before
    fun before() {
        feature = Feature()
    }

    @Test
    fun testCool() {
        Assert.assertTrue(heavyFeature.cool())
        Assert.assertTrue(feature.cool())
    }

    @Test
    fun testWow() {
        Assert.assertTrue(heavyFeature.wow())
        Assert.assertTrue(feature.wow())
    }
}

Такий же, як

import org.junit.Assert
import org.junit.Test

 class FeatureTest {
    companion object {
        private val heavyFeature = HeavyFeature()
    }

    private val feature = Feature()

    @Test
    fun testCool() {
        Assert.assertTrue(heavyFeature.cool())
        Assert.assertTrue(feature.cool())
    }

    @Test
    fun testWow() {
        Assert.assertTrue(heavyFeature.wow())
        Assert.assertTrue(feature.wow())
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.