본문 바로가기

TIL

[Spring]JUnit5

728x90

학습목표

  • JUnit이란?

-자바 개발자의 93%가 사용하는 단위 프레임워크

 

  • JUnit5 란?

-platform : 테스트를 실행해주는 런처 제공. TestEngine API 제공

-Jupiter : JUnit5를 지원하는 TestEngine API 구현체

-Vintage : JUnit4와 3를 지원하는 TestEngine구현체

 

 

 

JUnit5부터 JUnit5 그 자체로 모듈화가 되어있음 JUnit플랫폼 위에 Jupiter와 Vintage를 올릴 수 있는 구조로 되어있다.

  • Annotations

-테스트라는 것을 나타내는 어노테이션 @Test

   JUnit4와 다르게 어떠한 속성도 선언하지 않는다.

   테스트 메서드가 하나 실행된후 종료되면 데이터가 초기화 됨 >> @DataJpaTest 안에 @Transactional이 초기화시킴

    but ! primary key auto_increment값이 초기화가 안됨 >> 초기화 시키는 방법 id 값이 필요한 메서드위에 @Sql("classpath:db/tableInit.sql")을 생성하여 테스트시작 직전마다 key값이 db에서 초기화되게끔 만듦

-생명주기(LifeCycle) 어노테이션

    @BeforeAll: 해당 클래스에 위치한 모든 테스트 메서드 실행 전에 딱 한번 실행되는 메서드

    @AfterAll : 해당 클래스에 위치한 모든 테스트 메서드 실행 후에 딱 한번 실행되는 메서드

              -JUnit4의 @BeforeClass/@AfterClass와 유사

      @BeforeEach : 해당 클래스에 위치한 모든 테스트 메서드 실행 전에 실행되는 메서드

      @AfterEach : 해당 클래스에 위치한 모든 테스트 메서드 실행 전에 실행되는 메서드

              -JUnit4의 @Before/@After와 유사

              - 매 테스트 메서드마다 새로운 클래스를 생성(new)하여 실행(비효율적)

-@Disabled : 문제가 해결될 때까지 테스트 중단(JUnit4의 Ignore와 같은 역할)

   테스트하고 싶지 않은 클래스나 메서드에 붙이는 어노테이션 

   JUnit4의 @Ignore와 유사

-@DisplayName

   어떤 테스트인지 쉽게 표현할 수 있도록 해주는 어노테이션

   공백, Emoji, 특수문자 등을 모두 지원

-@RepeatedTest : 성능적인 이슈를 확인할 때 사용할 수 있음 displayName , currentRepetition, totalRpetitons을 이용하면 각 iteration의 DispayName을 커스텀하게 출력할 수 있다.

   특정 테스트를 반복시키고 싶을 때 사용하는 어노테이션

   반복 횟수와 반복 테스트 이름을 설정 가능

-@ParameterizedTest : 반복적으로 수행해야 할 테스트에 데이터를 정의할 수 있는 어노테이션

   테스트에 여러 다른 매개변수를 대입해가며 반복 실행할 때 사용하는 어노테이션 (반복문을 사용하는 것보다 가독성이 향상되고 테스트의 성격이나 목적 등을 잘 드러낼 수 있다)

-@Nested

   테스트 클래스 안에서 내부 클래스를 정의해 테스트를 계층화할 때 사용

   내부 클래스는 부모 클래스의 멤버 필드에 접근 가능

   Before/After와 같은 테스트 생명주기에 관계된 메서드들도 계층에 맞춰 동작

-@Order

   테스트는 순서대로 테스트가 진행이되지 않지만 order어노테이션을 붙이면 순서대로 테스트가 실행이됨

  • Assertions 

-사전적 의미 : 주장, 행사, 단정문

-테스트 케이스의 수행 결과를 판별하는 메서드

-모든 JUnit, Jupiter, Assertions는 static 메서드

-assertAll(executables...)

   이전 버전에서는 assertion에 실패할 경우 나머지 assertion이 실행되지 않았기 때문에 전체를 성공시키기 위해서는 여러 번 테스트를 수행하면서 코드를 수정해야 했지만 assertAll을 하게 되면 끝까지 실행이 되면서 발생한 오류를 모아서 한 번에 확인이 가능하다

  매개변수로 받는 모든 테스트 코드를 한 번에 실행

   오류가 나도 끝까지 실행한 뒤 한번에 모아서 출력 

-assertThrows(expectedType, executable) 예외 발생을 검증하고 예외를 반환받아서 예외의 상태까지 검증할 수 있음

   예외 발생을 확인하는 테스트

   executable의 로직이 실행하는 도중 expectedType의 에러를 발생시키는지 확인

-assertTimeout(duration, executable)

   특정 시간 안에 실행이 완료되는지 확인하는 단정문 인자로 원하는 시간과 테스트 로직을 받음 이전 버전에서는 @Rule을 이용해 검증이 가능하긴 했지만 단정문을 사용함으로써 테스트 메서드 내부의 처리뿐만 아니라 데이터를 생성하는 부분과 같은 것들을 더 유연하게 테스트할 수 있게 됨

   Duration : 원하는 시간

   Executable : 테스트할 로직

  • Assumption : 특정 조건을 전제하고 테스트를 수행할 수 있다. ci와 같은 특정 조건에서 테스트를 진행해야 하는 경우에 사용할 수 있음

-전제문이 true라면 실행, false라면 종료

-assumeTrue : false일 때 테스트 전체가 실행되지 않음

-assumingThat : 파라미터로 전달된 코드블럭만 실행되지 않음

728x90