JUnit 5를 사용한 Java 단위 테스트 - TestCode (3)

Tech/Test 2023. 6. 28. 06:06
728x90
728x90

서론

본 포스팅은 아래의 인강을 듣고, 추가 공부가 필요한 내용들을 포함하여 정리한 포스팅입니다.

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);
    }

}

 
테스트에 성공 했다면 아래처럼 파란 체크표시가 나타난다.

 

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


 
 
 

관련 포스팅

테스트 코드를 작성하는 이유 - TestCode (1)
단위 테스트 - TestCode (2)

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

방명록