개발
JUnit5을 이용한 단위테스트
ka0oll
2020. 3. 21. 15:41
단위(Unit) 테스트
JUnit이란?
- 자바 단위테스트 프레임워크
xUnit이란 ?
- 자바만 단위 테스트 프레임워크 있는게 아니라, 다른언어도 단위테스트를 위한 프레임워크가 존재 이를 통칭해서 Xunit이라한다.
- CUnit(c), PHPUnit(PHP) 등등
그럼 단위 테스트란??
단위를 바라보는 두가지 시각
- 객체지향에서는 하나의 클래스를 단위로 본다.(개인적 선호)
- 기능 자체를 단위로 본다. 예를들어 컨트롤러 서버스 까지 하나의 단위로 묶는다.
해당 단위가 정상적으로 동작하는지 검증이다.
JUnit5
링크 : https://junit.org/junit5/docs/current/user-guide
3개의 컴포넌트(모듈로 구성)
Junit Platform : 테스트의 런처, TestEngine의 인터페이스 API
Jupiter : TestEngine의 구현체, junit5 제공
Vintage: TestEngine의 구현체, junit3,4 제공
실제 intelliJ에서 실행시 Junit Platform으로 실행
적용 방법
스프링부트 2.2+ 버전부터는 Junit5 의존성 추가
스프링 부트 프로젝트 사용하지 않는다면?
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
테스트 반복하기
https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests
// 단일 인자
@ParameterizedTest
@ValueSource(strings = { "racecar", "radar", "able was I ere I saw elba" })
void palindromes(String candidate) {
assertTrue(StringUtils.isPalindrome(candidate));
}
// 멀티 인자
@ParameterizedTest
@MethodSource("stringIntAndListProvider")
void testWithMultiArgMethodSource(String str, int num, List<String> list) {
assertEquals(5, str.length());
assertTrue(num >=1 && num <=2);
assertEquals(2, list.size());
}
static Stream<Arguments> stringIntAndListProvider() {
return Stream.of(
arguments("apple", 1, Arrays.asList("a", "b")),
arguments("lemon", 2, Arrays.asList("x", "y"))
);
}
다른 Junit5 vs Junit4 차이
테스트 메소드나 클래스의 접근 제어자가 public 아니어도 된다. 단 private는 안됨
@DisplayName으로 테스트명 지정 가능
@DisplayName("A special test case") class DisplayNameDemo { @Test @DisplayName("Custom test name containing spaces") void testWithDisplayNameContainingSpaces() { } @Test @DisplayName("╯°□°)╯") void testWithDisplayNameContainingSpecialCharacters() { } @Test @DisplayName("😱") void testWithDisplayNameContainingEmoji() { } }
JAVA 8이상 지원으로 람다 사용가능
// junit 4 assertEquals("meesage parameter", "expected value", "actual value"); // junit 5 assertEquals("expected value", "actual value", "meesage parameter");
Junit4에 비해 쉬어준 ParameterizedTest
확장모듈의 단일화
JUnit 4의 확장 모델은 @RunWith(Runner), TestRule, MethodRule.
JUnit 5의 확장 모델은 단 하나, Extension@ExtendWith(RandomParametersExtension.class) @Test void test(@Random int i) { // ... } @ExtendWith(RandomParametersExtension.class) class MyTests { // ... } @ExtendWith({ DatabaseExtension.class, WebServerExtension.class }) class MyFirstTests { // ... } //@ExtendWith 여러번 사용가능 @ExtendWith(DatabaseExtension.class) @ExtendWith(WebServerExtension.class) class MySecondTests { // ... }