Development/Application Test
[JUnit 5] Assertions의 사용
sky Jeong
2022. 8. 29. 23:22
1- Assertions
- Assertions : 번역하자면 단정문.
- 성공하지 않으면 실패 처리를 하기 위함.
- junit.jupiter.api.Assertions 클래스에 존재하며 import시 static으로 import 하여 활용 가능
- 참고로 JUnit은 자바의 reflection을 사용하기에 public이 필요 없어 접근 지정자에 따른 제약이 없음.
(이거는 강의 들어야할듯 ㅠㅠ)
2- 테스트 수행 시점에 따른 Annotation
- **All
전체 테스트 수행 전/후 딱 1회로 수행함
- Default 접근 지정자만 허용함
- 반드시 static 메서드로 선언해야 함
- 리턴 타입이 존재하면 안됨
- 메서드 이름은 무관함 - **Each
각 테스트 수행 전/후마다 수행함
- Default 지정자만 허용함
- 리턴 타입이 있으면 안됨
- 메서드 이름은 상관 없음 - BeforeAll / AfterAll / BeforeEach / AfterEach
3- 테스트 메서드 미 수행 처리
- @Disabled
- 테스트 실행을 막음
- 웬만해서는 모든 테스트 케이스를 통과해야하기에 실행을 막지 않는게 좋지만, 테스트 코드가 덜 짜여졌다거나 등등의 경우에 활용 가능
4- 테스트 묶어서 실행
- assertAll
- 연관된 테스트를 한 번에 실행 가능함
- 한 번에 모든 테스트를 수행해 깨지는 테스트를 동시에 확인할 수 있음
- 람다식을 사용해 코드 작성
5- 테스트 코드 작성
- 위 예시 코드 마지막 파라미터에 보면 스트링 값을 넘겨주고 있는데, 이는 테스트 실패시 출력하는 메시지를 입력한 것.
-> 이로 더 쉽게 디버깅이 가능함. - 뒤 메시지는 람다식으로 작성이 가능한데, 원래 마지막 파라미터에는 Supplier가 들어가며 Return 값은 출력 메시지를 작성함.
이는 문자열 연산이 필요할 떄. 즉, 람다식으로 만들어주면 필요한 시점인 테스트 실패시에만 수행됨.
[ 아래 코드 중 두 번째, 세 번째 코드 ] - 만약 람다식으로 선언하지 않고 그냥 스트링(String)으로 넘겨준다면 성공하든 실패하든 무조건 문자열 생성과 연산이 수행되어 메모리가 낭비됨. [ 아래 코드 중 첫 번째 코드 ]
6- 예외 발생 테스트
7- 시간 초과 (Timeout) 테스트
- assertTimeout
- 수행하는 테스트가 expect시간을 넘는지 테스트
- 해당 메서드는 테스트 대상의 수행 시간을 기준으로 비교함.
- 한 마디로 테스트 기준 시간을 넘어간다하여도 해당 코드 블럭이 수행이 끝날때까지 기다렸다가 테스트 결과를 반환한다는 뜻.
--> 이때는 테스트 수행 시간을 벗어나니 당연 fail - assertTimeoutPreemptively
- 수행 기준 시간을 넘어가면 테스트 fail 후 종료 처리
- assertTimeout과 달리 제한 시간을 넘을 경우 테스트가 종료됨
- 허나 이는 ThreadLocal에서 예상치 못한 문제가 발생할 수 있기에 LocalThread와 무관한 코드라면 사용해도 괜찮겠으나,
아닌 경우 시간이 조금 걸리더라도 assertTimeout을 사용하는게 더 안전함
- 간단하게 이야기하자면 Transactional한 테스트를 rollback하는 경우가 존재하는데, Rollback이 안되고 DB에 반영되는 문제가 발생할 수 있음.