본문 바로가기
시리즈/자바

[TEST] 테스트를 위한 JUnit 5 와 AssertJ ①

by 되고싶은노력가 2024. 10. 24.

들어가며.

프리코스 2주차가 벌써 절반이 지났습니다. TDD 를 적용하고자 개발 전에 우선 테스트를 작성하고 기능 구현을 하는 식으로 적용하고 있는데요. 아직은 JUnit 과 AssertJ 관련 문법이 어색해서 보면서 사용하고 정리할 겸 작성하게 되었습니다.


JUnit 5 와 AssertJ.

  • JUnit 5 : 자바 단위 테스트를 위한 테스팅 프레임워크
  • AssertJ : 자바 테스트를 돕기 위해 다양한 문법을 지원하는 라이브러리

JUnit 만으로도 단위 테스트를 충분히 작성할 수 있지만 JUnit 에서 제공하는 assertEquals() 와 같은 메소드는 AssertJ 가 주는 메소드에 비해 가독성이 떨어지기에 순수 Java 애플리케이션에서 단위 테스트를 위해 JUnit 5와 AssertJ 조합이 많이 사용됩니다.


JUnit 작성 예시.

테스트를 작성하기 위해선 아래와 같은 최소 요구 사항이 필요합니다.

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

import example.util.Calculator;

import org.junit.jupiter.api.Test;

class MyFirstJUnitJupiterTests {

    private final Calculator calculator = new Calculator();

    @Test
    void addition() {
        assertEquals(2, calculator.add(1, 1));
    }
}

 

자주 사용하는 어노테이션

@Test

메서드가 테스트 메서드임을 나타냅니다. TDD 에서 자주 보이는 테스트 작성 패턴으로는 given - when - then 이 있습니다. 

  • given(준비) : 어떠한 데이터가 준비되었을 때
  • when(실행) : 어떠한 함수를 실행하면
  • then  (검증) : 어떠한 결과가 나와야한다.
class CarTest {

    @Test
    void 자동차_생성_성공() {
    	// given
        
        // when

        // then
    }
}

 

@ParameterizedTest

매개변수화된 테스트임을 나타냅니다. @ValueSource 와 보통 함께 쓰이며 선언된 인수로 테스트를 여러번 실행할 수 있습니다.

class ApplicationTest {

    @ParameterizedTest
    @ValueSource(ints = {1, 2, 3})
    void ParameterizedTest(int number) {
    }
}

 

@ValueSource

위 어노테이션을 사용하면 리터럴 값의 배열을 테스트 메서드에 전달할 수 있습니다.

// 원시 데이터 유형은 null 값을 허용할 수 없으므로 원시 인수에 @NullSource 를 사용할 수 없습니다.
// JUnit 5.4부터 @NullSource를사용하여 매개변수화된 테스트 메서드에  단일 null 값을 전달할 수 있습니다.
@ParameterizedTest
@NullSource
void isBlank_ShouldReturnTrueForNullInputs(String input) {
    assertTrue(Strings.isBlank(input));
}

// 매우 유사하게  @EmptySource  주석을 사용하여 빈 값을 전달할 수 있습니다.
@ParameterizedTest
@EmptySource
void isBlank_ShouldReturnTrueForEmptyStrings(String input) {
    assertTrue(Strings.isBlank(input));
}

 

 

@ValueSource 의 한계 중 하나는 다음 유형만 지원한다는 것입니다.

  • short (  shorts 속성 포함)
  • 바이트 ( 바이트 속성)
  • int ( ints 속성)
  • long ( longs 속성)
  • float ( floats 속성)
  • double ( doubles 속성)
  • char ( chars 속성)
  • java.lang.String ( 문자열 속성)
  • java.lang.Class ( 클래스 속성)

주의할 점으로는 null을 인수로 전달하지 않았다는 점에 유의해야 합니다.

 

 

@DisplayName

공백, 특수 문자ㅡ 이모티콘을 사용하여 테스트 보고서와 실행기, IDE 에 표시될 사용자 지정 이름을 선언할 수 있습니다.

@DisplayName("A special test case")
class DisplayNameDemo {

    @Test
    @DisplayName("Custom test name containing spaces")
    void testWithDisplayNameContainingSpaces() {
    }

    @Test
    @DisplayName("╯°□°)╯")
    void testWithDisplayNameContainingSpecialCharacters() {
    }

    @Test
    @DisplayName("😱")
    void testWithDisplayNameContainingEmoji() {
    }

}

 

@BeforeEach

위 어노테이션이 달린 메서드가 현재 클래스의 각 테스트 메서드 보다 먼저 실행되어야 함을 나타냅니다.

class ApplicationTest {
    
    @BeforeEach
    void setUp() {
        // 각 테스트 실행 전 동작.
    }
}

 

@AfterEach

위 어노테이션이 달린 메서드가 현재 클래스의 각 테스트 메서드 다음에 실행되어야 함을 나타냅니다.

class ApplicationTest {

    @AfterEach
    void done() {
        // 각 테스트 실행 후 동작
    }
}

마치며.

이외에도 많은 어노테이션이 있지만 직접 사용한 경우가 아직 없기에 추후에 사용하게 된다면 추가 작성하도록 하고, AssertJ 가 중요하기도 하고 자료가 많기에 다음 포스팅은 AssertJ 를 작성하겠습니다.


참고자료

https://junit.org/junit5/docs/current/user-guide/

https://mangkyu.tistory.com/144