AI가 작성한 코드, 테스트는 통과했지만 위험했습니다: Jest로 데이터 혼입을 발견하다
요약
AI가 생성한 코드가 정상 케이스 테스트를 통과하더라도, 실제 사양에 맞지 않는 위험한 버그(예: 테넌트 데이터 혼입)가 있을 수 있습니다. 본 글은 Jest 단위 테스트를 활용하여 '출력해서는 안 되는 데이터'와 같은 누락된 사양을 발견하는 방법을 제시합니다.
핵심 포인트
- 정상 케이스만으로는 놓치기 쉬운 버그 예시를 다룹니다.
- 사양 기반으로 '출력 금지 데이터'에 대한 테스트 작성법을 배웁니다.
- AI에게 구현과 테스트를 맡길 때, 사양 공유가 중요합니다.
- 단위 테스트 통과 후에도 사람이 확인해야 할 범위가 존재합니다.

서론
AI에게 '주문을 CSV로 출력하는 함수를 만들어 달라'고 요청했다고 가정해 봅시다. 돌아온 코드는 읽기 쉽고, 샘플 데이터에서도 올바른 CSV를 출력합니다. 그럼에도 불구하고, 실제 사양에 맞는다고 할 수는 없습니다.
이 글에서는 다른 테넌트의 주문이 CSV에 섞이는 등, 정상 케이스만으로는 놓치기 쉬운 버그를 Jest 테스트로 찾아냅니다. AI가 생성했다고 가정한 구현을 사용하지만, 이 방법은 사람이 작성한 코드에도 적용할 수 있습니다.
Jest 도입이나 기본 구문부터 확인하고 싶은 분들은 별도 글인 'Jest 사용법 기초부터 배우기'도 참고해 주세요.
이 글에서 알게 되는 것들
- 정상 케이스 테스트만으로는 놓치기 쉬운 버그의 구체적인 예시
- 사양으로부터 '출력해서는 안 되는 데이터'에 대한 테스트를 만드는 방법
- AI에게 구현과 테스트를 맡길 때, 같은 오해를 공유하지 않도록 요청하는 방법
- 단위 테스트(Unit Test) 통과 후에도 사람이 확인해야 할 범위
사양을 먼저 결정하기
이번에는 관리 화면에서 주문 CSV를 다운로드하는 기능을 생각해 보겠습니다. 사양은 다음 4가지입니다.
- 관리자만 출력할 수 있다.
- 출력할 수 있는 것은, 관리자가 소속된 테넌트의 주문만이다.
- 출력하는 것은, 결제 완료된 주문만이다.
- CSV에는 주문 ID와 금액을 포함하고, 데이터가 없으면 헤더만 반환한다.
테넌트(Tenant)란 같은 서비스를 이용하는 조직별로 나눈 데이터 단위입니다. A사의 관리자가 B사의 주문을 볼 수 있어서는 안 됩니다.
테스트로 확인해야 하는 것은 코드의 형태가 아니라, 이 동작 방식입니다.
AI가 반환한 코드를 살펴보기
아래는 AI가 생성할 법한 간결한 구현 예시입니다. exportOrdersCsv.js로 저장합니다.
function exportOrdersCsv(user, orders) {
if (user.role !== "admin") {
throw new Error("관리자만 출력할 수 있습니다");
...
}
관리자를 확인하고, 결제 완료된 주문을 추출하여 CSV로 만들고 있습니다. 언뜻 보기에는 사양에 맞는 것 같지만, 주문의 테넌트를 확인하지 않았습니다. 같은 테넌트의 데이터만으로 테스트하면 이 누락은 드러나지 않습니다.
사양으로부터 테스트 만들기
Jest를 사용할 수 있는 프로젝트에서, `exportOrdersCsv.te
다시 실행해 보니, 정상 케이스와 다른 테넌트의 테스트가 모두 통과합니다.
PASS ./exportOrdersCsv.test.js
✓ 자신의 테넌트의 결제 완료 주문을 CSV로 출력한다
✓ 다른 테넌트의 결제 완료 주문을 출력하지 않는다
...
나머지 사양도 확인하기
하나의 실패를 고쳤다고 끝이 아닙니다. 이번에 결정한 사양 중, 아직 확인되지 않은 동작들을 테스트합니다. 다음 코드를 같은 테스트 파일에 추가합니다.
test("미결제 주문을 출력하지 않는다", () => {
const orders = [
{
id: "A-1", tenantId: "tenant-a", status: "unpaid", amount: 1200 },
...
여기까지로, 초반의 네 가지 사양을 테스트할 수 있었습니다. 단순히 건수나 커버리지만 보는 것보다, 어떤 사양을 확인했고 어떤 사양이 아직 남아있는지를 보이게 하는 것이 중요합니다.
| 사양 | 대응하는 테스트 |
|---|---|
| 관리자만 출력 가능 | 일반 사용자에 의한 출력을 거부한다 |
| ... | |
| 이 대응표는 그대로 리뷰의 체크리스트가 될 수도 있습니다. '테스트가 5개 있다'가 아니라, '4가지 사양 모두에 테스트가 있다'고 설명할 수 있는 상태를 목표로 합니다. |
AI에게 테스트 작성을 부탁하는 방법
AI에게 구현과 테스트를 함께 맡길 수는 있습니다. 하지만 모호한 요청으로는, 구현과 테스트가 같은 사양의 오해를 공유하게 될 수 있습니다. 먼저 기대하는 동작을 전달하고, 허용되지 않는 케이스도 명시합니다.
주문 CSV 출력에 대한 테스트를 Jest로 작성해주세요.
구현 내부 함수나 필터 조건이 아니라, 공개 함수의 입출력을 검증해주세요.
사양:
...
AI가 제안한 테스트도 확인해야 합니다. 테스트 이름만 그럴싸해도, 다른 테넌트의 데이터를 입력하지 않았다면 이번 버그는 발견할 수 없습니다.
AI 테스트를 리뷰하는 3가지 질문
AI가 테스트를 생성했다면, 최소한 다음 3가지를 확인합니다
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기