본문 바로가기

Test Code

Junit5란?

JUnit5란?

자바 개발자가 가장 많이 사용하는 테스팅 프레임 워크

자바 현직 개발자 중 93% Junit 사용, 그 중 51%는 Mockito 사용

  • Platform : 테스트를 실행해주는 런처 제공, TestEngine API 제공
  • Jupiter : TestEngine API의 구현체로 JUnit5를 제공
  • Vintage : JUnit 4와 3을 지원하는 TestEngine 구현체

JUnit5 시작하기

  • 스프링 부트 프로젝트 2.2버전 이상부터는 기본적으로 의존성 추가
  • 스프링 부트 프로젝트가 아닐경우 다음과 같은 의존성 추가
<dependency>
	<groupId>org.junit.jupiter</groupId>
	<artifactId>junit-jupiter-engine</artifactId>
	<version>5.6.2</version>
	<scope>test</scope>
</dependency>

Junit5가 제공하는 Annotations

📌 @overriding 애노테이션 (annotation)

애노테이션은 원래 주석이라는 의미
컴파일러에게 특별한 정보를 제공해주는 역할

생명 주기 Annotations

  • @BeforeAll : 해당 클래스에 위치한 모든 테스트 메서드 실행 전 딱 한번 실행되는 메서드
  • @AfterAll : 해당 클래스에 위치한 모든 테스트 메서드 실행 후 딱 한번 실행되는 메서드
  • @BeforeEach : 해당 클래스에 위치한 모든 테스트 메서드 실행 전에 실행되는 메서드
  • @AfterEach : 해당 클래스에 위치한 모든 테스트 메서드 실행 후에 실행되는 메서드
  • @BeforeAll vs @BeforeEach
    • test가 조건에 어떠한 변경도 하지 않는다! → @BeforeAll
    • test가 조건에 영향을 미치면 조건을 초기화 해줘야 한다! → @Before Each

@Test

  • 테스트 메서드라는 것을 나타내는 어노테이션
  • JUnit4와 다르게 어떠한 속성도 선언하지 않는다
//JUnit4
@Test(expected = Exception.class)
void create() throws Exception {
	...
}
//Junit5
@Test
void create() {
	...
}

@Disabled

  • 테스트를 하고 싶지 않은 클래스나 메서드에 붙이는 어노테이션
  • class DisabledExample{ @Test @Disabled("문제가 해결될 때까지 테스트 중단") void test() { Sysyem.out.println("테스트"); }

@DisplayName

  • 어떤 테스트인지 쉽게 표현할 수 있도록 해주는 어노테이션
  • JUnit5에서 가장 활발히 사용하고 있는 어노테이션
  • 공백, Emoji, 특수문자 등을 모두 지원
@DisplayName("특수 테스트\\uD83D\\uDE00")
class DisplayNameExample {
	@Test
	@DisplayName("굉장한 테스트입니다.")
	void test(){
	}
}

@RepeatedTest

  • 특정 테스트를 반복시키고 싶을 때 사용하는 어노테이션
  • 반복 횟수와 반복 테스트 이름을 설정 가능
  • 성능적 이슈 확인 시 사용
public class ExampleTest {

    @DisplayName("Addition Test")
    @RepeatedTest(value = 3, name = "{displayName} - repetition {currentRepetition} of {totalRepetitions}")
    void add() {
        int result = 1 + 2;
        assertTrue(result == 3, "1 + 2 should equal 3");
    }
}

@ParameterizedTest

  • 테스트에 여러 다른 매개변수를 대입해가며 반복 실행할 때 사용하는 어노테이션
//delimiter은 콤마 외에도 구분자를 지정할 수 있는 속성
@ParameterizedTest
@CsvSource(value = {"ACE,ACE:12", "ACE,ACE,ACE:13"}, delimiter = ':')

@Nested

  • 테스트 클래스 안에서 내부 클래스를 정의해 테스트를 계층화 할 때 사용
  • 내부 클래스는 부모 클래스의 멤버 필드에 접근 가능
  • Befor/After와 같은 테스트 생명주기에 관계된 메소드들도 계층에 맞춰 동작

Assertions

  • 사전적 의미 : 주장, 행사, 단정문
  • 테스트 케이스의 수행 결과를 판별하는 메서드
  • 모든 Junit Jupiter Assertions는 static 메서드

assertTimeout(duration, executable)

  • 특정 시간 안에 실행이 완료되는지 확인
    • duration : 원하는 시간
    • executbale : 테스트할 로직

assertAll(executables…)

매개변수로 받는 모든 테스트 코드를 한번에 실행하며 오류가 나도 끝까지 실행 후 모아서 출력

assertAll(
	() -> assertNotNUll(study),
	() -> assertEquals(...),
	() -> assertTrue(...)
);

assertThrows(expectedType, executable)

  • 예외 발생을 확인하는 테스트
  • executable의 로직이 실행하는 도중 expectedType의 에러 발생 여부 확인
@Test
void exceptionThrow() {
	Exception e = assertThrows(Exception.class, () -> new Test(-10));
	assertDoesNotThrow(() -> System.out.println("Do Something"));
}

Assumption

  • 전제문이 true라면 실행, false라면 종료
  • assumeTrue : false일 때 이후 테스트 전체가 실행되지 않음
  • assumingThat : 파라미터로 전달된 코드블럭만 실행되지 않음
void dev_env_only() {
	assumeTrue("DEV" .equals(System.getenv("ENV")), () -> "개발환경이 아닙니다.");
	**assertEquals("A", "A"); // 단정문이 실행되지 않음**
}

void some_test() {
	assumingThat("DEV" .equals(System.getenv("ENV")),
		() -> {
						**assertEquals("A", "B");// 단정문이 실행되지 않음**
		});
	**assertEquals("A", "A");// 단정문이 실행됨**
}

'Test Code' 카테고리의 다른 글

Controller 계층에 관한 테스트  (0) 2026.01.18
TDD란?  (0) 2026.01.18