테스트 코드란 작성한 코드가 의도대로 잘 동작하고 예상치 못한 문제가 없는지 확인할 목적으로 작성하는 코드이다.
테스트 코드에는 다양한 패턴이 있다. 그중 나는 given-when-then
패턴을 사용해 볼 것이다.
given-when-then 패턴은 테스트 코드를 세 단계로 구분해 작성하는 방식을 말한다.
- given : 테스트 실행을 준비하는 단계
- when : 테스트를 진행하는 단계
- then : 테스트 결과를 검증하는 단계
스프링 부트는 애플리케이션을 테스트하기 위한 도구와 어노테이션을 제공한다. spring-boot-starter-test
스타터에는 이런 테스트를 위한 도구들이 모여 있다. 이중에서 우리는 JUnit을 알아볼 것이다.
JUnit은 자바 언어를 위한 단위 테스트 프레임워크다. 단위 테스트란 작성한 코드가 의도대로 작동하는지 작은 단위로 검증하는 것이다. 이때 단위는 보통 메소드가 사용된다. JUnit을 사용하면 단위 테스트를 작성하고 테스트하는 데 도움을 준다.
- 테스트 방식을 구분할 수 있는 어노테이션을 제공함
- @Test 어노테이션으로 메소드를 호출할 때마다 새 인스턴스를 생성함, 독립 테스트가 가능함
- 예상 결과를 검증하는 어설션 메소드를 제공함
- 사용 방법이 단순함, 테스트 코드 작성 시간이 적음
- 자동 실행, 자체 결과를 확인하고 즉각적인 피드백을 제공함
이제 본격적으로 JUnit으로 단위 테스트 코드를 만들어 보자!
해당 경로에 클래스를 생성해 준다.
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class JUnitTest {
@DisplayName("1 + 2는 3이다") // 테스트 이름
@Test // 테스트 메소드
public void junitTest(){
int a = 1;
int b = 2;
int sum = 3;
Assertions.assertEquals(sum, a + b); // 값이 같은지 확인
}
}
코드 작성 후
이 버튼을 클릭해 단위 테스트를 수행한다. 테스트 결과가 true일 경우 콘솔창에 해당 결과가 나타난다.
반대로 테스트 결과가 false일 때는 어떻게 될까?
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class JUnitTest {
@DisplayName("1 + 3는 4이다") // 테스트 이름
@Test // 테스트 메소드
public void junitTest(){
int a = 1;
int b = 3;
int sum = 3;
Assertions.assertEquals(sum, a + b); // 실패하는 케이스
}
}
단위 테스트가 실패했다. 이렇게 JUnit은 테스트 케이스가 하나라도 실패하면 전체 테스트를 실패한 것으로 보여 준다.
import org.junit.jupiter.api.*;
public class JUnitCycleTest {
@BeforeAll // 전체 테스트를 시작하기 전에 1회 실행하므로 메소드는 static으로 선언
static void beforeAll(){
System.out.println("@BeforeAll");
}
@BeforeEach // 테스트 케이스를 시작하기 전마다 실행
public void beforeEach(){
System.out.println("@BeforeEach");
}
@Test
public void test1(){
System.out.println("test1");
}
@Test
public void test2(){
System.out.println("test2");
}
@Test
public void test3(){
System.out.println("test3");
}
@AfterAll // 전체 테스트를 마치고 종료하기 전에 1회 실행하므로 메소드는 static으로 선언
static void afterAll(){
System.out.println("@AfterAll");
}
@AfterEach // 테스트 케이스를 종료하기 전마다 실행
static void afterEach(){
System.out.println("@AfterEach");
}
}
- @BeforeAll : 전체 테스트를 시작하기 전에 처음으로 한 번만 실행함
- @BeforeEach : 테스트 케이스를 시작하기 전에 매번 실행함
- @AfterAll : 전체 테스트를 마치고 종료하기 전에 한 번만 실행함
- @AfterEach : 각 테스트 케이스를 종료하기 전 매번 실행함
AssertJ는 JUnit과 함께 사용해 검증문의 가독성을 확 높여 주는 라이브러리이다. AssertJ는 다양한 메소드를 제공한다. 자주 사용되는 메소드는 아래와 같다.
메소드 이름 | 설명 |
---|---|
isEqualTo(A) | A 값과 같은지 검증 |
isNotEqualTo(A) | A 값과 다른지 검증 |
contains(A) | A 값을 포함하는지 검증 |
doesNotContain(A) | A 값을 포함하지 않는지 검증 |
startsWith(A) | 접두사가 A인지 검증 |
endsWith(A) | 접미사가 A인지 검증 |
isEmpty() | 비어 있는 값인지 검증 |
isNotEmpty() | 비어 있지 않은 값인지 검증 |
isPositive() | 양수인지 검증 |
isNegative() | 음수인지 검증 |
isGreaterThan(1) | 1보다 큰 값인지 검증 |
isLessThan(1) | 1보다 작은 값인지 검증 |
다음 포스팅에서 계속됩니다!
JUnit으로 단위 테스트 코드 만들기 - 실전편 👀