@Before, @BeforeClass, @BeforeEach 및 @BeforeAll의 차이점


432

주요 차이점은 무엇입니까

  • @Before@BeforeClass
    • JUnit 5 @BeforeEach에서@BeforeAll
  • @After@AfterClass

JUnit Api 에 따르면 @Before다음과 같은 경우에 사용됩니다.

테스트를 작성할 때, 몇 가지 테스트가 실행되기 전에 유사한 객체가 생성되어야한다는 것이 일반적입니다.

반면은 @BeforeClass데이터베이스 연결을 설정하는 데 사용할 수 있습니다. 그러나 @Before똑같이 할 수 없었 습니까?

답변:


623

표시된 코드 @Before는 각 테스트 @BeforeClass전에 실행되며 전체 테스트 픽스처 전에 한 번 실행됩니다. 테스트 클래스에 10 개의 테스트가있는 경우 @Before코드는 10 번 실행되지만 @BeforeClass한 번만 실행됩니다.

일반적으로 @BeforeClass여러 테스트에서 계산 비용이 동일한 동일한 설정 코드를 공유해야하는 경우에 사용 합니다. 데이터베이스 연결 설정이이 범주에 속합니다. 에서 @BeforeClass로 코드를 옮길 수 @Before있지만 테스트 실행 시간이 더 오래 걸릴 수 있습니다. 표시된 코드 @BeforeClass는 정적 이니셜 라이저로 실행되므로 테스트 픽스처의 클래스 인스턴스가 작성되기 전에 실행됩니다.

에서 의 JUnit 5 , 태그 @BeforeEach@BeforeAll의 등가물이다 @Before@BeforeClass의 JUnit 4. 그들의 이름은 느슨하게 해석, 그들이 실행할 때의 좀 더 나타내는입니다 : '한 번에 모든 테스트 전에' '각 시험 전에'합니다.


4
아, 이제 DB 연결의 예가 의미가 있습니다. 감사합니다!
user1170330

6
@pacoverflow @BeforeClas는 정적입니다. 테스트 클래스 인스턴스가 작성되기 전에 실행됩니다.
dasblinkenlight

1
@BeforeClass를 사용할 때 메소드 / 매개 변수는 정적
이어야합니다.

직접 관련이 없지만 '카테고리 별 테스트'카운터계산 하는 방법 입니다.
Bsquare ℬℬ 2012 년

나는 @BeforeAll정적이 아닌 것을 추가하고 모든 새로운 테스트 인스턴스 실행을 호출합니다. 해당 답변을 참조하십시오 stackoverflow.com/a/55720750/1477873
Sergey

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모든 테스트 함수 후에 한 번만 실행됩니다.

샘플 클래스

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

Junit 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())
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.