Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- rest api
- Exception
- redis
- MSA
- bytecode
- SOA
- JWT
- JSON
- junit5
- mockito
- spring
- Generic
- bounded context
- reflection
- 서명
- jvm
- PSA
- di
- IOC
- OOP
- ddd
- Java
- AOP
- Transaction
- Rest
- *
- Spring Data Redis
Archives
- Today
- Total
개발자일기
JUnit5을 이용한 단위테스트 본문
단위(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 { // ... }
'개발' 카테고리의 다른 글
Spring의 핵심 및 기술 (0) | 2020.03.21 |
---|---|
도커를 이용한 테스트 (0) | 2020.03.21 |
MSA 마이크로아키텍처 알아보자(1) (1) | 2020.03.21 |
코드를 조작하는 방법 (0) | 2020.03.21 |
JVM (0) | 2020.03.21 |
Comments