본문 바로가기

개발언어/Java

JUnit 초기화 @Before 와 @BeforeClass 차이

Junit을 사용할 때 각 테스트의 초기화를 위해서 @Before를 사용하곤 합니다. 

 하지만 이와 비슷한 @BeforeClass라는 Junit 어노테이션도 존재하는데 이 둘의 차이를 알아볼까 합니다. 





각 테스트보 보다 먼저 실행되는 @Before 

 테스트 작성 시 실행되기 전 유사한 객체가 필요한 경우 각 @Test 어노테이션이 붙은 메소드 보다 먼저 실행됩니다.

 즉 해당 클래스의 @Test 어노테이션의 갯수만큼 실행되는 어노테이션 입니다. 

예를 들어

public class Example {
    List emptyList; //테스트 마다 사용되는 클래스

    //Test 전 마다 매번 실행된다.
    @Before public void initialize() {
        emptyList= new List();
    }

    //size 메소드의 emptyList의 주소는 0x001
    @Test public void size() {
        emptyList.add("size");
    }
    
    //remove 메소드의 emptyList의 주소는 0xA00
    @Test public void remove() {
        emptyList.add("remove");
    }
}


 위 같은 상황에서 적어놓은 주석 처럼 size와 remove 메소드의 emptyList는 같은 클래스이지만 다른 주소를 가진 다른 객체입니다.

JUnit API의 내용에 따르면

When writing tests, it is common to find that several tests need similar objects created before they can run.

테스트 시 유사한 객체의 사용을 발견하는 것이 일반 적이다라는 내용인데, 
이 부분의 핵심은 ‘유사한’ 입니다. 객체를 유사하다 표현함으로서 같은 객체가 아님을 명시해 줍니다. 

또한

Annotating a public void method with @Before causes that method to be run before the Test method.

위와 같은 내용이 명시 되어 있어 리턴 값이  void인 값으로 한정되어 있습니다. 





테스트 시 딱 한번 실행되는 @BeforeClass 

 다음으로 해당 클래스의 테스트의 진행전 딱 한번 실행되는 @BeforeClass입니다.

 @Before와 달리 딱 한번 실행되는 어노테이션으로 해당 클래스 내부에서 한 객체를 공유하는게 유리한 경우에 사용됩니다.

예를들어

public class Example {
    static List commonList; // 공통으로 사용되는 객체
    
    //테스트 시작 전 단 한번 실행된다.
    @BeforeClass public static void onlyOnce() {
        commonList = new List();
    }
    
    //one의 commonList 객체의 주소는 0x0001
    @Test public void one() {    
        commonList.add("one");    
    }

    //two의 commonList 객체의 주소는 0x0001
    @Test public void two() {
        commonList.add("two");
    }
}


 위 같은 상황에서 주석의 내용처럼 one과 two 메소드의 commonList 객체는 같은 객체입니다.

마찬가지로 JUnit API 내용을 참고하면

Sometimes several tests need to share computationally expensive setup (like logging into a database). While this can compromise the independence of tests, sometimes it is a necessary optimization.

 테스트의 독립성을 손상 시키지만 그럼에도 계산 비용이 많이드는 설정을 공유하는 경우 필요하다고 합니다.

또한

Annotating a public static void no-arg method with @BeforeClass causes it to be run once before any of the test methods in the class.

 접근 가능한 정적의(public static)메소드여야 하고, 리턴값이 void이며 매개변수가 없는 메소드에서 사용할수 있는 것으로 명시되어 있습니다. 
그리고 클래스의 테스트 메소드에서 한번 사용된다라고 클래스 단위로 사용이 됨을 알 수 있습니다.

위의 내용을 참고하셔서, 테스트의 초기화 작성 시 각 상황에 맞게 @Before와 @BeforeClass를 잘 활용하면 될것 같습니다. 




'개발언어 > Java' 카테고리의 다른 글

[Java] Java문법 for, for-each  (0) 2019.11.21
JAVA 기초 CLASS란  (0) 2019.08.06
Java VM Arguments 설정  (0) 2019.05.16
정적 팩토리 메소드(Static Factory Method) 장단점  (0) 2019.05.11
서블릿(Servlet)이란  (0) 2018.12.10