Java - JUnit 5 활용 단위 테스트

손지민·2023년 11월 7일

Java 기초

목록 보기
10/13

개요

우아한 테크코스 3주차 로또 미션을 진행하며 'JUnit 5AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다.' 라는 요구 사항을 충족하기 위해 JUnit 에 대해 공부하게 되었다.

JUnit 이 무엇인지, 사용법에 대해 알아보고자 한다.

1. JUnit 5 란?

JUnit 5는 Java 프로그래밍 언어를 위한 단위 테스트 프레임워크 중 하나입니다. 단위 테스트 프레임워크는 소프트웨어의 작은 부분, 즉 모듈, 메소드, 클래스 등의 개별 단위를 테스트하기 위한 도구를 제공합니다.

JUnit 5는 JUnit 프레임워크의 최신 버전으로, 기존의 JUnit 4와는 다른 개선된 기능과 API를 제공합니다. Java 8 이상을 지원하며, 람다 표현식과 다양한 Java 8 기능을 테스트 코드 작성에 유용하게 활용할 수 있습니다.

JUnit 5의 주요 특징은 다음과 같습니다:

  1. 모듈화: JUnit 5는 세 개의 모듈로 나누어집니다.
    • JUnit Platform: 테스트를 실행하기 위한 기반 플랫폼
    • JUnit Jupiter: 새로운 테스트 API 및 기능을 제공하는 모듈
    • JUnit Vintage: JUnit 3 및 4와의 호환성을 제공하는 모듈
  2. 새로운 어노테이션: @Test, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll 등의 어노테이션을 통해 테스트 메소드의 실행 순서를 제어할 수 있습니다.
  3. 향상된 Assertion API: 다양한 Assertion 메서드를 통해 예상되는 결과를 검증할 수 있습니다.
  4. 확장 모델: 테스트에 대한 다양한 확장을 지원하는 테스트 확장 모델을 제공합니다.

JUnit 5를 사용하면 테스트 코드를 작성하고 실행하여 소프트웨어의 각 부분이 예상대로 동작하는지 확인할 수 있습니다. 또한, JUnit 5는 테스트 코드 작성을 더 쉽고 유연하게 할 수 있도록 도와줍니다.


2. 사용법

2.1. 라이브러리

JUnit 만으로도 단위 테스트를 충분히 작성할 수 있다. 하지만 JUnit에서 제공하는 assertEquals()와 같은 메소드는 AssertJ가 주는 메소드에 비해 가독성이 떨어진다. 그렇기 때문에 순수 Java 애플리케이션에서 단위 테스트를 위해 JUnit5와 AssertJ 조합이 많이 사용된다.
출처: https://mangkyu.tistory.com/144 [MangKyu's Diary:티스토리]

  1. JUnit5: 자바 단위 테스트를 위한 테스팅 프레임워크
  2. AssertJ: 자바 테스트를 돕기 위해 다양한 문법을 지원하는 라이브러리
    출처: MangKyu's Diary:티스토리

2.2. 단위 테스트 패턴

  • JUnit 5는 AAA (Arrange-Act-Assert) 패턴을 더 많이 사용하는 편입니다. 이는 주로 @BeforeEach, @AfterEach, @BeforeAll, @AfterAll과 같은 라이프사이클 콜백과 함께 사용되어 테스트 메소드의 초기화, 정리 작업을 보다 명시적으로 수행하고, 각 단계의 역할을 구분하여 테스트 코드를 더 명확하게 만들 수 있습니다.

  • JUnit 5AssertJ는 각각 테스트 프레임워크Assertion 라이브러리로, 다양한 테스트 패턴과 기능을 제공합니다. 이를 함께 사용하여 효과적인 테스트를 작성할 수 있습니다. 아래는 JUnit 5와 AssertJ를 활용하여 추천하는 몇 가지 테스트 패턴입니다:

1. AAA (Arrange-Act-Assert) 패턴 with JUnit 5

JUnit 5의 라이프사이클 콜백을 활용하여 테스트 초기화, 실행, 검증을 분리하는 패턴.

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class MyTest {

    @Test
    void testAddition() {
        // Arrange
        MyMath math = new MyMath();

        // Act
        int result = math.add(3, 5);

        // Assert
        assertEquals(8, result);
    }
}

2. Fluent Assertions with AssertJ

AssertJ는 강력한 Assertion 라이브러리로, 읽기 쉬운 테스트 어설션을 제공합니다. 메소드 체이닝을 활용하여 명확하고 자연스러운 테스트 단언을 구성할 수 있습니다.

import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;

public class MyTest {

    @Test
    void testAddition() {
        MyMath math = new MyMath();
        int result = math.add(3, 5);

        assertThat(result).isEqualTo(8);
    }
}

3. Parameterized Tests with JUnit 5 and AssertJ

JUnit 5의 @ParameterizedTest와 AssertJ를 함께 사용하여 여러 입력값에 대해 테스트하는 패턴.

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.assertj.core.api.Assertions.assertThat;

public class MyTest {

    @ParameterizedTest
    @ValueSource(ints = {2, 4, 6})
    void testEvenNumbers(int number) {
        assertThat(number % 2).isEqualTo(0);
    }
}

이러한 패턴을 통해 JUnit 5와 AssertJ를 최대한 활용하면, 가독성이 높고 유지보수가 쉬운 테스트 코드를 작성할 수 있습니다. 이는 테스트의 목적과 결과를 명확하게 전달하고, 테스트가 예상대로 작동하는지 확인하는 데 도움이 됩니다.


참고

profile
Developer

0개의 댓글