Junit
은 자바 프로그래밍 언어용 유닛 테스트 프레임워크이다.
Junit
은 테스트 주도 개발 면에서 중요하며
Sunit
과 함께 시작된XUnit
이라는 이름의 유닛 테스트 프레임워크 계열의 하나이다.
Junit5을 Gradle로 사용을 할 경우 인텔리제이에서 설정이 필요하다.
인텔리제이에서 프로젝트를 만들시 첫 세팅의 경우 전체 Gradle을 읽게 되어있다.
이부분을 인텔리제이 로 바꾸면 Test 할때 Test쪽 빌드만되게 된다.
@DisplayName
의 경우 전에는 함수에다가Test함수
라는 한글 방식의 이름
으로 작성을 했으나 junit5로 넘어오면서@DisplayName
이라는 함수를 통해서 사용을 하고 있다.
junit4 로 된경우 함수에 언더스코어 표기법을 사용하고 있는데
버전업시킬시@DisplayNameGeneration
를 사용하여 리팩토링 시킬 수 있다.
Junit5 에서 생명주기가 존재한다. 어노테이션으로 제공이된다.
@BeforeAll
,@AfterAll
,@BeforeEach
,@AfterEach
Junit 에서 단정문은 기본적인 것만 제공이된다.
추가적인 기능을 사용시AssertJ
,Hamcrest
추가하여 사용하도록 하자
Junit 에서 assertion 의 기능은 전체기능이 있다.
이번에 추가된 기능이기도 하다. 이전 버전에서는 assertion 에 실패를 할 경우 나머지
assertion 문이 실행이 되지 않았기 때문에 전체를 성공시키기 위해서 여러번 테스트를 수행하였다.
인자인 함수를 통하여 전달함으로 전체의 단정문을 한번에 평가를 한다.
단정문이 실패시 예외가 발생하면서 종료가 되고
성공시 success 가 된다.
예외의 내부 상태를 검증하는 기능이 추가되었다.
전 버전에는@Test
를 이용하여 기대하는 예외 기술하는 방식으로 테스트를 수행했기 때문에
단순하게 예외가 발생하는지 여부만 검증하는 형태였다.
단정문을 통하여 예외 발생을 검증하고 그 예외를 반환하여 예외의 상태를 검증이 가능하다
예외가 던져지지 않음을 검증하는 단정문도 추가가되었다. 특정한 코드 블록일때만 사용이 가능하고 있다는 존재만 생각하자
5버전에서는 타임아웃 관련한 기능이 추가가 되었다.
이전 버전에서도 가능은 하였다@Rule
이나@Test(timeout=2000L)
로는 가능하지만
assertion 문에서는 가능하지 못했기 때문에 작성을 한다.
데이터 생성 부분에서 제약조건을 걸 수 있기 때문에 유용하게 사용이 가능하다.
특정 조건을 전제하고 테스트를 수행할 수 있다.
assumeTrue
를 통해서 전제조건을 검증한 경우 이후 테스트 전체가 실해되지 않지만
assumeThat
를 통해서 전제조건을 검증한 경우에는 해당하는 메소드이 파라미터로 전달된
코드만 실행되지 않고 이후 테스트는 정상적으로 수행
CI 와 같이 특정환경에서만 테스트를 진행하는 경우 사용 가능
테스트 클래스안에서 내부클래스(Inner 클래스)를 정의해
테스트를 계층화 할 수 있다.
@ParameterizedTest
는 반복적으로 수행해야할 테스트의 데이터를 정의하는 어노테이션
반복문 , 조건문 등에서 수행이 가능하며 사용할 데이터와 코드가 분리되여 가동성면에서 뛰어나다
테스트하는 함수의 속성이 뚜렷하다
@ParameterizedTest
어노테이션을 선언을 한 테스트 함수에서 데이터를 지정하는 방식으로
테스트 데이터를 지정할 수 있다.@EmptySource
,@NullSource
를 통하여 Null 이나 빈값을 전달할 수 있으며
@ValueSource
를 통하여 값을 전달이 가능하다. 파라미터 타입과 맞아야함으로 하나만 전달이 가능하다.
여러개를 전달할 경우@CsvSource
를 사용하면된다. (@CsvFileSource
,@EnumSource
또한 있다.)
테스트를 수행할 수 없는 상황이 생겼을 경우 해당하는 테스트 코드에 어노테이션을 붙여주면 실행이 되지 않는다.
( 전체 실행 시 해당하는 함수가 실행이 되지 않는다 )