테스트 종류 중 단위테스트, 통합 테스트, 인수 테스트에 대해 정리해 보겠습니다.
단위테스트(Unit Test)
목적
개별 모듈 또는 함수의 동작을 테스트하여 코드의 기능을 검증합니다.
이는 작은 단위의 코드가 정확하게 동작하는지 확인하는 것을 목표로 합니다.
대상
주로 클래스, 메서드 또는 모듈과 같은 소프트웨어의 작은 단위에 집중합니다.
클래스의 각 메서드나 모듈의 개별 기능을 테스트합니다.
특징
- 의존성을 분리하고 격리하여 단일 모듈의 동작만을 검증합니다. 이를 위해 모의 객체(mock object)나 가짜 객체(fake object)등을 사용하여 외부 의존성을 제어합니다.
- 자체적으로 실행되며 외부 리소스에 의존하지 않습니다. 이는 외부 서비스나 데이터베이스 등을 호출하지 않고, 테스트 환경에서만 독립적으로 실행됩니다.
목표
개발자가 코드 변경 후 기능이 여전히 올바르게 동작하는지를 보장하고 버그를 조기에 발견하여 수정합니다.
이는 코드의 신뢰성을 유지하고 코드 변경에 대한 부담을 줄여줍니다.
예시
예를 들어, 계산기 애플리케이션에서 덧셈 함수의 단위 테스트는 입력된 두 숫자를 더하여 올바른 결과가 반환되는지를 확인합니다.
/**
* given 계산기 객체 생성
* when 계산기에 두 숫자를 더함
* then 기대한 값과 실제 계산 결과를 비교하여 검증
*/
@Test
void addTest() {
// given
Calculator calculator = new Calculator();
int num1 = 3;
int num2 = 5;
// when
int result = calculator.add(num1, num2);
// then
int expected = 8;
assertEquals(expected, result);
}
통합 테스트(Integration Test)
목적
여러 모듈이나 컴포넌트 간의 상호 작용을 테스트하여 시스템 전체의 동작을 검증합니다.
대상
주로 모듈 간의 통합된 동작을 검증합니다.
특징
여러 모듈을 통합하고, 그들 간의 상호 작용 및 통합된 동작을 검사합니다. 외부 리소스와의 상호 작용이 필요할 수 있습니다.
목표
시스템의 상호 작용이 예상대로 수행되고 각 구성 요소가 올바르게 통합되었는지를 확인합니다. 전체 시스템의 완전성과 품질을 검증합니다.
예시
웹 애플리케이션에서 사용자 등록 기능의 통합 테스트는 사용자 인터페이스(UI)를 통해 사용자가 정보를 입력하고, 서버 측에서 이를 처리하고 데이터베이스에 저장되는지를 확인합니다.
/**
* given 사용자 정보 생성
* when 사용자 등록
* then 등록된 사용자 정보를 조회하여 확인
*/
@Test
void userRegistrationTest() {
//given
User user = new User("John", "Doe", "john@example.com");
//when
UserService userService = new UserService();
userService.registerUser(user);
//then
User registeredUser = userRepository.findByEmail("john@example.com");
assertNotNull(registeredUser);
assertEquals("John", registeredUser.getFirstName());
}
인수 테스트(Acceptance Test)
목적
사용자의 요구 사항을 충족시키고 소프트웨어가 사용자의 목적에 부합하는지를 검증합니다.
대상
사용자의 요구 사항, 비즈니스 시나리오, 사용자 스토리 등을 테스트합니다.
특징
사용자 관점에서 시스템을 테스트하며, 사용자의 요구 사항을 기반으로 시나리오를 실행합니다.
목표
소프트웨어가 사용자가 예상한 대로 동작하는지 확인하고, 사용자의 요구 사항을 충족시키며 비즈니스 목표를 달성하는지를 검증합니다.
예시
쇼핑몰 애플리케이션에서 주문 기능의 인수 테스트는 사용자가 주문을 생성하고 결제를 진행하며, 주문 내역이 정확히 처리되고 상품이 배송되는지를 확인합니다.
/**
* given 사용자가 상품을 선택하고 주문 생성
* when 주문 내역을 데이터베이스에서 조회하여 확인
* then 결제가 정상적으로 처리되었는지 확인, 상품이 배송되었는지 확인
*/
@Test
void orderPlacementTest() {
//given
Order order = new Order(user, product, quantity);
orderService.placeOrder(order);
//when
Order placedOrder = orderRepository.findById(order.getId());
assertNotNull(placedOrder);
assertEquals(Status.PLACED, placedOrder.getStatus());
//then
assertTrue(paymentService.verifyPayment(placedOrder));
assertTrue(deliveryService.scheduleDelivery(placedOrder));
}
이 세 가지 테스트의 주요 차이점은 테스트의 목적 대상 특징 및 목표에 있습니다.
각각의 테스트는 다른 측면에서 소프트웨어의 품질을 검증하고 보장합니다.
'Backend > TestCode' 카테고리의 다른 글
| JUnit4와 JUnit5의 차이 (1) | 2025.01.27 |
|---|---|
| 인수 테스트 격리하는 방법 (0) | 2024.07.06 |
| FixtureMonkey 알아보기 (0) | 2024.03.26 |