실무에서 바로 사용할 수 있는 total 함수의 단위 테스트 초안입니다. Jest 환경을 기준으로 작성하였으며, 정상 동작뿐만 아니라 빈 배열, 단일 값, 잘못된 입력 등 경계 상황과 예외 케이스를 모두 검증하도록 구성했습니다.
1. 테스트 코드 (total.test.js)
// 대상 함수 (코드가 별도 파일에 있다고 가정하거나 직접 포함)
function total(prices) {
return prices.reduce((sum, price) => sum + price);
}
describe('total 함수 단위 테스트', () => {
// 1. 정상값 테스트: 일반적인 가격 배열 계산
test('여러 개의 가격이 담긴 배열을 입력하면 총합을 반환한다', () => {
const prices = [1000, 2500, 3000];
const result = total(prices);
expect(result).toBe(6500);
});
// 2. 경계값 테스트: 요소가 1개인 경우
test('요소가 하나인 배열을 입력하면 그 값을 그대로 반환한다', () => {
const prices = [5000];
const result = total(prices);
expect(result).toBe(5000);
});
// 3. 소수점 포함 값 테스트 (부동소수점 정확도 확인용)
test('소수점이 포함된 가격 배열도 정확하게 계산한다', () => {
const prices = [10.5, 20.3, 5.2];
const result = total(prices);
expect(result).toBeCloseTo(36.0);
});
// 4. 예외 및 빈값 계약: 빈 배열 입력 시
test('빈 배열을 입력하면 reduce 에러(TypeError)가 발생한다', () => {
const prices = [];
// 초기값(initial value)이 없는 reduce는 빈 배열에서 TypeError를 던집니다.
expect(() => total(prices)).toThrow(TypeError);
});
// 5. 예외 계약: 인자가 전달되지 않거나 유효하지 않은 경우
test('prices가 배열이 아닐 경우 예외가 발생한다', () => {
expect(() => total(null)).toThrow();
expect(() => total(undefined)).toThrow();
});
});
2. 사례별 기대 결과 및 실패 해석
| 테스트 케이스 | 입력 (prices) | 기대 결과 | 실패 시 의미 / 해석 |
|---|---|---|---|
| 정상값 | [1000, 2500, 3000] | 6500 | 산술 연산 또는 reduce 로직에 문제가 생겼을 때 실패합니다. |
| 단일값 경계 | [5000] | 5000 | 단건 주문 등의 상황에서 예기치 않은 누락이 발생하는지 확인합니다. |
| 소수점 | [10.5, 20.3, 5.2] | 36.0 (toBeCloseTo) | JavaScript의 부동소수점 연산 오차(36.000000000000004 등)를 방어합니다. |
| 빈값 예외 | [] | TypeError 발생 | 초기값이 없는 reduce의 특성상 현재 코드는 빈 배열에서 에러를 던집니다. 의도된 설계라면 통과합니다. |
| 잘못된 입력 | null 또는 undefined | 에러 발생 | 방어 코드 부재 시 발생하는 TypeError를 확인합니다. |
3. 실행 명령
Jest가 프로젝트에 설치되어 있다면 아래 명령어로 즉시 실행할 수 있습니다.
# Jest 설치 (필요한 경우)
npm install --save-dev jest
# 테스트 실행
npx jest total.test.js
한 단계 더 유용하게 만들기: 다음 우선 고려사항
현재 total 함수는 prices.reduce((sum, price) => sum + price) 형태로 초기값(initial value)이 지정되어 있지 않습니다. 이 때문에 빈 배열이 들어오면 TypeError: Reduce of empty array with no initial value가 발생하며, 배열이 비어 있을 때 0을 반환해야 하는 비즈니스 요구사항이 있다면 아래와 같이 함수 개선을 함께 검토하는 것이 좋습니다.
// 초기값 0을 부여하여 빈 배열 안전성 확보
function totalSafe(prices) {
if (!Array.isArray(prices)) return 0;
return prices.reduce((sum, price) => sum + price, 0);
}
(※ 실제 프로젝트의 요구 계약에 따라 초기값 `0` 추가 여부를 결정하시면 됩니다.)
의견 보내기