본문 바로가기
언어/Java

[JUnit5] 테스트 코드 시작해보기 - 1

by Geunny 2022. 6. 15.
반응형

JUnit5

  • 사용환경 : Java8 이상
  • 구성
    • Platform : 테스트 실행런처 제공 (TestEngine API 제공)
    • Jupiter : TestEngine API 구현체
    • Vintage: JUnit4,3 지원 구현체

 

JUnit 의존성 추가

2.2+ 버전의 스프링 부트 프로젝트를 만든다면 기본적으로 JUnit5 가 추가되어 있다.

그외 hamcrast, mokito등 라이브러리가 아래 dependancy에 포함되어 있다.

dependencies {
    ...
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

JUnit5 기본 포멧

인텔리제이 기준 테스트 하려는 컴포넌트 이름에 커서를 둔후 ALT+Enter 를 누르면 아래 사진처럼 메뉴가 나타난다.

해당 메뉴에서 Create Test 를 선택하면

기본적으로 test/java/{테스트하려는 컴포넌트 패키지} 위치에 테스트 코드를 생성시켜 준다.

JUnit5 기본기능

0. @Test

테스트가 실행되는 메서드 상단에 해당 어노테이션을 작성해 주면 해당 메서드 내에서 테스트 코드 작성이 가능하다.

인텔리제이 안에서 해당 테스트만 독립적으로 실행이 가능하고, 전체 테스트도 함께 실행 가능하다.

메서드 명 한글로 사용해도 되고 메서드가 default 접근자 여도 실행 가능하다.

 

테스트 실행 결과

1. @DisplayName

테스트 코드의 이름을 부여할 수 있다.

public class CategoryServiceTest {

    @Test
    @DisplayName("첫번째 테스트")
    void 테스트(){
        assertThat(1).isEqualTo(1);
    }
    @Test
    @DisplayName("두번째 테스트")
    void 테스트2(){
        assertThat(1).isEqualTo(1);
    }
}

실행결과

2. assert_XXX 메서드

  • JUnit 에서 테스트에 가장 용이하게 사용되는 JUnit API 이다.
  • 기본적으로 JUnit 에서 제공해주는 메서드 들이 있고,이를 확장하여 좀더 가독성 있는 코드로 작성가능한 라이브러리 들이 존재한다.
  • 실제 테스트에서 해당 메서드를 통해 기대되는 값과 실제값을 비교하거나,에러발생 여부 체크, 시간체크 등 다양한 테스트가 가능하다.

 

assert 문법을 사용하는 방식으로는 크게 3가지가 존재한다.

3개 모두 spring-boot-starter-test dependancy에 포함되어 있다.

 

1) Jupiter API 사용

junit Jupiter API 내부에 Assertions 객체에 선언된 메서드들을 주로 사용한다.

가장 많이 사용되는 메서드로는 assertEquals, assertTrue, assertArrayEquals, assertThrows 등이 있다.

Jupiter Assertions 의 다양한 메서드는 Jupiter Assertions API 에서 확인 가능하다.

 

Assertions (JUnit 5.8.2 API)

Assert that all supplied executables do not throw exceptions. If any supplied Executable throws an exception (i.e., a Throwable or any subclass thereof), all remaining executables will still be executed, and all exceptions will be aggregated and reported i

junit.org

 

    @Test
    @DisplayName("첫번째 테스트")
    void 테스트(){
    	int actual = 1;
        assertEquals(actual,1);
    }

assertEquals를 예로 들어 왼쪽 파라미터에 기대값(expected), 오른쪽 파라미터 실제값(actual) 을 넣고 실행해 주면된다.

인텔리제이의 경우 해당 파라미터의 값이 무엇인지 나타내 주지만, 소스의 가독성은 다소 떨어지는 면이 있어 해당 메소드 보다 아래에서 설명할 두 메서드를 더 자주 사용하곤 한다.

 

2) assertJ 라이브러리

오픈소스 기반 라이브러리 이다.

assertJ 에서 제공하는 메서드는 Jupiter API 보다 조금더 가독성이 높은 소스로 작성이 가능하다.

데이터 비교 테스트시 기본적으로 assertThat(실제값) 메서드를 기본으로 뒤에 메서드 체이닝을 사용하여 테스트가 가능하다.

    @Test
    @DisplayName("첫번째 테스트")
    void 테스트(){
    	int actual = 1;
        assertThat(actual).isEqualTo(1);
    }

조금더 다양하고 여러 종류의 테스트가 존재하여 매우 가독성 높은 코드로 작성이 가능하다.

    @Test
    @DisplayName("AssertJ API 사용 테스트")
    void use_assertJ_test(){
        assertThat(1).isGreaterThan(0); // 숫자크기비교
        assertThat(1).isIn(3,2,1); // in 체크
        assertThat(1).isInstanceOf(Integer.class); // 객체 클래스 체크
    }

더 다양한 메서드는 AssertJ Docs 를 통해 확인 가능하다.

 

AssertJ - fluent assertions java library

Thanks to all the contributors of this release: Erhard Pointl, Stefano Cordio, BJ Hargrave, Jeremy Landis, Ashley Scopes, Roland Weisleder , Benedikt Bogason , Andreas Kutschera , Matthew , Chris HeZean , Leo0506 , Zhou Yicheng , Saria , Chunhao Liao , max

assertj.github.io

 

3) Hamcrest 라이브러리

hamcrest 는 JUnit 에서 사용되는 Matcher 라이브러리이다.

이는 AssertJ 와 유사하게 좀더 문맥적으로 자연스럽고 우아한 문장을 만들 수 있도록 도와준다고 한다.

소스 코드를 읽는 것만으로도 어떤 문맥인지 바로 알 수 있다.

    @Test
    @DisplayName("hamcrest API 사용 테스트")
    void use_hamcrest_test(){
        assertThat(1, is(1));
        assertThat(2, not(1));
    }

 

hamcrest 의 다양한 메서드는 hamcrest API DOCS 에서 확인 가능하다.

참고 - 비교관련 메서드들은 hamcrest.core 패키지에 존재하는 클래스들의 메서드를 사용한다.( is(), not() 등..)

댓글