Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

개발자일기

JUnit5을 이용한 단위테스트 본문

개발

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 {
        // ...
    }
    

'개발' 카테고리의 다른 글

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