스프링과 JUnit
JUnit이란?
먼저 아래 개념들을 순차적으로 이해하자.
- TDD (Test-driven Development)
: 테스트 주도 개발에서 사용하지만, 코드의 유지 보수 및 운영 환경에서의 에러를 미리 방지 하기 위해서 단위 별로 검증 하는 테스트 프레임워크. 쉽게 말해 테스트가 주가되는 개발이다.
- 단위 테스트
: 작성한 코드가 기대하는 대로 동작을 하는지 검증 하는 절차 - JUnit
: Java기반의 단위 테스트를 위한 프레임워크. Annotation 기반으로 테스트를 지원하며, Assert(예상, 실제)를 통해 검증한다. - Jacoco :
: Java코드의 코드 커버리지를 체크하는 라이브러리. 결과를 Html, Xml, CSV로 확인 가능하다.
JUnit 사용방법
어느 프로젝트를 생성하건 위 그림과 같이 test폴더를 볼 수 있다.
test 폴더 > java폴더 > 테스트 클래스를 생성하여 JUnit 코드를 작성하여 단위테스트를 진행한다.
(1) New Project 생성
프로젝트를 생성할때 Gradle > Java를 추가해준다.
혹은 원하는대로 프로젝트를 생성한뒤 아래와 같이 Dependency를 추가해주면 된다.
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
test {
useJUnitPlatform()
}
(2) 테스트 클래스 만들기
아래 그림과 같이 test > java 하위에 테스트 코드를 작성하기 위한 클래스를 만든다.
(3) 테스트 코드 작성
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class DollarCalculatorTest {
@Test
public void testHello(){
System.out.println("hello");
}
@Test
public void dollarTest(){
Calculator calculator = new Calculator(new krwCalculator());
MarketApi marketApi = new MarketApi();
System.out.println(calculator.sum(10,10));
Assertions.assertEquals(20, calculator.sum(10,10));
Assertions.assertEquals(10, calculator.minus(30,40));
}
@Test
public void koreanWonTest(){
MarketApi marketApi = new MarketApi();
DollarCalculator dollarCalculator = new DollarCalculator(marketApi);
dollarCalculator.init();
System.out.println(dollarCalculator.sum(10,10));
Assertions.assertEquals(20, dollarCalculator.sum(10,10));
Assertions.assertEquals(10, dollarCalculator.minus(30,40));
}
}
위 코드는 환율에 따른 원과 달러의 합과 차이 금액이 옳바른지를 테스트하는 코드이다.
참고로 JUnit을 실행하기 위해 각 메소드에 @Test annotation을 붙여주어야한다.
여기서 눈여겨야할 부분은 다음과 같다.
Assertions.assertEquals(22000, dollarCalculator.sum(10,10));
Assertions.assertEquals(0, dollarCalculator.minus(30,40));
왼쪽의 숫자는 expected, 즉, 정답으로 나오길 예상되는 값이며 오른쪽 함수는 값을 넣어 계산한 sum과 minus메소드다.
sum(10,10)의 결과가 20이 아니면 틀렸다는 로그가 출력되고, minus(30,40)의 결과가 10이 아니라면 마찬가지로 틀렸다는 로그가 출력될 것이다.
결과적으로 minus의 값이 0이 나와야하는데 -11000이 나와서 unit test에 실패했다.
참고로 Unit Test를 할 때 왼쪽의 메소드별로 나눠진 Run Test로 진행해도 되고, 오른쪽에 보이는 전체 실행을 해도 된다.
한 가지 주의할점은, 만약 여러개의 Unit Test에서 실패할 경우, 최초의 1개의 Unit Test의 실패 로그만 보여준다는 점이다.
하나하나 테스트해서 하나라도 실패할 경우 바로 중단해 해당 결과를 보여주기 때문이다.
Unit Test 실패 결과를 모두 보고싶다면 assertAll 메소드를 사용하면 된다.
또한 테스트 방식에 따라 다양한 annotation이 요구되니, 필요할때마다 검색을 통해 찾아보면 된다.
Jacoco 사용방법
Jacoco는 쉽게 요약하자면 테스트가 실패한 내역을 사용자가 보기 쉽게 Html로 제공해준다.
Html 외에 Xml, Csv로도 제공해준다.
(1) Dependency 추가
먼저 build.gradle의 dependency에 Jacoco를 추가해준다.
plugins {
id 'java'
id 'jacoco' // 이걸 추가하면 된다.
}
(2) Test구동
Dependency를 추가하고 Gradle을 다시 build해주면 다음과 같이 'Test'라는 항목이 생긴다.
먼저 이 test를 더블클릭하여 구동한다.
(3) html 열기
test를 돌려서 콘솔창에 JUnit 실패 내역이 뜨면 위의 경로로 들어간다.
index.html을 열면 (인텔리제이의 경우) 해당 파일을 곧 바로 크롬으로 열 수 있는 기능이 있으니, 크롬으로 열어본다.
(4) 실패 로그 확인
전체에서 실패한 부분이 얼마나 되는지, 동시에 실패한 코드의 로그를 전부 확인할 수 있다.
(5) 실패 코드 확인
다시 Gradle로 돌아와 이번엔 JacocoTestReport를 더블클릭하여 구동하자.
(6) html 열기
그런 뒤 위의 경로로 들어가 index.html을 오픈한 다음, 크롬으로 연결하여 확인하자.
(7) 에러 코드 확인
결과적으로 이러한 창을 확인할 수 있다. 전체 코드에서 어떤 클래스, 메소드가 Junit테스트에서 실패했는지 그 내역들을 세세히 확인할 수 있다.