make it simple
article thumbnail
Published 2023. 2. 27. 03:04
[JAVA] JUnit 5 사용해보자! Java

JUnit 5 이란?

  • JUnit은 자바에서 대표적인 unit-testing 프레임 워크이다. JUnit 5 버전은 또한 Java 8 에 등장한 새로운 기능들도 지원해주면서 Java 8 버전과 호환성이 좋다.
    • unit-test(단위 테스트) 사용이유: 전체적으로 말했을 때 유닛테스트는 버그를 줄이고 코드 퀄리티를 높이기위해 만든다. 또한 어플리케이션이 무거울 경우에 테스트하기 위해 매번 서버를 껐다 키면 시간적인 비용과 소모되는 자원들이 많다. 하지만 단위 테스트를 함으로써 단위만 실행시키면되서 더욱 빠르게 정상적으로 작동하는지 확인할 수 있다.
  • 스프링 부트 2.2.1 버전의 스프링 부트 이상 프로젝트는 기본적으로 spring-boot-starter-test 가 제공하는 JUnit 버전은 5 버전으로 추가됨 (gradle → testCompileClasspath 경로에서 확인할 수 있다.)
  • Junit 5 부터는 클래스나 메소드가 public일 필요가없다. 전 버전에서는 public 클래스에서 public 메소드였엇는데 Junit5에서는 자바 리플렉션을 사용해서 private 또는 default로 접근이가능해서 public일 필요가없다.

Junit 5 구성요소

  • JUnit Platform: 테스팅 프레임워크를 구동하기 위한 launcher와 테스트 엔진을 위한 API를 제공한다.
  • JUnit Jupiter: JUnit 5를 위한 테스트 API와 실행 엔진을 제공한다.
  • JUnit Vintage: JUnit 3과 4로 작성된 테스트를 JUnit 5 Platform에서 실행하기 위한 모듈을 제공한다.

JUnit 5 + Java 8 + 활용하기

  • 모든 테스트가 실행되기전에 딱 한번만 호출만 된다. 해당 어노테이션 method는 static void로 사용해야함.
@BeforeAll
static void beforeAll(){
    System.out.println("before all");
}

@AfterAll
static void afterAll(){
    System.out.println("after all");
}
  • 모든 테스트를 실행할때 각각의 테스트를 실행하기 전과후로 호출된다.
@BeforeEach
void beforeEach(){
    System.out.println("before each");
}

@AfterEach
void afterEach(){
    System.out.println("after each");
}

 

Assertion Methods

assertEquals(): 실제 테스트에서 결과가 예측한 값이랑 맞는지 검증하는 함수

assertEquals(StudyStatus.DRAFT, study.getStatus(), () -> "스터디를 처음 만들면 DRAFT 상태다.");
  • 1번째 parameter: 예측값
  • 2번째 parameter: 실제 데이터 값
  • 3번째 parameter: 실패하면 console에 출력될 메세지 (위와 같은 메시지는 스트링 값을 연산해줘야하므로 비용이 발생된다. 만약 성능적으로 비용이 걱정된다면 람다식 () → “스터디를 처음 만들면" + StudyStastus.DRAFT + “ 상태다.” 으로 표현하면 비용이 줄어든다.

 

assertNotNull(): null 값 여부 판단하는 함수, null 이면 테스트 실패

assertNotNull_(study);

 

assertAll(): 한 테스트의 모든 테스트케이스들의 실패 여부를 알고싶은경우에assertAll()을 사용해서 함수안에 람다식으로 테스트 케이스들을 parameter로 묶어서 사용하면 실패한 테스트 케이스들을 전부 확인할 수 있다.

assertAll( 
    () -> assertNotNull(study), 
    () -> assertEquals(StudyStatus.ENDED, study.getStatus(), 
    () -> "스터디를 처음 만들면 DRAFT 상태다."), 
    () -> assertTrue(study.getLimit() > 0) 
);

 

assertThrows(): 개발자가 의도한 예외를 테스트 할 수 있다.

assertThrows_(IllegalArgumentException.class, () -> new Study(-10));

 

assertTimeout(): 코드 완료 시간 테스트

assertTimeout(Duration.ofMillis(100), () -> { new Study(10); });

결론

  • 테스트 코드란 좋은 프로덕트를 위해 꼭 필요하다. 테스트 코드를 짜면서 더 좋은 코드, 안전성 등을 향상시킬 수 있도록 도와준다. 부끄럽지만, 매번 바쁘다는 핑계로 테스트코드를 작성안하고 스킵한적이 많다. 이제는 코드를 작성할 때 테스트 코드도 작성하는걸 습관화하기위해 Java의 대표적인 유닛 테스팅 프레임워크인 Junit에 대해 알아봤다. 다음번엔 코틀린과 JUnit을 활용한 예제도 작성해봐야겠다.

reference

  • 백기선의 더 자바, 어플리케이션을 테스트하는 방법
profile

make it simple

@keep it simple

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!