<애플리케이션의 일반적인 테스트 분류>
테스트 케이스(Test Case)란?
테스트를 위한 입력 데이터, 실행 조건, 기대 결과를 표현하기 위한 명세를 의미하며, 한마디로 메서드 등 하나의 단위를 테스트하기 위해 작성하는 테스트 코드
Assertion이란?
Assertion은 ‘단언’, ‘단정’ 등으로 번역되지만, 테스트시 Assertion은 테스트 결과를 검증할 때 주로 사용되며 ‘예상하는 결과 값이 참(true)이길 바라는 것’이라고 할 수 있음
if (arr.length == 0) return arr;
int left = 0;
int right = arr.length - 1;
return sort(arr, left, right);
}
//퀵 정렬 메서드
private int[] sort(int[] arr, int left, int right) {
//partition 메서드를 활용하여 정렬
int part = partition(arr, left, right);
if (left < part - 1) arr = sort(arr, left, part - 1);
if (right > part) arr = sort(arr, part, right);
return arr;
}
private int partition(int[] arr, int left, int right) {
// 배열의 중앙을 기준으로
int pivot = arr[(left + right) / 2];
//좌측이 우측보다 작을 경우, 즉 아직 모든 배열을 순회하지 않은 경우 반복
while (left <= right) {
//좌측의 수가 기준점보다 작다면
while (arr[left] < pivot) left++;
//우측의 수가 기준점보다 크다면
while (arr[right] > pivot) right--;
if (left <= right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
return left;
}
개발자가 통합 테스트까지 작성하면 정말 바람직하겠지만, 일정 상의 이유 등으로 통합 테스트는 대개 QA부서나 외부로 대체되는 경우가 많음
API 계층 테스트의 대상은 대부분 클라이언트의 요청을 받아들이는 핸들러인 Controller임.
→ Spring에서는 Controller를 테스트하기 위한 편리한 방법들을 제공
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
@SpringBootTest
@AutoConfigureMockMvc
public class ControllerTestDefaultStructure {
@Autowired
private MockMvc mockMvc;
@Test
public void postMemberTest() {
// given
// when
// then
}
}
데이터 액세스 계층 테스트는 Spring Data JPA, Spring Data JDBC, Spring JDBC 등 사용하는 기술에 따라 테스트 방법을 지원
→ DB의 상태를 테스트 케이스 실행 이전으로 되돌려서 깨끗하게 만든다.
@DataJpaTest // 혹은 @DataJdbcTest
public class DataAccessLayerTest {
@Test
public void testA() {
// (1-1) 데이터가 DB에 잘 저장되는지를 테스트하기 위해 한 건의 데이터를 DB에 저장
// (1-2) DB에 잘 저장되었는지 DB에서 조회해서 결과를 확인
}
@Test
public void testB() {
// (2-1) 데이터가 DB에서 잘 조회 되는지를 테스트하기 위해 DB에서 조회
}
}
사전상 Mock의 의미
’Not real, but intended to be very similar to a real situation, substance etc’
진짜인 것처럼 보이도록 진짜와 유사한 상황이나 물건, 물질 등을 의미
테스트에서의 Mock = 가짜 객체
→ 단위 테스트나 슬라이스 테스트 등에 Mock 객체를 사용하는 것 = Mocking
<기존 슬라이스 테스트 실행 흐름>
<Mock을 이용한 슬라이스 테스트 실행 흐름>
Mockito란, Spring Framework에서 지원하는 Mocking 라이브러리
테스트를 먼저하고 구현은 그 다음에 한다.