JUnit - @Before와 @BeforeClass의 차이점

JUnit에서 @Before@BeforeClass는 테스트 실행 전 수행해야할 초기화 메소드를 설정할 때 사용하는 annotation입니다. 이름이 비슷하기 때문에 헷갈리는데 차이점이 있습니다. 예제와 함께 차이점에 대해서 알아보겠습니다.

1. @Before : 각각의 테스트 실행 전, 실행되는 초기화 메소드

@Before가 있는 메소드는 각각의 테스트가 실행되기 전에 한번씩 호출됩니다. 만약 클래스에 @Test로 구현된 3개의 테스트 메소드가 있다면 @Before로 설정된 메소드는 3번 실행됩니다. 그리고 @Before 메소드는 static이 아닌 member 메소드에만 사용할 수 있습니다.

import org.junit.Before;
import org.junit.Test;

public class TestExample {

    @Before
    public void initBeforeTest() {
        System.out.println("Initialize something before each test");
    }

    @Test
    public void test1() {
        System.out.println("Running 'test1' method");
    }

    @Test
    public void test2() {
        System.out.println("Running 'test2' method");
    }

    @Test
    public void test3() {
        System.out.println("Running 'test2' method");
    }
}

위 코드를 실행해보면, 아래와 같이 각각의 테스트 메소드가 실행되기 전에 @Before로 설정된 initBeforeTest()가 호출된 것을 확인할 수 있습니다.

Initialize something before each test
Running 'test1' method
Initialize something before each test
Running 'test2' method
Initialize something before each test
Running 'test2' method

정리하면, 각각의 테스트를 시작하기 전에 매번 초기화할 것이 있을 때 @Before를 이용하여 초기화할 수 있습니다.

2. @BeforeClass : 클래스 안의 테스트 실행 전, 한번만 호출되는 메소드

@BeforeClass로 설정된 메소드는 클래스에 정의된 테스트가 실행될 때, 한번 호출되는 메소드입니다. 클래스 안에 3개의 테스트 메소드가 있을 때, @BeforeClass로 설정된 메소드가 한번 실행되고 그 다음에 3개의 테스트 메소드가 연속적으로 실행됩니다.

@Before 메소드는 static이 아닌 member 메소드에만 사용할 수 있는데, @BeforeClass는 static method에만 사용할 수 있다는 차이점이 있습니다.

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class TestExample2 {

    @BeforeClass
    public static void initJustOnce() {
        System.out.println("Initialize once");
    }

    @Before
    public void initBeforeTest() {
        System.out.println("Initialize something before test");
    }

    @Test
    public void test1() {
        System.out.println("Running 'test1' method");
    }

    @Test
    public void test2() {
        System.out.println("Running 'test2' method");
    }

    @Test
    public void test3() {
        System.out.println("Running 'test2' method");
    }
}

위의 코드에서, 클래스에 있는 모든 테스트를 수행하면 아래와 같이 @BeforeClass로 설정된 메소드는 테스트 전에 1회만 호출되는 것을 볼 수 있습니다.

Initialize once
Initialize something before test
Running 'test1' method
Initialize something before test
Running 'test2' method
Initialize something before test
Running 'test2' method

만약 test2만 실행하면, 아래와 같이 @BeforeClass, @Before로 설정된 메소드가 한번씩 실행됩니다. 두개 이상의 테스트를 동시에 실행될 때 호출되는 횟수가 다르다는 점만 기억하시면 됩니다.

Initialize once
Initialize something before test
Running 'test2' method

정리하면, 클래스의 테스트를 시작하기 전에 공통적으로 초기화할 것이 있을 때 @BeforeClass를 이용하여 초기화할 수 있습니다.

Loading script...
codechachaCopyright ©2019 codechacha