
JUnit은 Java에서 단위 테스트를 쉽게 작성하고 관리할 수 있도록 다양한 어노테이션을 제공합니다. 어노테이션을 사용하면 각 메서드가 어떤 역할을 수행하는지 명확하게 나타낼 수 있어 테스트 코드의 가독성을 크게 높일 수 있습니다. 이번 글에서는 JUnit에서 자주 사용하는 어노테이션의 기능과 예제를 통해 알아가보도록 하겠습니다.
@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이어야 합니다.");
}
}
@Before는 JUnit4에서, @BeforeEach는 JUnit5에서 사용되며, 각 테스트 메서드 실행 전 수행될 작업을 정의합니다.
예제: 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("데이터베이스 연결 테스트 수행 중");
}
}
@After는 JUnit4에서, @AfterEach는 JUnit5에서 사용되며, 각 테스트 메서드 실행 후에 수행될 작업을 정의합니다.
예제: 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("파일 읽기 테스트 수행 중");
}
}
@BeforeClass는 JUnit4에서, @BeforeAll은 JUnit5에서 사용됩니다. 테스트 클래스 시작 전에 한 번만 실행되어 여러 테스트 메서드가 공유할 자원 초기화에 적합합니다. 두 어노테이션 모두 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("쿼리 실행 테스트 수행 중");
}
}
@AfterClass는 JUnit4에, @AfterAll은 JUnit5에서 사용되며, 모든 테스트가 종료된 후에 한 번만 실행됩니다. 주로 자원 해제에 유용합니다.
예제: 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("네트워크 연결 테스트 중");
}
}
@Ignore는 JUnit4에서, @Disabled는 JUnit5에서 사용되며, 특정 테스트 메서드를 일시적으로 제외할 때 사용됩니다.
예제: 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("결제 실패 테스트는 무시됩니다.");
}
}
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);
}
}
사용자 정의 어노테이션은 프로젝트 특성에 맞는 어노테이션을 만들고 사용할 수 있도록 합니다. 이는 특정 테스트 메서드를 구분하거나 프로젝트에서만 필요한 기능을 표시할 때 유용합니다.
사용자 정의 어노테이션 예제:
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("사용자 정의 어노테이션 테스트 중");
}
}