JUnit 5
자바 프로그래밍 언어 용 단위 테스트 프레임워크
단위 테스트는 각 단위가 정확하게 동작하는지를 검사하는 테스트 기법으로 빠르게 작성할 수 있고 문제 발생 시 잘못된 부분을 손쉽게 장점이 있다.
Befor After
JUnit 테스트에 대하여 테스트의 실행/종료 시 호출
@BeforeEach
void setUp() {
System.out.println("각각의 테스트 코드가 실행되기 전에 수행");
}
@AfterEach
void tearDown() {
System.out.println("각각의 테스트 코드가 실행된 후에 수행\n");
}
@BeforeAll
static void beforeAll() {
System.out.println("모든 테스트 코드가 실행되기 전에 최초로 수행\n");
}
@AfterAll
static void afterAll() {
System.out.println("모든 테스트 코드가 수행된 후 마지막으로 수행");
}
테스트1 테스트 2라는 이름의 테스트가 있을 경우,
- beforeAll
- setUp
- 테스트1
- tearDown
- setUp
- 테스트2
- tearDown
- afterAll
순서로 실행되게 된다.
테스트 꾸미기 - DisplayName, Nested, TestMethodOrder
@DisplayName
테스트 네이밍
@Test
@DisplayName("테스트의 내용을 한눈에 알아볼 수 있게 네이밍 해줄 때")
void test1() {
System.out.println("테스트 내용 빠르게 파악");
}
@Nested
테스트 그룹화 (클래스 화)
@Nested
@DisplayName("Test2 다른 주제")
class Test2 {
@Test
@DisplayName("Test2 - test1()")
void test1() {
System.out.println("Test2.test1");
}
@Test
@DisplayName("Test2 - test2()")
void test2() {
System.out.println("Test2.test2");
}
}
@TestMethodOrder, @Order
Order로 테스트 실행 순서 지정
@Nested
@DisplayName("주제 별로 테스트를 그룹지어서 파악하기 좋습니다.")
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class Test1 {
@Order(1)
@Test
@DisplayName("Test1 클래스")
void test() {
System.out.println("\nTest1 클래스");
}
@Order(3)
@Test
@DisplayName("Test1 - test1()")
void test1() {
System.out.println("Test1.test1");
}
@Order(2)
@Test
@DisplayName("Test1 - test2()")
void test2() {
System.out.println("Test1.test2");
}
}
테스트 반복 - RepeatedTest, ParameterizedTest
@RepeatedTest
value만큼 테스트 반복
@RepeatedTest(value = 5, name = "반복 테스트 {currentRepetition} / {totalRepetitions}")
void repeatTest(RepetitionInfo info) {
System.out.println("테스트 반복 : " + info.getCurrentRepetition() + " / " + info.getTotalRepetitions());
}
@ParameterizedTest, @ValueSource
ValueSource에서 각 반복 회차의 파라미터 값을 넣어줄 수 있다.
@DisplayName("파라미터 값 활용하여 테스트 하기")
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})
void parameterTest(int num) {
System.out.println("5 * num = " + 5 * num);
}
반복 기능으로 분류하였으나 정확히는 파라미터 값을 넣을 수 있다는 것에 의미가 있다.
Assertion
실행 결과를 예측하고 검사한다.
assertEquals, assertNotEquals
값1, 2의 값이 동일한가? 동일하지 않은가?
@Test
@DisplayName("assertEquals")
void test1() {
assertEquals(2.5, 5.0 / 2.0);
}
@Test
@DisplayName("assertNotEquals")
void test1_2() {
assertNotEquals(2.5, 2);
}
assertTrue, assertFalse
값이 true인가? false인가?
@Test
@DisplayName("assertTrue 와 assertFalse")
void test2() {
assertTrue(9 == 9);
assertFalse(0 == 9);
}
assertNotNull, assertNull
값이 null이 아닌가? null인가?
@Test
@DisplayName("assertNotNull 과 assertNull")
void test3() {
TestObject obj1 = new TestObject();
TestObject obj2;
assertNotNull(obj1);
assertNull(obj2);
}
assertThrows
값이 Throwable을 던지는가?
@Test
@DisplayName("assertThrows")
void test4() {
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> 예외를 던질 메서드...);
assertEquals("잘못된 연산자입니다.", exception.getMessage());
}
assertThrows의 경우 결과를 검사할 뿐만 아니라 throwable 객체를 반환 받을 수 있다.
Given, When, Then 패턴
테스트 코드를 보기 좋게 작성하기 위한 표현 방식
Given
- 테스트 하고자하는 대상을 실제로 실행하기 전에 테스트에 필요한 값(상태)을 미리 선언한다.
When
- 테스트 하고자하는 대상을 실제로 실행 시킨다.
Then
- 테스트 실행 시 발생할거라고 예상되는 결과에 대해 예측하고 검사한다.
- assertion이 사용된다.
위 링크에서 이전에 Mockito를 사용해보며 작성했던 테스트 코드가 있다.
Given - When - Then 패턴을 적용하였기 때문에 참고하면 좋을 듯!
'Spring' 카테고리의 다른 글
[Spring] DB 테스트 환경 분리 (0) | 2024.06.13 |
---|---|
[Spring] AOP란 무엇일까? (+Spring AOP) (0) | 2024.06.12 |
[Spring] Naver, Google 로그인 (OAuth2) (0) | 2024.06.10 |
[Spring] Naver 로그인 (Oauth2 X) (1) | 2024.06.08 |
[Spring] JPA Hibernate 칼럼 파싱 문제 (0) | 2024.06.05 |