Разница между @Before, @BeforeClass, @BeforeEach и @BeforeAll

В чем главное отличие

  • @Before а также @BeforeClass
    • и в Юнит 5 @BeforeEach а также @BeforeAll
  • @After а также @AfterClass

Согласно JUnit Api @Before используется в следующем случае:

При написании тестов часто обнаруживается, что нескольким тестам нужны похожие объекты, созданные до того, как они смогут работать.

В то время как @BeforeClass может использоваться для установления соединения с базой данных. Но не мог @Before делать то же самое?

8 ответов

Решение

Код помечен @Before выполняется перед каждым тестом, а @BeforeClass запускается один раз перед всем испытательным приспособлением. Если ваш тестовый класс имеет десять тестов, @Before код будет выполнен десять раз, но @BeforeClass будет выполнен только один раз.

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

В JUnit 5 теги @BeforeEach а также @BeforeAll являются эквивалентами @Before а также @BeforeClass в JUnit 4. Их имена немного более показательны, когда они запускаются, в некоторой степени интерпретируются: "перед каждым тестом" и "один раз перед всеми тестами".

Разница между каждой аннотацией:

+-------------------------------------------------------------------------------------------------------+
¦                                       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.                        ¦              ¦             ¦
+-------------------------------------------------------------------------------------------------------+

Большинство аннотаций в обеих версиях одинаковы, но мало отличаются.

Ссылка

Порядок исполнения.

Штриховая рамка -> дополнительная аннотация.

До и Перед Классом в JUnit

Функция @Before аннотация будет выполняться перед каждой тестовой функцией в классе, имеющем @Test аннотация, но функция с @BeforeClass будет выполняться только один раз перед всеми тестовыми функциями в классе.

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

SampleClass

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

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

Образец теста

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

@Before(JUnit4) -> @BeforeEach(JUnit5) - метод вызывается перед каждым тестом

@After(JUnit4) -> @AfterEach(JUnit5) - метод вызывается после каждого теста

@BeforeClass(JUnit4) -> @BeforeAll(JUnit5) - статический метод вызывается перед выполнением всех тестов в этом классе. Это может быть большая задача, например, запуск сервера, чтение файла, подключение к базе данных ...

@AfterClass(JUnit4) -> @AfterAll(JUnit5) - статический метод вызывается после выполнения всех тестов в этом классе.

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())
    }
}

Основное различие между всеми этими аннотациями заключается в следующем:

  1. @BeforeEach - используется для запуска общего кода (например, setUp) перед каждым выполнением тестового метода. аналогично JUnit 4 @Before.
  2. @AfterEach - используется для запуска общего кода после (например, tearDown) выполнения каждого метода тестирования. аналогично @After из JUnit 4.
  3. @BeforeAll - используется для однократного запуска каждого класса перед выполнением любого теста. аналогично JUnit 4 @BeforeClass.
  4. @AfterAll - используется для однократного запуска для каждого класса после выполнения всех тестов. аналогично @AfterClass из JUnit 4.

Все эти аннотации вместе с использованием определены в Codingeek - Junit5 Test Lifecycle.

будет запускаться перед всеми тестовыми костюмами, тогда как будет выполняться выполняется перед каждым тестом, а запускается один раз перед всем тестовым устройством. Если в вашем тестовом классе десять тестов, @Before код будет выполнен десять раз, но @BeforeClass будет выполняться только один раз.

Тестовый пример JUnit 5 должен пройти несколько жизненных циклов. В первую очередь существует 4 основных жизненных цикла Junit 5, то есть @BeforeAll, @BeforeEach, @AfterEach и @AfterAll.

      public class AppleCalculator {
public int addApple(int apple1, int apple2) {
    return apple1 + apple2;
}
}

прецедент

      class AppleCalculatorTest {
@BeforeAll
static void beforeAll() {
    System.out.println("AppleCalculatorTest.beforeAll");
}

@BeforeEach
void beforeEach() {
    System.out.println("AppleCalculatorTest.beforeEach");
}

@Test
void test() {
    System.out.println("AppleCalculatorTest.test");
}

@AfterEach
void afterEach() {
    System.out.println("AppleCalculatorTest.afterEach");
}

@AfterAll
static void afterAll() {
    System.out.println("AppleCalculatorTest.afterAll");
}
}

образец кода

@BeforeAll

      JUnit 4 @BeforeClass = JUnit 5 @BeforeAll

образец кода

@BeforeAll суперкласс

образец кода

@AfterAll Суперкласс

      JUnit 4 @AfterClass = JUnit 5 @AfterAll

@BeforeEach

образец кодаобразец кода

@BeforeEach Суперкласс

образец кода

@AfterEach

образец кода

@AfterEach Суперкласс

образец кода

большинство аннотаций здесь довольно четко объяснено, но если у вас все еще есть сомнения, вы можете меня приколоть.

Другие вопросы по тегам