1. JUnit이란?
자바 프로그래밍 언어용 단위 테스트 프레임워크
2. JUnit 5 모듈 구성
1) JUnit 플랫폼: 테스팅 프레임 워크를 구동하기 위한 런처와 테스트 엔진을 위한 API 제공
2) JUnit 주피터(Jupiter): JUnit5를 위한 테스트 API와 실행 엔진을 제공 (api 모듈 / prams 모듈 / engine 모듈 포함)
3) JUnit 빈티지(Vintage): JUnit3, JUnit4로 작성된 테스트를 JUnit5 플랫폼에서 실행하기 위한 모듈 제공
* build.gradle 파일을 보면 JUnit 사용을 위한 환경설정이 이미 되어 있음
2. @Test 어노테이션
테스트로 사용할 클래스를 만들고 @Test 어노테이션을 메서드에 붙이면 됨
- 테스트 클래스명은 주로 접미사로 'Test'를 붙임
- @Test 어노테이션을 붙인 메소드는 private면 안됨
cf) JUnit4는 @Test 어노테이션이 org.junit 패키지에 포함
3. JUnit의 Assertions클래스
assert method를 단정문이라고하는데
단정문이라는게 an assertive sentence라는 뜻으로 영어사전에는 나오지만, 우리말로 사전에 검색하면 안나와서 이게 뭔가 했다.
우리말로 단정은 딱 잘라서 판단하고 결정함을 나타내는 단어이고, assert의 뜻도 주장하다라는 뜻이니까
주장을 의미하는 것으로 이해하면 될 것 같다.
- 테스트 작성에 유용한 assertion(단정, 주장) 메서드 집합
- 값을 검증하기 위한 목적의 다양한 정적 메소드 제공
- 실패한 assertion만 기록됨
- 메서드는 직접 사용(Assert.assertEquals(...))할 수 있지만 아래 코드와 같이 정적(satic) import를 통해 참조되는 경우 더 잘 읽힘
import static org.junit.Assert.*;
...
assertEquals(...);
4. Assert method 종류와 설명
분류 | 메소드 & 설명 |
Equals |
assertArrayEquals(byte[] expecteds, byte[] actuals) 두 바이트 배열이 같다고 주장 |
assertArrayEquals(char[] expecteds, char[] actuals) 두 문자 배열이 같다고 주장 |
|
assertArrayEquals(int[] expecteds, int[] actuals) 두 int 배열이 같다고 주장 |
|
assertArrayEquals(long[] expecteds, long[] actuals) 두 개의 긴 배열이 같다고 주장 |
|
assertArrayEquals(java.lang.Object[] expecteds, java.lang.Object[] actuals) 두 개체 배열이 같다고 주장 |
|
assertArrayEquals(short[] expecteds, short[] actuals) 두 개의 짧은 배열이 같다고 주장 |
|
assertArrayEquals(java.lang.String message, byte[] expecteds, byte[] actuals) 두 바이트 배열이 같다고 주장 |
|
assertArrayEquals(java.lang.String message, char[] expecteds, char[] actuals) 두 문자 배열이 같다고 주장 |
|
assertArrayEquals(java.lang.String message, int[] expecteds, int[] actuals) 두 int 배열이 같다고 주장 |
|
assertArrayEquals(java.lang.String message, long[] expecteds, long[] actuals) 두 개의 long 배열이 같다고 주장 |
|
assertArrayEquals(java.lang.String message, java.lang.Object[] expecteds, java.lang.Object[] actuals) 두 개체 배열이 같다고 주장 |
|
assertArrayEquals(java.lang.String message, short[] expecteds, short[] actuals) 두 개의 short 배열이 같다고 주장 |
|
assertEquals(double expected, double actual, double epsilon)사용 |
|
assertEquals(double expected, double actual, double delta) 두 개의 double 또는 float가 양의 델타 내에서 같다고 주장 |
|
assertEquals(long expected, long actual) 두 개의 long이 같다고 주장 |
|
assertArrayEquals 사용 |
|
assertEquals(java.lang.Object expected, java.lang.Object actual) 두 개체가 같다고 주장 |
|
assertEquals(String message, double expected, double actual, double epsilon) 사용 |
|
assertEquals(java.lang.String message, double expected, double actual, double delta) 두 개의 double 또는 float가 양의 델타 내에서 같다고 주장 |
|
assertEquals(java.lang.String message, long expected, long actual) 두 개의 long이 같다고 주장 |
|
assertArrayEquals사용 |
|
assertEquals(java.lang.String message, java.lang.Object expected, java.lang.Object actual) 두 개체가 같다고 주장 |
|
False |
assertFalse(boolean condition) 조건이 거짓임을 확인 |
assertFalse(java.lang.String message, boolean condition) 조건이 거짓임을 확인 |
|
Not Null |
assertNotNull(java.lang.Object object) 개체가 null이 아님을 확인 |
assertNotNull(java.lang.String message, java.lang.Object object) 개체가 null이 아님을 확인 |
|
Not same |
assertNotSame(java.lang.Object unexpected, java.lang.Object actual) 두 개체가 동일한 개체를 참조하지 않는다고 주장 |
assertNotSame(java.lang.String message, java.lang.Object unexpected, java.lang.Object actual) 두 개체가 동일한 개체를 참조하지 않는다고 주장 |
|
Null | assertNull(java.lang.Object object) 개체가 null임을 확인 |
assertNull(java.lang.String message, java.lang.Object object) 개체가 null임을 확인 |
|
Same | assertSame(java.lang.Object expected, java.lang.Object actual) 두 개체가 동일한 개체를 참조한다고 주장 |
assertSame(java.lang.String message, java.lang.Object expected, java.lang.Object actual) 두 개체가 동일한 개체를 참조한다고 주장 |
|
That | assertThat(java.lang.String reason, T actual, org.hamcrest.Matcher<T> matcher) 실제 값이 matcher에서 지정한 조건을 충족하는지 확인 |
assertThat(T actual, org.hamcrest.Matcher<T> matcher) 실제 값이 matcher에서 지정한 조건을 충족하는지 확인 |
|
True | assertTrue(boolean condition) 조건이 참임을 확인 |
assertTrue(java.lang.String message, boolean condition) 조건이 참임을 확인 |
|
fail | fail() 메시지 없이 테스트 실패 |
fail(java.lang.String message) 주어진 메시지로 테스트 실패 |
5. 테스트 라이프 사이클
1) JUnit의 테스트 메소드 실행 순서
- 테스트 메소드를 포함한 객체 생성
- @BeforeEach 메소드 실행
- @Test 메소드 실행
- @AfterEach 메소드 실행
2) 실행 순서 관련 에너테이션
@BeforeEach
- 테스트를 실행할 때 필요한 준비 작업이 필요할 때 사용
- private이면 안됨
- ex. 테스트에 사용할 임시 파일 생성, 테스트 메소드에서 사용할 객체 생성
@AfterEach
- 테스트를 실행한 후에 정리할 것이 있을 때 사용
- ex. 테스트에서 사용한 임시 파일을 삭제 할 때
- private이면 안됨
@BeforeAll
한 클래스의 모든 테스트 메소드가 실행하기 전에 특정 작업을 수행해야 할 때 사용, 정적 메소드에 붙임
@AfterAll
한 클래스의 모든 테스트 메소드가 실행한 후에 특정 작업을 수행해야 할 때 사용, 정적 메소드에 붙임
3) 테스트 메소드 간 실행 순서 의존과 필드 공유 지양
Junit은 테스트 메소드의 실행 순서를 지정하는 방법을 제공
but 각 테스트 메소드는 독립적으로 동작해야함, 테스트 메소드 간 의존이 생기면 테스트 코드의 유지보수가 어려워짐
6. 추가 어노테이션
@DisplayName
- 테스트에 표시할 이름을 붙일 수 있음 (어노테이션 사용안하면 메소드명)
@Disabled
- 특정 테스트를 실행하지 않고 싶을 때 사용
https://junit.sourceforge.net/javadoc/org/junit/Assert.html
'Spring > Test' 카테고리의 다른 글
테스트 주도 개발 시작하기 - TDD 시작, TDD란 (0) | 2022.11.27 |
---|---|
📝 테스트 코드 작성의 장/단점과 테스트 범위에 따른 분류 (0) | 2022.11.18 |
Mock object를 이용한 단위 테스트 (0) | 2022.11.15 |
TDD (Test-Driven Development) 테스트 주도 개발 (0) | 2022.11.15 |
Edge 케이스를 고려한 단위 테스트 (0) | 2022.11.15 |