자바와 JUnit을 활용한 실용주의 단위 테스트 - YES24
『실용주의 프로그래머』의 앤디 헌트와 데이브 토마스가 알려주는실용주의 단위 테스트!클린 코드의 핵심인 단위 테스트, 어디서 어떻게 시작해야 할까? 책에서는 단위 테스트의 개념과 작성
www.yes24.com
책을 읽고, 코드를 리뷰하고 정리하기 위한 포스팅입니다.
왜 하는가?
근본적인 질문을 한 마디로 요약을 해보자면, 테스트 코드를 잘 만들 수 있어야 애플리케이션의 안정성을 확보할 수 있다. 예를 들어, 스프링 프로젝트에서 간단한 기능 하나를 추가했을 때 이 기능이 잘 동작하는지 일일이 톰캣 서버를 내렸다가 다시 켜고를 반복할 수는 없을 것이다. 그것도 규모가 조금 작은 프로젝트인 게시판, To-do list 만들기와 같은 환경에서나 통하는 방법일 것이다. 규모가 조금이라도 커지면 이 방법은 효율적이지 못하고, 안정성을 보장해주지도 않는다. 그래서 테스트 코드를 공부하는 것이다.
실제 적용 후기
팀을 꾸려 실제 배포/운영까지 목표로 하는 프로젝트를 진행하고 있다. TDD (Test-Driven-Development)를 지향했으나, TDD 지식이 전무하고, 개발에 급급했다. 시간은 한정적이고 개발은 진행되어야 했기에 코드 리팩토링 시점에 테스트 코드를 작성하기로 했다. 그래서 적용하려고 여러 포스팅을 뒤적거리다가 다양한 에러에 테러를 당해서 근본있게 기초부터 공부를 하기로했다. 그래서 책을 빌렸다.
JUnit 4 vs JUnit 5
* JUnit : 자바 개발자가 가장 많이 사용하는 테스팅 프레임워크. 추가로, Spock, TestNg등이 있다.
* 차이점 : JUnit 4는 하나의 Jar 파일로 의존성이 추가되어 JUnit이 참조하는 다른 라이브러리가 있는 형태이며, JUnit 5는 그 자체로 여러 모듈화가 되어있다.
이 곳에서는 JUnit 5를 사용했다. 현업에서는 4도 많이 쓰인다고 하는데, 원리 및 작성 요령 파악이 우선이니 버전에 연연하지 말고 Keep Going!
간단한 예제
* 프로젝트 구조는 위 사진과 같으며, 각 코드의 내용은 다음과 같다.
* Scoreable 인터페이스
package tdd_01;
/**
* @FuntionalInterface
* 구현해야 할 메서드가 단 하나이면, FunctionalInterface이다.
*/
@FunctionalInterface
public interface Scoreable {
int getScore();
}
* ScoreCollection.class
package tdd_01;
import java.util.ArrayList;
import java.util.List;
public class ScoreCollection {
private List<Scoreable> scores = new ArrayList<>();
public void add(Scoreable scoreable) {
scores.add(scoreable);
}
public int arithmeticMean() {
int total = scores.stream().mapToInt(Scoreable::getScore).sum();
return total / scores.size();
}
}
* ScoreCollectionTest
package tdd_01;
import org.junit.jupiter.api.Test;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
import org.junit.*;
class ScoreCollectionTest {
@Test
public void 덧셈_테스트를_해보자() {
// 준비
ScoreCollection scoreCollection = new ScoreCollection();
scoreCollection.add(() -> 5);
scoreCollection.add(() -> 7);
// 실행
int result = scoreCollection.arithmeticMean();
// 단언
assertThat(result, equalTo(6));
}
}
* 보통 테스트 코드하면 Given / When / Then으로 구성을 많이 한다던데, 이 책에서는 Arrange / Act / Assert로 구성해놨다. 이런 형식이 있다는 것만 알아두면 좋을 듯 하다. 개인적으로는 GWT 방식이 조금 익숙하긴 하다.
* hamcrest는 JUnit 5에서는 외부 라이브러리로 추가를 해줘야한다. 따라서 hamcrest를 다운로드 받아서 IDE(인텔리제이, 이클립스 등)에서 외부 라이브러리에서 추가를 해줘야 한다.
* 추가하는 이유는 //단언 부에 있는 assertThat 메서드를 사용하기 위해서다.
* 간단한 코드이니, 이해하는데 어려움은 없을 듯 하다.
* 결과는 다음과 같다.