채채
4. 스프링 부트 3와 테스트 본문
1. 테스트 코드 개념 익히기
테스트 코드는 test 디렉터리에서 작업한다.
테스트 코드 패턴 중 given-when-then 패턴이란?
given: 테스트 실행을 준비하는 단계 / when: 테스트를 진행하는 단계 / then: 테스트 결과를 검증하는 단계
// 새로운 메뉴를 저장하는 코드 테스트
@DisplayName("새로운 메뉴를 저장한다.")
@Test
public void saveMenuTest() {
// given : 메뉴를 저장하기 위한 준비 과정
final String name = "아메리카노";
final int price = 2000;
final Menu americano = new Menu(name, price);
// when : 실제로 메뉴를 저장
final long savedId = menuService.save(americano);
// then : 메뉴가 잘 추가되었는지 검증
final Menu savedMenu = menuService.findById(savedId).get();
assertThat(savedMenu.getName()).isEqualTo(name);
assertThat(savedMenu.getPrice()).isEqualTo(price);
}
2. 스프링 부트3와 테스트
JUnit: 자바 프로그래밍 언어용 단위 테스트 프레임워크. 단위는 보통 메서드
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); // 값이 같은지 확인
}
// 테스트 실패 코드
@DisplayName("1 + 3는 4이다.")
@Test
public void junitFailedTest() {
int a = 1;
int b = 3;
int sum = 3;
Assertions.assertEquals(sum, a + b);
}
}
실패용 테스트 케이스를 실행하면 테스트가 실패했다는 표시와 함께 기댓값과 실제로 받은 값을 비교해서 알려준다. 이렇게 JUnit은 테스트 케이스가 하나라도 실패하면 전체 테스트를 실패한 것으로 보여준다.
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 // 테스트 케이스를 종료하기 전마다 실행
public void afterEach() {
System.out.println("@AfterEach");
}
}
@BeforeAll
전체 테스트를 시작하기 전에 처음으로 한 번만 실행. 데이터베이스를 연결해야 하거나 테스트 환경을 초기화할 때 사용된다.
*이 애너테이션은 전체 테스트 실행 주기에서 한 번 만 호출되어야 하기 때문에 메서드를 static으로 선언해야 함
@BeforeEach
테스트 케이스를 시작하기 전에 매번 실행. 테스트 메서드에서 사용하는 객체를 초기화하거나 테스트에 필요한 값을 미리 넣을 때 사용.
*각 인스턴스에 대해 메서드를 호출해야 하므로 메서드는 static이 아니어야 함
@AfterAll
전체 테스트를 마치고 종료하기 전에 한 번만 실행. 데이터베이스 연결을 종료할 때나 공통적으로 사용하는 자원을 해제할 때 사용.
*전체 테스트 실행 주기에서 한 번만 호출되어야 하므로 메서드를 static으로 선언해야 함
@AfterEach
각 테스트 케이스를 종료하기 전 매번 실행. 테스트 이후에 특정 데이터를 삭제해 야 하는 경우 사용합니다.
*메서드는 static이 아니어야 함.
AssertJ로 검증문 가독성 높이기
AssertJ는 JUnit과 함께 사용해 검증문의 가독성을 높여주는 라이브러리다.
// 기댓값과 비교값이 잘 구분되지 않는 Assertion 예
Assertions.assertEquals(sum, a + b);
// 가독성이 좋은 AssertJ 예
assertThat(a + b).isEqualTo(sum);
이 경우 a와 b를 더한 값이 sum과 같아야 한다는 의미로 명확하게 읽히기 때문에 코드를 읽는 사람이 헷갈리지 않는다.
'spring boot' 카테고리의 다른 글
QueryDSL이란? (0) | 2023.12.07 |
---|---|
8. 스프링 시큐리티로 로그인/로그아웃, 회원 가입 구현하기 (0) | 2023.07.19 |
2. 스프링 부트 3 시작하기 (0) | 2023.07.12 |
SpringBoot 패키지 개념 (0) | 2022.11.29 |
5. 스프링 시큐리티와 OAuth 2.0으로 로그인 기능 구현하기 (0) | 2022.11.13 |