JUnit 어노테이션에 대해 알아보기

Ma_Seokjae·2024년 10월 30일
post-thumbnail

JUnit은 Java에서 단위 테스트를 쉽게 작성하고 관리할 수 있도록 다양한 어노테이션을 제공합니다. 어노테이션을 사용하면 각 메서드가 어떤 역할을 수행하는지 명확하게 나타낼 수 있어 테스트 코드의 가독성을 크게 높일 수 있습니다. 이번 글에서는 JUnit에서 자주 사용하는 어노테이션의 기능과 예제를 통해 알아가보도록 하겠습니다.

1. @Test

@Test테스트 메서드임을 표시하는 어노테이션입니다. JUnit은 @Test가 붙은 메서드를 실행하며, 그 메서드가 성공하는지, 실패하는지를 판단하게 됩니다.

예제: JUnit4:

import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class CalculatorTest {

    @Test
    public void additionTest() {
        int result = 2 + 3;
        assertEquals(5, result);
    }
}

예제: JUnit5:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class CalculatorTest {

    @Test
    void additionTest() {
        int result = 2 + 3;
        assertEquals(5, result, "2 + 3은 5이어야 합니다.");
    }
}

2. @Before / @BeforeEach

@BeforeJUnit4에서, @BeforeEachJUnit5에서 사용되며, 각 테스트 메서드 실행 전 수행될 작업을 정의합니다.

예제: JUnit4:

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

public class DatabaseTest {

    @Before
    public void setup() {
        System.out.println("테스트를 위한 초기 설정을 수행합니다.");
    }

    @Test
    public void databaseConnectionTest() {
        System.out.println("데이터베이스 연결 테스트 수행 중");
    }
}

예제: JUnit5:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class DatabaseTest {

    @BeforeEach
    void setup() {
        System.out.println("테스트를 위한 초기 설정을 수행합니다.");
    }

    @Test
    void databaseConnectionTest() {
        System.out.println("데이터베이스 연결 테스트 수행 중");
    }
}

3. @After / @AfterEach

@AfterJUnit4에서, @AfterEachJUnit5에서 사용되며, 각 테스트 메서드 실행 후에 수행될 작업을 정의합니다.

예제: JUnit4:

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

public class FileTest {

    @After
    public void tearDown() {
        System.out.println("테스트 후 정리 작업을 수행합니다.");
    }

    @Test
    public void fileReadTest() {
        System.out.println("파일 읽기 테스트 수행 중");
    }
}

예제: JUnit5:

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

public class FileTest {

    @AfterEach
    void tearDown() {
        System.out.println("테스트 후 정리 작업을 수행합니다.");
    }

    @Test
    void fileReadTest() {
        System.out.println("파일 읽기 테스트 수행 중");
    }
}

4. @BeforeClass / @BeforeAll

@BeforeClassJUnit4에서, @BeforeAllJUnit5에서 사용됩니다. 테스트 클래스 시작 전에 한 번만 실행되어 여러 테스트 메서드가 공유할 자원 초기화에 적합합니다. 두 어노테이션 모두 static 메서드에 적용됩니다.

예제: JUnit4:

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

public class DatabaseConnectionTest {

    @BeforeClass
    public static void setupDatabaseConnection() {
        System.out.println("데이터베이스 연결 설정을 초기화합니다.");
    }

    @Test
    public void testQueryExecution() {
        System.out.println("쿼리 실행 테스트 수행 중");
    }
}

예제: JUnit5:

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

public class DatabaseConnectionTest {

    @BeforeAll
    static void setupDatabaseConnection() {
        System.out.println("데이터베이스 연결 설정을 초기화합니다.");
    }

    @Test
    void testQueryExecution() {
        System.out.println("쿼리 실행 테스트 수행 중");
    }
}

5. @AfterClass / @AfterAll

@AfterClassJUnit4에, @AfterAllJUnit5에서 사용되며, 모든 테스트가 종료된 후에 한 번만 실행됩니다. 주로 자원 해제에 유용합니다.

예제: JUnit4:

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

public class NetworkTest {

    @AfterClass
    public static void cleanUpAll() {
        System.out.println("전체 테스트 종료 후 정리 작업을 수행합니다.");
    }

    @Test
    public void networkConnectionTest() {
        System.out.println("네트워크 연결 테스트 중");
    }
}

예제: JUnit5:

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;

public class NetworkTest {

    @AfterAll
    static void cleanUpAll() {
        System.out.println("전체 테스트 종료 후 정리 작업을 수행합니다.");
    }

    @Test
    void networkConnectionTest() {
        System.out.println("네트워크 연결 테스트 중");
    }
}

6. @Ignore / @Disabled

@IgnoreJUnit4에서, @DisabledJUnit5에서 사용되며, 특정 테스트 메서드를 일시적으로 제외할 때 사용됩니다.

예제: JUnit4:

import org.junit.Ignore;
import org.junit.Test;

public class PaymentTest {

    @Test
    public void testPaymentSuccess() {
        System.out.println("결제 성공 테스트 수행 중");
    }

    @Ignore("현재 결제 실패 테스트는 구현 중입니다.")
    @Test
    public void testPaymentFailure() {
        System.out.println("결제 실패 테스트는 무시됩니다.");
    }
}

예제: JUnit5:

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

public class PaymentTest {

    @Test
    void testPaymentSuccess() {
        System.out.println("결제 성공 테스트 수행 중");
    }

    @Disabled("현재 결제 실패 테스트는 구현 중입니다.")
    @Test
    void testPaymentFailure() {
        System.out.println("결제 실패 테스트는 무시됩니다.");
    }
}

7. @ParameterizedTest

JUnit5에서만 제공되며, 동일한 테스트를 다양한 매개변수로 반복하고 싶을 때 유용합니다.

예제:

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class ParameterizedTestExample {

    @ParameterizedTest
    @ValueSource(strings = { "apple", "banana", "orange" })
    void testWithParameters(String fruit) {
        assertTrue(fruit.length() > 0);
    }
}

8. 사용자 정의 어노테이션

사용자 정의 어노테이션은 프로젝트 특성에 맞는 어노테이션을 만들고 사용할 수 있도록 합니다. 이는 특정 테스트 메서드를 구분하거나 프로젝트에서만 필요한 기능을 표시할 때 유용합니다.

사용자 정의 어노테이션 예제:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CustomTest {
    String value() default "Custom Test";
}

사용 예제:

public class CustomTestExample {

    @CustomTest(value = "커스텀 테스트")
    public void exampleTest() {
        System.out.println("사용자 정의 어노테이션 테스트 중");
    }
}
profile
Why not change the code?

0개의 댓글