JUnit - @After와 @AfterClass의 차이점

JUnit에서 @After@AfterClass는 테스트 실행 후 정리하거나 이전 설정으로 되돌리는 작업을 수행하는 메소드를 설정하는 annotation입니다.

예를 들어 어떤 메소드에 @After를 붙이면, 테스트가 종료될 때마다 저 메소드가 실행되어 정리하는 작업을 수행하도록 구현할 수 있습니다. 이 두개의 Annotation은 비슷한 동작을 하지만, 호출되는 횟수 및 타이밍이 다릅니다.

예제와 함께 차이점에 대해서 알아보겠습니다.

1. @After : 각각의 테스트 실행 후, 매번 호출되는 메소드

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

import org.junit.After;
import org.junit.Test;

public class AfterExample1 {

    @After
    public void tearDownAfterTest() {
        System.out.println("Tear down something after 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");
    }
}

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

Running 'test1' method
Tear down something after test
Running 'test2' method
Tear down something after test
Running 'test2' method
Tear down something after test

정리하면, 각각의 테스트가 끝났을 때 항상 정리해야하는 것이 있을 때 @After를 이용하여 정리해줄 수 있습니다.

2. @AfterClass : 클래스 안의 모든 테스트 완료 후, 한번만 호출되는 메소드

@AfterClass로 설정된 메소드는 클래스에 정의된 테스트가 실행될 때, 한번 호출되는 메소드입니다. 클래스 안에 3개의 테스트 메소드가 있을 때, 3개의 테스트 메소드가 모두 호출되고 완료되었을 때 @AfterClass로 설정된 메소드가 한번 실행됩니다.

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

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Test;

public class AfterExample2 {

    @AfterClass
    public static void tearDownOnce() {
        System.out.println("tear down something after all test done");
    }

    @After
    public void tearDownAfterTest() {
        System.out.println("Tear down something after 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");
    }
}

위의 코드에서, 클래스에 있는 모든 테스트를 수행하면 아래와 같이 @AfterClass로 설정된 메소드는 클래스의 모든 테스트가 완료된 후에 1회만 호출되는 것을 볼 수 있습니다. 반면에 @After는 각각의 테스트가 끝날 때마다 호출되고 있습니다.

Running 'test1' method
Tear down something after test
Running 'test2' method
Tear down something after test
Running 'test2' method
Tear down something after test
tear down something after all test done

정리하면, 클래스의 모든 테스트가 끝났을 때 정리해야하는 것이 있다면 @AfterClass를 이용하여 정리해줄 수 있습니다.

Loading script...
codechachaCopyright ©2019 codechacha