
우아한 테크코스 3주차 로또 미션을 진행하며 'JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다.' 라는 요구 사항을 충족하기 위해 JUnit 에 대해 공부하게 되었다.
JUnit 이 무엇인지, 사용법에 대해 알아보고자 한다.
JUnit 5는 Java 프로그래밍 언어를 위한 단위 테스트 프레임워크 중 하나입니다. 단위 테스트 프레임워크는 소프트웨어의 작은 부분, 즉 모듈, 메소드, 클래스 등의 개별 단위를 테스트하기 위한 도구를 제공합니다.
JUnit 5는 JUnit 프레임워크의 최신 버전으로, 기존의 JUnit 4와는 다른 개선된 기능과 API를 제공합니다. Java 8 이상을 지원하며, 람다 표현식과 다양한 Java 8 기능을 테스트 코드 작성에 유용하게 활용할 수 있습니다.
JUnit 5의 주요 특징은 다음과 같습니다:
JUnit 5를 사용하면 테스트 코드를 작성하고 실행하여 소프트웨어의 각 부분이 예상대로 동작하는지 확인할 수 있습니다. 또한, JUnit 5는 테스트 코드 작성을 더 쉽고 유연하게 할 수 있도록 도와줍니다.
JUnit 만으로도 단위 테스트를 충분히 작성할 수 있다. 하지만 JUnit에서 제공하는 assertEquals()와 같은 메소드는 AssertJ가 주는 메소드에 비해 가독성이 떨어진다. 그렇기 때문에 순수 Java 애플리케이션에서 단위 테스트를 위해 JUnit5와 AssertJ 조합이 많이 사용된다.
출처: https://mangkyu.tistory.com/144 [MangKyu's Diary:티스토리]
JUnit 5는 AAA (Arrange-Act-Assert) 패턴을 더 많이 사용하는 편입니다. 이는 주로 @BeforeEach, @AfterEach, @BeforeAll, @AfterAll과 같은 라이프사이클 콜백과 함께 사용되어 테스트 메소드의 초기화, 정리 작업을 보다 명시적으로 수행하고, 각 단계의 역할을 구분하여 테스트 코드를 더 명확하게 만들 수 있습니다.
JUnit 5와 AssertJ는 각각 테스트 프레임워크와 Assertion 라이브러리로, 다양한 테스트 패턴과 기능을 제공합니다. 이를 함께 사용하여 효과적인 테스트를 작성할 수 있습니다. 아래는 JUnit 5와 AssertJ를 활용하여 추천하는 몇 가지 테스트 패턴입니다:
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);
}
}
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);
}
}
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를 최대한 활용하면, 가독성이 높고 유지보수가 쉬운 테스트 코드를 작성할 수 있습니다. 이는 테스트의 목적과 결과를 명확하게 전달하고, 테스트가 예상대로 작동하는지 확인하는 데 도움이 됩니다.