[Java/자바] JUnit5란?

JUnit5 이란 ?

Java 개발자가 가장 많이 사용하는 테스팅 프레임워크로,

JAVA 8 버전부터 사용 가능하며 테스트 주도 개발(TDD, Test Driven Development)을 위해 사용됩니다.

  1. 요구사항을 검증하는 테스트 케이스 작성
  2. 테스트 통과를 위한 코드 작성 이후 작성된 테스트 케이스 실행
  3. 테스트 케이스 오류가 나는 부분을 찾아 리팩토링하여 실제 개발 코드에 적용

 

JUnit 모듈 구성

JUnit 5는 크게 3개의 요소로 구성되어 있습니다.

JUnit Platform
테스트를 발견하고 계획을 생성하고 결과를 보고하는 TestEngine 인터페이스를 정의합니다.
테스팅 프레임워크를 구동하기 위한 런처와 테스트 엔진을 위한 API를 제공

JUnit Jupiter
Junit5 TestEngine의 실제 구현체로,

JUnit 5 기반의 테스트를 위한 테스트 API와 실행 엔진(TestEngine)을 플랫폼에 제공합니다.

JUnit Vintage
TestEngine에서 Junit3 및 Junit4 기반 테스트를 실행하기 위한 기능을 제공

 


JUnit5 어노테이션

JUnit5 어노테이션 설명 JUnit4
@Test 테스트 메서드임을 선언 ( 정적 테스트 ) @Test
@ParameterizedTest 매개변수를 받는 테스트 작성  
@RepeatedTest 반복되는 테스트 작성  
@TestFactory 동적으로 테스트를 사용  
@TestInstance 테스트 클래스의 생명주기 설정  
@TestTemplate 공급자에 의해 여러 번 호출될 수 있도록 설계된 테스트 케이스 템플릿임을 나타낸다.  
@TestMethodOrder 테스트 메서드 실행 순서 구성에 사용  
@DisplayName
테스트 클래스 or 메서드의 사용자 정의 이름 선언  
@DisplayNameGeneration
이름 생성기 선언
예를 들어,  '_'를 공백 문자로 치환해주는 생성기가 있다.

( new_test -> new test )
 
@BeforeEach
모든 테스트 실행 전에 실행할 테스트 @Before
@AfterEach
모든 테스트 실행 후에 실행할 테스트 @After
@BeforeAll 현재 클래스의 모든 테스트 메서드를 실행하기 전에 한번만 실행 ( static으로 선언 )
@BeforeClass
@AfterAll 현재 클래스의 모든 테스트 메서드를 실행한 후에 한번만 실행 ( static으로 선언 ) @AfterClass
@Nested 클래스를 정적이 아닌, 중첩 테스트 클래스임을 나타낸다.  
@Tag 클래스 or 메서드 레벨에서 태그 선언할 때 사용.  
@Disabled 이 클래스나 테스트를 사용하지 않음을 표시. @Ignore
@Timeout 테스트 실행 시간 선언 후 초과되면 실패하도록 설정  
@ExtendWith 확장을 선언적으로 등록할 때 사용  
@RegisterExtension 필드를 통해 프로그래밍 방식으로 확장을 등록할 때 사용  
@TempDir 필드 주입 or 매개변수 주입을 통해 임시 디렉토리 제공하는데 사용  

 


JUnit5 Assertions 메서드

JUnit5 Jupiter Assertions 메소드는 모두 static 메소드라는 특징을 가집니다.

 

메서드 설 명
assertEquals() 두 값을 비교하여 일치 여부 판단
assertNotEquals() 예상 값과 실제 값이 다름을 확인
assertArrayEquals() 예상 배열과 실제 배열이 동일한지 확인한다.
배열이 같지 않으면 마지막 인자로 들어간 메세지가 출력된다.
assertTrue() & assertFalse() 특정 조건이 참인지 거짓인지 확인한다.
assertNotNull() & assertNull 객체가 Null이 아닌지 & Null인지 테스트
assertNotSame() & assertSame() 두 값이 동일한 객체를 참조하지 않는지 & 참조하는지 확인
fail() 무조건 실패
assertThat() 첫번째 파라미터에 비교대상 값, 두번째 파라미터에 비교 로직이 담긴 Matcher를 받는다.
assertAll() 정의한 메서드들을 모두 확인.
한 메소드에 assert함수를 여러개 선언 후 테스트를 진행할 시 상단 assert함수에서 오류가 발생하면 그 밑 함수들을 실행되지가 않는다.
assertAll()로 해당 함수들을 묶을 시 중간에 assert함수가 실행이 되지 않더라도 assert의 모든 함수를 실행할 수 있다.
assertIterableEquals() 두 Iterable이 동일하면 True
assertArrayEquals()
두 Array가 동일하면 True
assertLinesMatch() 예상 목록이 실제 목록과 일치하는지 확인
assertThrows() 예상한 예외가 발생하면 True
첫 번째 인자는 확인할 예외 클래스
두 번째 인자는 테스트하려는 코드
assertDoesNotThrows() 에러가 발생하지 않으면 True
assertTimeout() 특정 시간 안에 실행이 끝나는지 확인
시간 내 실행이 끝나는지 여부 확인 시 : assertTimeout

지정한 시간 내 끝나지 않으면 바로 종료 : assertTimeoutPreemptivel

 


AssertJ의 assertThat() 메서드와 함께 사용하기 좋은 메서드

메서드 설 명
isEqualsTo 객체가 서로 같은 값을 가지고 있는지 비교한다. 같음녀 True
isSameAs 객체가 서로 같은 주소를 참조하는지 확인한다. 같으면 True
isInstanceOf 타입을 비교하여 같으면 True.
isNotEmpty() 비어 있지 않으면 True
contains() 지정한 값을 포함하면 True
doesNotContain() 지정한 값을 포함하지 않으면 True
startWith() 지정한 값으로 시작하면 True
endWith() 지정한 값으로 끝나면 True
isPositive() 양수이면 True
isGreaterThan() 지정한 값보다 크면 True
isLessThan() 지정한 값보다 작으면 True

 

  • 문자열 테스트 예제
assertThat("Hevlog 블로그에 오신것을 환영합니다!")
	.isNotEmpty() // 비어있지 않고
    .contains("Hevlog") // Hevlog를 포함하고
    .doesNotContain("ABC") // ABC를 포함하지 않고
    .startsWith("Hev") // Hev로 시작하고
    .endsWith("!") // !로 끝나고
    .isEqualsTo("Hevlog 블로그에 오신것을 환영합니다!"); // 와 일치하는지 확인.

 

  • 숫자 테스트 예제
assertThat(10)
	.isPositive() // 양수이고
    .isGreaterThan(6) // 6보다 크고
    .isLessThan(4) // 4보다 작고
    .isEqualsTo(10) // 10과 같은지 확인

 


여기 까지 JUnit5의 개념과 어노테이션, 메서드에 대해 알아봤습니다.

각 어노테이션과 메서드에 대한 사용 예제는 포스팅이 너무 길어지는 관계로 따로 하나씩 공부하고 정리하여 포스팅하려 합니다.

정리되는대로 추후에 여기 아래에 링크 추가하겠습니다 !


참고자료
https://bibi6666667.tistory.com/231
https://velog.io/@ynjch97/JUnit5-JUnit5-%EA%B5%AC%EC%84%B1-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-Assertions-%EC%A0%95%EB%A6%AC
https://insight-bgh.tistory.com/507