본문 바로가기

Development/Application Test

[JUnit 5] Assertions의 사용

 

 

GitHub - Jeong-sky-1003/JUnit5_Study

Contribute to Jeong-sky-1003/JUnit5_Study development by creating an account on GitHub.

github.com

 

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에 반영되는 문제가 발생할 수 있음.

 

'Development > Application Test' 카테고리의 다른 글

[JUnit 5] Assertions VS Assumptions  (0) 2022.08.30
[JUnit 5] 테스트 이름 표기하기  (0) 2022.08.14
[JUnit] JUnit 5 (1) 소개  (0) 2022.08.03