![JUnit 5를 사용한 Java 단위 테스트 - TestCode (3)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyHwIb%2FbtslauugHng%2FXH8CDPcyZMq4bKwo4KtgOK%2Fimg.png)
서론
본 포스팅은 아래의 인강을 듣고, 추가 공부가 필요한 내용들을 포함하여 정리한 포스팅입니다.
Practical Testing: 실용적인 테스트 가이드 - 인프런 | 강의
이 강의를 통해 실무에서 개발하는 방식 그대로, 깔끔하고 명료한 테스트 코드를 작성할 수 있게 됩니다. 테스트 코드가 왜 필요한지, 좋은 테스트 코드란 무엇인지 궁금하신 모든 분을 위한 강
www.inflearn.com
JUnit
JUnit에서 제공하는 assertEquals()와 같은 메서드는 AssertJ가 제공하는 메서드에 비해 가독성이 떨어지기 때문에, Java 애플리케이션에서 단위 테스트를 위해 JUnit5와 AssertJ를 조합하여 많이 사용한다.
- JUnit5 : 자바 단위 테스트를 돕기 위한 테스팅 프레임워크
- AssertJ : 테스트 코드 작성을 돕는 다양한 API를 지원하는 라이브러리로, 메서드 체이닝 지원
아래는 JUnit과 AssertJ의 공식 문서
JUnit 5 User Guide
Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo
junit.org
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
작성 예시
아래의 Food 인터페이스를 상속받는 Pizza클래스를 만들었다.
public class Pizza implements Food{
@Override
public String getName() {
return "피자";
}
@Override
public int getPrice() {
return 10000;
}
}
class PizzaTest {
@Test
void getName(){
final Pizza pizza = new Pizza();
assertThat(pizza.getName()).isEqualTo("피자");
}
@Test
void getAge(){
final Pizza pizza = new Pizza();
assertThat(pizza.getAge()).isEqualTo(10000);
}
}
테스트에 성공 했다면 아래처럼 파란 체크표시가 나타난다.
![](https://blog.kakaocdn.net/dn/c1vSWQ/btslcCSlti9/kXphJpXCNkM7gB6PzjisAk/img.png)
Given / When / Then 패턴
단위 테스트는 given-when-then 패턴으로 작성한다. 1개의 단위 테스트를 3가지 단계로 나누어 처리하는 패턴이다.
- given(준비) : 데이터를 입력한 뒤
- when(실행) : 실행을 하면
- then(검증) : 어떠한 결과가 나와야 한다.
위의 패턴을 바탕으로 다시 위의 테스트 코드를 수정해보자.
class PizzaTest {
@Test
void getName(){
// given
final Pizza pizza = new Pizza();
final String chkName = "피자"
// when
final String realName = pizza.getName();
// then
assertThat(pizza.getName()).isEqualTo(realName);
}
@Test
void getPrice(){
// given
final Pizza pizza = new Pizza();
final int chkPrice = 10000
// when
final int realPrice = pizza.getPrice();
// then
assertThat(pizza.getPrice()).isEqualTo(realPrice);
}
}
테스트 케이스 세분화
요구사항이 실제 구현할 때의 요구사항과 정확히 일치하는지, 암묵적이거나 드러나지 않은 요구사항들이 있는지 항상 고민해야 한다. 위의 코드를 예시로 Food를 주문할 때를 생각해 보자.
- 해피 케이스 : 요구사항대로 피자를 2개 선택
- 예외 케이스 : 만약 피자를 0개, 혹은 -1개 입력했다면?
상식적으로 음식점에서, 음식을 0개나 -1개 주문하는 상황은 말이 안된다. 당연한 상식이기에 요구사항에 드러나지 않은 상황이라고 할 수 있다. 이런 상황들을 모두 고려한 테스트를 위해서 경계값 테스트가 중요하다. 여기서 경계값이란 범위, 구간, 날짜 등을 말한다.
테스트하기 어려운 영역
- 변수를 선언할 때마다 다른 값에 의존하는 코드(input) - now(), random(), 전역변수/함수, 사용자 입력 등
- 테스트 영역 외부에 영향을 주는 코드(output) - 표준 출력, 메세지 발송, 데이터베이스에 기록 등
참조
항상 너무 좋은 글을 써주시는 망나니 개발자님 (given - when - then 패턴)
[Java] JUnit을 활용한 Java 단위 테스트 코드 작성법 (2/3)
이번에는 순수 Java 기반의 애플리케이션에 대해 테스트 코드를 작성해보고자 합니다. 1. Java 단위 테스트(Unit Test) 작성 준비 [ 필요한 라이브러리 ] 요즘 Java 단위테스트 작성에는 크게 2가지 라이
mangkyu.tistory.com
관련 포스팅
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!