테스트와 품질 보증
AI로 포괄적인 테스트 스위트를 생성해요 — 여러분이 절대 생각하지 못할 엣지 케이스까지. 더 적은 시간에 더 나은 테스트를 작성해요.
프리미엄 강좌 콘텐츠
이 레슨은 프리미엄 강좌의 일부예요. Pro로 업그레이드하면 모든 프리미엄 강좌와 콘텐츠를 이용할 수 있어요.
- 모든 프리미엄 강좌 이용
- 1000개 이상의 AI 스킬 템플릿 포함
- 매주 새로운 콘텐츠 추가
🔄 이전 레슨 복습: 이전 레슨에서 AI로 디버깅과 에러 해결을 배웠어요. 이제 코드가 계속 제대로 작동하도록 AI로 테스트를 작성하는 법을 다뤄요.
작성하지 않은 테스트
모든 개발자가 겪은 시나리오: 함수를 작성하고, 입력 몇 개로 수동 테스트하고, 작동하니까 배포해요. 3주 후 사용자가 버그를 발견해요. 입력? 빈 문자열. 또는 음수. 또는 항목이 하나뿐인 리스트.
그 케이스를 테스트했어야 하는 걸 알았어요. 그냥… 안 했을 뿐이에요.
AI는 엣지 케이스를 잊지 않아요. 15번째 테스트를 쓰는 데 지치지 않아요. “프로덕션에서 절대 안 일어나니까"라고 이상한 입력을 건너뛰지 않아요.
AI 테스팅 워크플로
모든 테스팅 세션에서 사용할 워크플로:
- 테스트할 코드를 의존성과 함께 제공
- 기대 동작을 설명 (코드가 하는 것이 아니라 해야 하는 것)
- 특정 테스트 타입 요청 (유닛, 통합, 엣지 케이스)
- 리뷰하고 개선
- 수동 테스트 추가 — AI가 놓칠 수 있는 도메인 특화 케이스
1단계: AI에게 전체 그림 제공
이 함수가 있다고 해요:
def calculate_discount(
subtotal: float,
coupon_code: str | None,
is_member: bool,
items_count: int
) -> dict:
"""여러 요소를 기반으로 주문 할인을 계산."""
discount = 0.0
reasons = []
# 멤버 할인: 10%
if is_member:
discount += subtotal * 0.10
reasons.append("Member discount: 10%")
# 대량 할인: 10개 이상 5%
if items_count >= 10:
discount += subtotal * 0.05
reasons.append("Bulk discount: 5%")
# 쿠폰 코드
if coupon_code:
coupon_discounts = {
"SAVE20": 0.20, "WELCOME10": 0.10, "VIP30": 0.30,
}
rate = coupon_discounts.get(coupon_code.upper())
if rate:
discount += subtotal * rate
reasons.append(f"Coupon {coupon_code}: {int(rate*100)}%")
# 최대 50% 캡
max_discount = subtotal * 0.50
if discount > max_discount:
discount = max_discount
reasons.append("Capped at 50% maximum")
return {
"subtotal": subtotal,
"discount": round(discount, 2),
"total": round(subtotal - discount, 2),
"reasons": reasons,
}
AI에게 이렇게 요청해요:
이 calculate_discount 함수에 대한 포괄적인 테스트 스위트를
pytest로 작성해줘. 포함할 것:
1. 각 할인 타입의 해피 패스 테스트
2. 조합 테스트 (멤버 + 쿠폰, 멤버 + 대량, 전부)
3. 엣지 케이스 (0 subtotal, 음수, 빈 문자열 쿠폰,
잘못된 쿠폰, 대소문자 구분)
4. 경계 테스트 (정확히 10개, 9개)
5. 50% 캡 동작
6. 타입 엣지 케이스 (None vs 빈 문자열)
설명적인 테스트 이름. AAA 패턴 (Arrange, Act, Assert).
2단계: AI가 생성하는 것
AI가 이런 걸 만들어요 (축약):
class TestCalculateDiscount:
# --- 해피 패스 ---
def test_member_gets_10_percent_discount(self):
result = calculate_discount(100.0, None, True, 1)
assert result["discount"] == 10.0
assert "Member discount: 10%" in result["reasons"]
def test_bulk_order_gets_5_percent(self):
result = calculate_discount(200.0, None, False, 10)
assert result["discount"] == 10.0
# --- 조합 ---
def test_all_discounts_combined(self):
result = calculate_discount(100.0, "VIP30", True, 15)
# 10% + 5% + 30% = 45%, 50% 캡 이하
assert result["discount"] == 45.0
# --- 엣지 케이스 ---
def test_zero_subtotal_returns_zero(self):
result = calculate_discount(0.0, "SAVE20", True, 10)
assert result["discount"] == 0.0
def test_invalid_coupon_ignored(self):
result = calculate_discount(100.0, "BOGUS", False, 1)
assert result["discount"] == 0.0
def test_coupon_case_insensitive(self):
result = calculate_discount(100.0, "save20", False, 1)
assert result["discount"] == 20.0
주목할 점: AI가 자체 테스트에서 잠재적 버그를 잡았어요 — “전체 할인 조합” 케이스에서 처음에 50(캡)을 예상했다가 다시 계산해서 45%가 캡 이하라는 걸 발견했어요.
3단계: 생성된 테스트 리뷰
AI 생성 테스트를 맹목적으로 신뢰하지 마세요. 이런 문제를 확인하세요:
동어반복 테스트 — 코드가 올바른 일을 하는지가 아니라, 코드가 하는 일을 하는지 테스트:
# 나쁨: 함수 로직을 그대로 복사
def test_discount(self):
subtotal = 100.0
expected = subtotal * 0.10 # 소스 로직 복사
result = calculate_discount(subtotal, None, True, 1)
assert result["discount"] == expected
놓친 엣지 케이스:
def test_negative_subtotal(self):
# 이게 허용돼야 하나? 기대 동작은?
result = calculate_discount(-50.0, None, True, 1)
def test_floating_point_precision(self):
result = calculate_discount(33.33, "SAVE20", True, 1)
# 33.33 * 0.30 = 9.999... 반올림이 맞나?
✅ 확인 질문: 이 AI 생성 테스트의 문제점은 뭘까요?
def test_discount_applied(self):
result = calculate_discount(100.0, "SAVE20", False, 1)
assert result is not None
assert "discount" in result
함수가 뭔가를 반환하는지만 테스트하고, 값이 정확한지는 테스트하지 않아요. 할인 계산이 완전히 틀려도 이 테스트는 통과해요.
AI로 테스트 커버리지 빈틈 찾기
가장 강력한 테스팅 프롬프트 중 하나:
이 함수와 현재 테스트 스위트가 있어요.
현재 테스트되지 않는 동작, 엣지 케이스,
에러 조건이 뭐가 있을까요?
[함수 붙여넣기]
[기존 테스트 붙여넣기]
AI가 빈틈을 식별해요:
- “
items_count가 0일 때 테스트 없음” - “
reasons배열 순서 검증 테스트 없음” - “동시 할인 계산 테스트 없음”
- “매우 큰 subtotal 테스트 없음 (오버플로?)”
시니어 QA 엔지니어가 테스트 커버리지를 리뷰하는 것과 같아요.
테스트 피라미드와 AI
AI가 테스트 피라미드 접근법을 바꿔요:
유닛 테스트: AI에게 80% 이상을 맡기세요. AI가 잡는 엣지 케이스가 진짜 값어치가 있어요. 리뷰하고 도메인 특화 케이스를 추가하세요.
통합 테스트: AI와 공동 작업. 시나리오와 인터랙션을 정의하면 AI가 테스트 코드와 모킹 설정을 작성해요.
E2E 테스트: 유저 플로를 설계하면 AI가 테스트 코드로 변환을 도와줘요 (Playwright, Cypress 등).
핵심 정리
- AI는 인간이 놓치는 엣지 케이스와 경계 조건을 식별하는 데 탁월해요
- 함수, 의존성, 기대 동작을 제공하면 최고의 결과를 얻어요
- 동어반복 assertion과 잘못된 기대값이 없는지 리뷰하세요
- AI로 기존 테스트 커버리지의 빈틈을 찾으세요
- 유닛 테스트는 AI에게 맡기고, 통합·E2E 테스트는 공동 작업하세요
다음 레슨: 코드 리뷰와 리팩토링 — AI를 지치지 않는 리뷰어로 활용해서 프로덕션에 도달하기 전에 이슈를 잡는 법을 배워요.
이해도 체크
먼저 위의 퀴즈를 완료하세요
레슨 완료!