단위 테스트 종류
위 테스트의 각 유형을 좀 더 상세하게 설명하고, 각 유형이 어떤 문제를 잡기 위해 사용되는지, 그리고 각각에 대한 깔끔한 코드 예제를 제공하겠다. 여기서는 간단한 함수를 사용하여 여러 단위 테스트에 대해 설명한다.
⭐ 1. 대상 함수
// calculateDiscount 함수는 구매 금액(amount)에 따라 할인율을 적용함.
// 100 이상일 때는 10% 할인, 50 이상 100 미만일 때는 5% 할인, 그 외에는 할인 없음.
double calculateDiscount(double amount) {
if (amount >= 100) return amount * 0.9;
else if (amount >= 50) return amount * 0.95;
else return amount;
}
⭐ 2. Positive UT
긍정 테스트는 함수가 올바른 입력에 대해 예상된 동작을 수행하는지 확인하기 위해 사용된다. 이는 기본적으로 함수의 "정상적인" 사용 사례를 테스트한다.
void testCalculateDiscountPositive() {
assert(calculateDiscount(150) == 135); // 100 이상의 금액에 대해 10% 할인이 적용되어야 함.
assert(calculateDiscount(75) == 71.25); // 50 이상 100 미만의 금액에 대해 5% 할인이 적용되어야 함.
assert(calculateDiscount(25) == 25); // 50 미만의 금액에는 할인이 적용되지 않아야 함.
printf("Positive tests passed.\n");
}
⭐ 3. Negative UT
부정 테스트는 함수가 잘못된 입력이나 예외적인 상황을 적절하게 처리하는지 확인하기 위해 사용된다. 이는 함수의 오류 처리 능력을 테스트한다.
void testCalculateDiscountNegative() {
// 이 함수는 잘못된 입력에 대한 예외 처리를 구현하지 않았기 때문에, 의도적으로 오류 상황을 만들어 볼 수 없음.
// 만약 calculateDiscount 함수가 음수 입력에 대해 에러를 반환하도록 설계되었다면, 그것을 테스트하는 코드가 여기에 위치할 것임.
}
⭐ 4. Boundary UT
경계 테스트는 입력 값이나 출력 값이 경계에 위치할 때 함수의 동작을 검증하기 위해 사용된다. 이는 함수가 경계 조건에서도 올바르게 동작하는지 확인한다.
void testCalculateDiscountBoundary() {
assert(calculateDiscount(100) == 90); // 정확히 100인 경우, 10% 할인이 적용되어야 함.
assert(calculateDiscount(50) == 47.5); // 정확히 50인 경우, 5% 할인이 적용되어야 함.
assert(calculateDiscount(49.99) == 49.99); // 50 미만의 경계값에서 할인이 적용되지 않아야 함.
printf("Boundary tests passed.\n");
}
⭐ 5. Equivalence Partitioning UT
동등 분할 테스트는 입력 데이터를 유효한 값의 집합(할인이 적용되는 금액 범위)과 유효하지 않은 값의 집합(할인이 적용되지 않는 금액 범위)으로 나뉜다. 여기서는 모든 입력이 유효하므로, 할인율이 적용되는 범위를 기준으로 나눌 수 있다.
void testCalculateDiscountEquivalence() {
assert(calculateDiscount(25) == 25); // 할인 없음
assert(calculateDiscount(75) == 71.25); // 5% 할인 적용
assert(calculateDiscount(150) == 135); // 10% 할인 적용
printf("Equivalence partitioning tests passed.\n");
}
⭐ 6. Min/Max Unit Test
경계 테스트는 할인율 변경점 근처의 값들을 테스트한다. 또한, Min/Max 테스트로는 구매 금액의 합리적인 최소값과 최대값을 고려할 수 있다.
void testCalculateDiscountBoundary() {
assert(calculateDiscount(0) == 0); // 최소값 테스트
assert(calculateDiscount(1000) == 900); // 예시로 든 최대값 테스트
printf("Boundary and Min/Max tests passed.\n");
}
⭐ 7. Fault Injection Unit Test
고의적으로 함수에 잘못된 값을 주입하여, 함수가 예외 상황을 적절히 처리하는지 확인하는 테스트이다. calculateDiscount 함수의 경우, 음수 금액을 처리하는 능력을 테스트할 수 있다. 하지만 현재 함수 구현에서는 음수 입력에 대한 명시적 처리가 없으므로, 이 예제는 함수가 예외를 처리하도록 설계된 상황을 가정하고 작성된다.
void testCalculateDiscountFaultInjection() {
// 가정: 음수 금액에 대해서는 0을 반환하도록 함수가 수정되었다고 가정
assert(calculateDiscount(-50) == 0); // 잘못된 입력 처리 테스트
printf("Fault injection tests passed.\n");
}
실제 개발 환경에서는 이러한 테스트들을 통해 함수의 다양한 측면을 검증하여, 오류 가능성을 줄이고 코드의 신뢰성을 높일 수 있다. Fault Injection의 경우, 실제 구현에 따라 다르게 적용될 수 있으며, 함수가 예외 상황을 올바르게 처리할 수 있도록 보장하는 중요한 방법 중 하나이다.
'C언어 30강' 카테고리의 다른 글
[C/C++ Tip] 29. C언어 Unit Test (0) | 2024.11.12 |
---|---|
[C/C++ Tip] 28. C언어 포인터의 다양한 표현들 (0) | 2024.11.11 |
[C/C++ Tip] 27. C언어 데이터 형식 범위 (0) | 2024.11.11 |
[C/C++ Tip] 26. Char, String 기본 사용법 (1) | 2024.11.10 |
[C/C++ Tip] 25. C언어 2차원 배열 (0) | 2024.11.10 |