학습
C++ 기본적인 테스트 기법
C++ 기본적인 테스트 기법 — 중급
기본적인 테스트 기법
1. 도입 (왜 배워야 하는가)
소프트웨어 개발에서 테스트는 품질을 보장하는 중요한 과정입니다. 프로그램이 의도한 대로 작동하는지 확인하지 않으면, 버그가 발생할 가능성이 높아지고 이는 고객의 신뢰를 잃거나, 심각한 비즈니스 손실로 이어질 수 있습니다. 특히, 실무에서는 코드 변경이나 새로운 기능 추가 시 기존 코드의 안정성을 확인하는 것이 필수적입니다. 테스트 기법을 모르면 코드가 예상치 못한 오류를 일으켜 시스템 전체에 영향을 미칠 수 있습니다. 따라서, 테스트 기법을 배우는 것은 개발자에게 매우 중요합니다.
2. 핵심 개념 설명
테스트 기법의 주요 개념은 다음과 같습니다:
- 단위 테스트 (Unit Testing): 개별 모듈이나 함수의 정확성을 검증하는 테스트입니다. 이를 통해 각 구성 요소가 예상한 대로 작동하는지 확인할 수 있습니다.
- 통합 테스트 (Integration Testing): 여러 모듈이 함께 작동할 때의 정확성을 검증합니다. 개별적으로는 잘 작동하던 모듈이 결합될 때 문제가 발생할 수 있으므로 필요합니다.
- 시스템 테스트 (System Testing): 전체 시스템이 요구사항을 충족하는지 확인하는 테스트입니다. 최종 사용자에게 제공될 소프트웨어의 품질을 보장합니다.
| 용어 | 정의 |
|---|---|
| 단위 테스트 | 개별 모듈의 정확성을 검증 |
| 통합 테스트 | 여러 모듈의 상호작용을 검증 |
| 시스템 테스트 | 전체 시스템의 요구사항 충족 여부 확인 |
3. 기본 코드 예제
단위 테스트의 기본 예제를 살펴보겠습니다. 아래는 C++로 작성된 간단한 함수와 해당 함수를 테스트하는 코드입니다.
#include <iostream>
#include <assert.h>
// 테스트할 함수
int add(int a, int b) {
return a + b;
}
// 단위 테스트
void test_add() {
assert(add(2, 3) 5); // 2 + 3은 5여야 합니다.
assert(add(-1, 1) 0); // -1 + 1은 0이어야 합니다.
assert(add(0, 0) == 0); // 0 + 0은 0이어야 합니다.
}
int main() {
test_add(); // 단위 테스트 실행
std::cout << "모든 테스트가 통과했습니다!" << std::endl;
return 0;
}
실행 결과
모든 테스트가 통과했습니다!
코드 한 줄씩 동작 설명
#include <iostream>: 입출력 스트림을 사용하기 위한 헤더 파일을 포함합니다.#include <assert.h>: assert 함수를 사용하기 위한 헤더 파일을 포함합니다.int add(int a, int b): 두 정수를 더하는 함수 정의합니다.return a + b;: 두 정수를 더한 결과를 반환합니다.void test_add(): 단위 테스트를 정의하는 함수입니다.assert(...);: 조건이 참인지 확인하고, 거짓이면 프로그램을 중단합니다.int main(): 프로그램의 시작점입니다.test_add();: 단위 테스트 함수를 호출합니다.std::cout << ...: 모든 테스트가 통과했음을 출력합니다.- 쇼핑몰에서 장바구니를 구현할 때: 장바구니에 아이템을 추가하고 총합을 계산하는 함수를 작성하고, 이 함수에 대한 단위 테스트를 수행하여 올바른 합계가 계산되는지 검증합니다.
- 은행 시스템에서 계좌 이체 기능: 계좌에서 돈을 이체하는 함수와 잔액을 검증하는 테스트를 작성하여 여러 계좌 간의 이체가 정확히 작동하는지 확인합니다.
- 테스트 케이스 부족: 테스트 케이스가 부족하면 엉뚱한 부분에서 버그가 발생할 수 있습니다. 예를 들어, 경계 값을 테스트하지 않는 경우입니다.
- assert 사용의 오해: assert는 실행 중에 조건이 false일 경우 프로그램을 종료합니다. 프로덕션 코드에서는 assert를 사용하지 않는 것이 좋습니다.
- 단위 테스트와 통합 테스트 혼동: 단위 테스트는 개별 함수나 모듈을 테스트하는 것이고, 통합 테스트는 여러 모듈이 상호작용하는 것을 테스트합니다.
- 테스트는 소프트웨어 품질을 보장하는 필수 과정입니다.
- 단위 테스트, 통합 테스트, 시스템 테스트 등의 개념을 이해하는 것이 중요합니다.
- 테스트 케이스를 충분히 작성하는 것이 필수적이며, assert의 사용법을 정확히 알아야 합니다.
- 다음에 학습하면 좋은 주제: 테스트 주도 개발 (TDD), Mocking과 Stubbing.
4. 실전 활용 예제
// 쇼핑몰 장바구니 예제
#include <vector>
#include <iostream>
#include <cassert>
class ShoppingCart {
public:
void addItem(int price) {
items.push_back(price);
}
int getTotal() {
int total = 0;
for (int price : items) {
total += price;
}
return total;
}
private:
std::vector<int> items;
};
void test_ShoppingCart() {
ShoppingCart cart;
cart.addItem(100);
cart.addItem(200);
assert(cart.getTotal() == 300); // 총합은 300이어야 합니다.
}
int main() {
test_ShoppingCart();
std::cout << "장바구니 테스트가 통과했습니다!" << std::endl;
return 0;
}
실행 결과
장바구니 테스트가 통과했습니다!
5. 흔한 실수와 주의사항
- 잘못된 코드:
assert(add(1, 2) == 3); // 단순한 경우만 테스트
- 올바른 코드:
assert(add(1, 2) 3);
assert(add(0, 0) 0);
assert(add(-1, 1) == 0);