이득:
- AI를 활용한 단위 테스트, 엣지 케이스, 커버리지 갭 분석 생성 기능
- 코드의 현재 동작이 아닌 사양을 기반으로 테스트 기대치를 인쇄하는 기능
- 테스트가 실제로 오류를 주입하여 보호하는지 여부를 테스트하는 기능
테스트 작성은 대부분의 개발자가 미루는 가장 가치 있는 작업 중 하나입니다. 좋은 테스트 스위트는 코드가 예상대로 작동한다는 증거이자 향후 변경을 위한 생명선입니다. 문제는 테스트 작성이 반복적이고 시간이 많이 걸린다는 것입니다. 바로 AI가 빛을 발하는 작업입니다. 그러나 문제가 있습니다. AI는 종종 있어야 할 동작이 아니라 코드의 기존 동작을 테스트합니다. 이러한 차이를 관리하는 것이 이 단원의 핵심입니다.
이 단원에서는 단위 테스트(단독으로 기능만 테스트하는 테스트), 엣지 케이스 테스트 및 AI를 사용하여 테스트 데이터 생성을 학습합니다. 테스트 범위의 격차를 해소합니다. AI 테스트를 맹목적으로 신뢰하는 것이 왜 위험한지.
테스트의 두 가지 측면: 동작 수정과 검증
테스트는 두 가지 다른 목적으로 사용될 수 있습니다. 첫 번째는 검증입니다. 코드가 올바른지, 사양을 준수하는지 테스트합니다. 두 번째는 회귀 방지입니다. 오늘 코드의 동작을 동결하므로 누군가 내일 실수로 코드를 변경하면 테스트가 중단되고 알림이 전송됩니다.
AI는 후자에 매우 능숙합니다. 코드를 살펴보고 "지금 무엇을 하고 있는지" 테스트하는 사례를 생성합니다. 그러나 코드가 처음부터 잘못된 경우 AI는 잘못된 동작을 "올바른" 것으로 고정할 수 있습니다. 따라서 AI가 생성하는 각 테스트의 주장을 검토해야 합니다. "코드는 42를 반환하고 테스트에서는 42를 예상합니다."라고 해서 42가 정답이라는 의미는 아닙니다.
주의: AI가 테스트를 통과한다고 해서 코드가 "작동"한다는 의미는 아닙니다. 그것은 단지 "AI가 기대하는 대로 행동한다"는 뜻이다. 사양을 보고 기대가 올바른지 여부를 결정합니다.
단계별: AI를 사용하여 강력한 테스트 작성
- 코드뿐만 아니라 사양도 제공하세요. "이 함수는 이것을 해야 합니다"라는 정보를 추가하면 AI는 올바른 기대치를 작성할 수 있습니다. 코드만 제공하면 현재 동작을 테스트합니다.
- 극단적인 경우를 요청하세요. 비어 있음, null, 0, 음수, 너무 큼, 잘못된 형식, 동시성 — 명시적으로 행복한 경로를 요구합니다.
- 테스트 프레임워크와 스타일을 지정합니다. "pytest 사용", "Arrange-Act-Assert 패턴", "각 테스트에서 한 가지만 테스트" 등
- 기대(어설션)를 확인합니다. 각 어설션이 올바른 값을 확인하는 사양과 비교하세요.
- 범위의 격차를 해소합니다. 기존 테스트를 제공하고 "어떤 분기와 사례가 테스트되지 않았습니까?"라고 질문하십시오. 물어보게 만드세요; 그런 다음 생성된 추가 테스트를 확인합니다.
미니 케이스 3개
사례 1 - 적용 범위가 52%에서 85%까지입니다. 하나의 서비스 모듈에 대한 테스트 적용 범위는 52%였습니다. 팀은 기존 테스트를 AI에 제공하고 테스트되지 않은 분기를 나열하고 이에 대한 테스트를 생성하도록 했습니다. 인적 검토를 통해 적용 범위가 85%로 증가했습니다. 이 과정에서 AI는 이전에 테스트한 적이 없는 버그 브랜치에서 실제 버그(잘못된 오류 코드를 반환한 경로)를 발견했다.
사례 2 - 잘못된 기대 고정 함정. 돈 반올림 기능이 실제로 잘못되었습니다. 2.675를 2.67로 반올림하는 대신 2.68이 아닌 2.67로 반올림했습니다. AI는 코드를 보고assert round_money(2.675) == 2.67을 작성하여 오류를 "true"로 고정했습니다. 개발자는 사양을 읽었을 때 예상을 수정하고 실제 버그를 포착했습니다. 코드가 아닌 규칙을 테스트하면 차이가 발생합니다.
사례 3 — 엣지 상태 폭발. 날짜 범위 기능에 대해 AI에 "극단적인 사례"만 요청하는 경우 시작=끝, 역방향 간격, 윤년 2월 29일, 다른 시간대, 널 간격 등 8가지 경우를 생성했습니다. 이 중 두 가지(역 간격 및 윤년)가 실제로 오류를 일으켰습니다. 이러한 경우를 수동으로 고려하는 것은 종종 건너뜁니다. 여기서 AI는 "최첨단 사례 브레인스토밍" 파트너가 되었습니다.
복사 가능한 템플릿 4개
사양 기반 테스트 생성:
역할: 테스트를 작성하는 개발자입니다. 프레임워크: {{pytest/JUnit/Jest...}}.함수가 수행해야 하는 작업(사양): {{rule}}다음 함수에 대한 테스트를 작성합니다. 코드의 현재 출력이 아닌 사양에 따라 기대치를 작성합니다. Happy path + 엣지 케이스를 4개 이상 추가하세요. 각 테스트에서 한 가지만 테스트하도록 하고 설명적인 이름을 사용하세요. {{기능}}
엣지 케이스 브레인스토밍:
이 함수에 대한 테스트에서 시도해야 하는 경계/실패 사례를 나열합니다(null, null, 중단점, 잘못된 형식, 동시성, 외부 오류). 각 사례에 대해: 입력, 예상 동작. 아직 코드를 작성하지 말고 그냥 나열하세요.{{함수}}
보장 공백 분석:
다음은 기능과 사용 가능한 테스트입니다. 테스트되지 않은 분기, 조건 및 사례는 무엇입니까? 결함을 나열하고 결함에 대해서만 새 테스트를 작성하십시오. 기존 것을 반복하지 마십시오. 기능:{{function}}테스트:{{existing_tests}}
테스트 데이터 / 모의 객체 생성:
{{function/service}} 테스트를 위한 현실적인 테스트 데이터(유효 샘플, 경계 샘플 및 유효하지 않은 샘플)를 별도로 생성합니다. 외부 종속성 {{X}}에 대한 간단한 모의 동작을 제안합니다. 실제 기밀 데이터/PII 사용 가짜 데이터를 생성합니다.
약한 프롬프트 / 강한 프롬프트
약함: "이 함수에 대한 테스트를 작성합니다."
Strong: "pytest 사용. 함수 apply_discount(total,퍼센트) — 규칙: 할인은 0%~30%여야 하며 범위를 벗어나면 ValueError가 발생해야 하며 결과는 소수점 이하 2자리로 반올림되어야 합니다. 이 RULE에 따라 기대치를 작성합니다(코드가 아님). Happy path + 이러한 예외 사례: 0%, 30%, 31%(오류), 음수, total=0. [코드]"
그는 강력한 릴리스 규칙을 제시하고 "코드가 아닌 규칙에 따라 기대치를 작성하십시오"라고 말합니다. 이 한 문장으로 AI가 잘못된 행동을 고치는 함정을 막을 수 있습니다.
테스트 유형
AI 기여
인간의 통제
행복한 도로 단위 테스트
빠른 해골
예상이 맞나요?
엣지 케이스
광범위한 브레인스토밍
관련 없는 것을 제거하라
범위 공백 채우기
건너뛴 분기를 찾습니다.
중요성 확인
테스트 데이터/모의
현실적인 샘플 생성
PII 없음, 사실성 제어
테스트는 품질을 보장하는 것이 아니라 품질을 관리합니다
높은 테스트 적용 범위는 자신감을 주지만 오해의 소지가 있을 수도 있습니다. 100% 적용 범위는 "모든 행이 정확함"이 아니라 "모든 행이 실행됨"을 의미합니다. AI로 적용 범위를 늘리는 것은 쉽습니다. 진정한 가치는 의미 있는 기대치를 작성하는 데 있습니다. 테스트의 가치는 코드가 깨졌을 때 깨뜨리고 경고하는 능력입니다. 그렇기 때문에 AI 생성 테스트는 "코드가 변경되면 정말 깨지는가?"라는 질문을 기반으로 합니다. 질문으로 테스트해 보세요. 의도적으로 줄을 끊고 테스트 중단(돌연변이 아이디어)을 보는 것은 테스트가 작동했다는 증거입니다.
팁: AI가 작성한 테스트가 작동하는지 확인하려면 코드에 작은 버그를 만들고(예: +를 -로 변경) 테스트가 중단되는지 확인하세요. 깨지지 않으면 그 테스트는 당신을 보호하지 못합니다.
일반적인 실수
- 규칙을 알려주지 않고 테스트를 요청합니다. 모델은 현재 동작을 정지합니다. 오류를 "true"로 수정합니다.
- 기대치를 읽지 않고 받아들입니다. 어설션이 올바른 값을 확인하고 있는지 확인하지 않으면 테스트가 오해를 불러일으킬 수 있습니다.
- 행복한 길을 테스트하는 것뿐입니다. 실제 오류는 여백에 존재합니다. 극단적인 경우를 명시적으로 요청하세요.
- 목적을 위해 범위를 착각합니다. 비율이 높다고 해서 올바른 동작이 보장되는 것은 아닙니다.
- 실제/숨겨진 데이터를 테스트 데이터로 만듭니다. 고객 데이터나 비밀은 테스트 및 저장에 들어가서는 안 됩니다. 합성 데이터를 생성합니다.
요약하면
AI는 테스트 작성에서 반복적인 부담을 상당 부분 덜어줍니다. 즉, 빠른 뼈대, 대규모 엣지 케이스 목록, 적용 범위 격차 분석을 생성합니다. 그러나 가장 중요한 점은 기대입니다. AI는 코드의 현재 동작을 테스트하는 경향이 있는 반면 테스트는 사양에 따라 작성되어야 합니다. 규칙을 제공하고, 기대치를 확인하고, 엣지 케이스를 적용하고, 버그를 주입하여 테스트가 실제로 보호하는지 테스트합니다. 테스트 커버리지는 목표가 아닌 도구입니다.
응용과제
기능을 선택하고 먼저 코드를 제공하여 AI에 테스트를 인쇄합니다. 기대에 주목하세요. 그런 다음 테스트를 다시 인쇄하여 동일한 기능에 대한 사양(필수 동작)을 제공합니다. 두 테스트 세트의 기대치를 비교하십시오. 실제 버그를 드러내는 다른 것이 있습니까? 마지막으로 코드에 의도적인 버그를 추가하고 테스트 중단을 확인하여 생성된 테스트 중 하나가 작동했는지 확인합니다.
체크리스트
- [ ] 나는 테스트가 동작을 수정하기 위한 것인지 검증하기 위한 것인지 구별합니다.
- [ ] 테스트 의뢰 시 코드가 아닌, 갖춰야 할 룰(사양)을 알려드립니다.
- [ ] 생성된 각 주장을 사양과 비교합니다.
- [ ] 엣지 및 실패 사례를 명시적으로 요청합니다.
- [ ] 나는 비율을 목표가 아닌 도구로 봅니다.
- [ ] 오류를 주입하여 테스트가 실제로 보호하는지 테스트합니다.