이득:
- AI를 통해 의미 있는 주장을 통해 단위, 통합 및 엣지 케이스 테스트를 생성하는 능력
- AI 지원으로 테스트 커버리지, 한계값, 부정적 시나리오를 체계적으로 추출하는 능력
- AI가 생성한 테스트가 실제로 동작을 확인하고 기존 코드를 반복하지 않는지 확인하는 기능
테스트는 소프트웨어가 실제로 약속한 대로 작동하는지 입증하는 메커니즘입니다. 좋은 테스트 스위트는 변경으로 인해 문제가 발생하는지 몇 초 만에 알려주고 엔지니어가 자신있게 행동할 수 있는 자유를 제공합니다. AI는 테스트 작성에서 가장 지루하고 가장 많이 건너뛰는 부분, 즉 수많은 시나리오, 중단점 및 부정적인 사례를 생성하는 부분의 속도를 높입니다. 그러나 여기에는 교활한 함정이 있습니다. AI는 예상되는 동작이 아니라 코드의 현재(아마도 잘못된) 동작을 확인하는 테스트를 작성할 수 있습니다. 또는 실제로 아무것도 확인하지 않고 항상 통과하는 빈 테스트를 생성할 수도 있습니다. 테스트의 가치는 통과 여부가 아니라, 옳은 것을 확인하고 틀리면 빨간색으로 변하는지 여부에 있습니다.
이 단원에서는 의미 있는 주장을 사용하여 단위, 통합 및 엣지 케이스 테스트를 생성하는 방법을 배웁니다. 테스트 적용 범위, 중단점 및 단점 시나리오를 체계적으로 추출하는 방법 AI가 생성하는 테스트가 실제로 동작을 검증하는지 확인할 수 있는 방법을 살펴보겠습니다.
개념: 단위 테스트: 단일 함수/클래스를 격리하여 테스트합니다. 통합 테스트: 여러 부분이 함께 올바르게 작동하는지 테스트합니다. Assert: 결과가 예상한 것과 동일한지 확인하는 문입니다. 이것이 시험의 핵심입니다. 적용 범위: 테스트를 통해 실행되는 코드의 양. 높은 커버리지는 품질을 보장하지 않습니다.
의미 있는 테스트 생성
좋은 테스트는 세 가지 일을 명확하게 수행합니다. 즉, 상태를 설정하고, 작업을 수행하고, 결과를 확인합니다. 테스트를 AI로 인쇄할 때 확인하려는 동작과 다루어야 하는 시나리오를 지정하세요. 그렇지 않으면 항상 통과하는 피상적인 테스트가 생성됩니다.
- 테스트할 동작을 정의합니다. "무엇이 옳은 것으로 간주됩니까?" 질문에 명확하게 대답하십시오.
- 시나리오 유형을 문의하세요. 정상, 한계, 음수, 오류 조건.
- 의미있는 주장을 가져옵니다. 단순히 "오류가 발생"한 것이 아니라 "올바른 값을 반환"했습니다.
- 테스트의 정확성을 확인하십시오. 의식적으로 코드를 깨면 테스트가 빨간색으로 바뀌나요?
포괄적인 테스트 생성 프롬프트: "다음 'applydiscount(금액, 쿠폰)' 함수에 대한 단위 테스트를 작성합니다. (1) 정상적인 유효한 쿠폰, (2) 중단점(0 금액, 100% 할인), (3) 부정(잘못된 쿠폰, 마이너스 금액), (4) 오류 사례(널 쿠폰). 다음 범주에서 최소한 하나의 시나리오를 갖습니다. 각 테스트에서 CONCRETE 예상 값을 지정합니다('작동'이 아님). 테스트 이름을 지정하세요. 읽을 수 있습니다. 코드: [코드]"
경계 값 추출 프롬프트: "이 함수의 입력에 대해 경계 값 분석을 수행합니다. 각 매개변수에 대해 '경계 바로 아래', '경계 바로 아래', '경계 바로 위' 값을 테이블로 추출합니다. 그런 다음 이러한 경계를 다루는 테스트 시나리오를 나열합니다. 아직 코드를 작성하지 말고 분석 및 시나리오 목록만 작성하세요. 함수: [서명]"
주의: 높은 테스트 범위(예: 90%)는 코드가 정확하다는 것을 증명하지 않습니다. 적용 범위는 실행된 행 수를 측정합니다. 해당 라인이 올바른 결과를 생성하는 것은 아닙니다. 의미 있는 주장이 없는 테스트는 적용 범위를 늘리지만 아무 것도 보장하지 않습니다. 어설션의 내용은 어설션의 수가 아니라 품질을 결정합니다.
테스트 자체 테스트: 돌연변이의 논리
AI 생성 테스트가 실제로 작동하는지 이해하는 가장 실용적인 방법은 의도적으로 코드를 중단하는 것입니다(변이 테스트 논리). 조건을 뒤집고 + 기호를 -로 만듭니다. 테스트가 빨간색으로 바뀌지 않으면 테스트가 실제로 해당 동작을 유지하지 않는 것입니다.
테스트 취약점 찾기 프롬프트: "이 코드에서 다음 테스트가 포착하지 못할 잠재적인 버그가 무엇인지 알려주세요. 코드에 발생할 수 있는 5개의 작은 변형(예: > 대신 >=, + 대신 -)을 제안하고 각각에 대해 기존 테스트에서 이를 포착할 수 있는지 여부를 표시합니다. 포착되지 않은 경우 추가해야 하는 테스트를 제안합니다. 코드: [코드] 테스트: [테스트]"
약한 프롬프트 / 강한 프롬프트
WEAK: "이 함수에 대한 테스트를 작성합니다." (결과: 일반적으로 하나의 만족스러운 시나리오, 약한 어설션, 오류 누락.) STRONG: "이 'passwordStrong' 함수에 대한 테스트를 작성합니다. 규칙: 최소 8자, 대문자 1개, 숫자 1개가 필요합니다. 다음 시나리오를 별도의 테스트로 처리합니다. 정확히 8자(한계), 7자(한계 미만), 대문자 없음, 숫자 없음, 빈 문자열, 공백만, 너무 깁니다(1000자) 예상되는 true/false를 명시적으로 어설션합니다. 각 테스트의 값을 확인하고 검사 내용에 따라 테스트 이름을 지정하세요."
강력한 프롬프트는 규칙과 전체 경계 시나리오를 제공합니다. "정확히 8/7자"와 같은 경계 쌍은 실수를 저지르는 가장 일반적인 장소입니다(>=와 혼동). 약한 프롬프트는 이러한 경계를 우회하고 오류를 프로덕션으로 전달합니다.
테스트 유형 및 사용처
테스트 유형
그것은 무엇을 확인합니까?
AI 기여
주의
단위
단일 함수/클래스
다중 시나리오를 빠르게 생성
의미 있는 주장이 필요합니다.
통합
함께 작동하는 부품
시나리오 및 모의 데이터 초안
진정한 중독성 행동
종료/수락
전체 사용자 흐름
단계 목록 및 기대 사항
부서지기 쉬운
회귀
이전 오류가 반환되지 않음
결함별 테스트
모든 수정 사항에 추가되어야 함
미니 케이스
사례 1 - 항상 통과하는 테스트입니다. AI는 함수에 12개의 테스트를 작성하고 모두 통과합니다. 엔지니어는 의심스러워서 의도적으로 함수의 반환 값을 왜곡합니다. 테스트 중 3개만 빨간색으로 변합니다. 나머지 9개 테스트에는 의미 있는 어설션이 포함되어 있지 않습니다. 돌연변이 사냥을 통해 테스트가 강화됩니다. 실제 보호는 9가지 시나리오에서 얻을 수 있습니다.
사례 2 - 경계 오류. 연령 확인 기능에는 "18세 이상이 유효합니다"라고 표시되어야 하지만 >18이라고 쓰여 있어 18세가 거부된다는 의미입니다. AI가 중단점 분석을 통해 '정확히 18' 시나리오를 생성하기 때문에 테스트에서 오류가 즉시 나타납니다. 단일 제한 테스트를 통해 실제 사용자 불만을 예방할 수 있습니다.
사례 3 - 현재 동작 수정. AI가 "이 코드를 기반으로 테스트를 작성"하라는 지시를 받으면 코드에 이미 존재하는 반올림 오류를 "올바른" 것으로 받아들이는 테스트를 생성합니다. 엔지니어가 코드가 아닌 요구 사항(정확한 예상 값)에 따라 테스트를 인쇄하면 테스트가 빨간색으로 바뀌고 실제 오류가 발생합니다. 테스트는 코드가 아니라 기대에서 파생되어야 합니다.
일반적인 실수
- 무의미한 주장. "오류가 발생하지 않았습니다"만으로는 충분하지 않습니다. 올바른 값을 확인해야 합니다.
- 품질과 범위를 혼동합니다. 높은 적용 범위는 정확한 결과를 보장하지 않습니다.
- 코드로 테스트를 인쇄합니다. 현재 오류를 "true"로 수정합니다. 테스트는 기대에서 파생되어야 합니다.
- 한계값을 건너뛰는 중입니다. >를 >=와 혼동하는 것이 가장 흔한 실수입니다. 경계 쌍을 테스트해야 합니다.
- 테스트 자체를 감사하지 않습니다. 코드를 깨뜨렸을 때 빨간색으로 변하지 않는 테스트는 보호 기능을 제공하지 않습니다.
요약하면
좋은 테스트 도구 모음은 확신을 갖고 변경을 수행하는 데 핵심입니다. AI는 다양한 시나리오, 경계 및 부정적인 상황을 빠르게 생성합니다. 그러나 요구 사항이 아닌 코드에서 테스트를 파생시키면 기존 버그를 수정하거나 항상 통과하는 의미 없는 테스트를 작성할 수 있습니다. 각 테스트에서 구체적인 예상 값을 확인하고, 바인딩된 쌍을 포함하고, 의도적으로 코드를 깨뜨려 테스트가 실제로 보호하는지 확인하세요. 범위 수가 아니라 주장의 내용이 품질을 결정합니다.
응용과제
기능을 선택하고 포괄적인 테스트 생성 프롬프트를 통해 4가지 범주(정상, 한계, 부정, 오류)로 테스트를 생성하도록 합니다. 각 테스트에서 구체적인 기대값이 주장되도록 하세요. 그런 다음 테스트 취약점 찾기 프롬프트를 실행하고 코드에서 5개의 작은 변형을 제안한 다음 테스트를 실행하여 어떤 변형을 발견하는지 확인합니다. 발견되지 않은 하나 이상의 돌연변이에 대한 새 테스트를 추가하고 현재 빨간색으로 표시됩니다.
체크리스트
- [ ] 코드가 아닌 예상된/올바른 동작을 기반으로 테스트를 인쇄했습니다.
- [ ] 정상, 한계, 부정 및 오류 시나리오를 다루었습니다.
- [ ] 각 테스트에서 구체적인 기대값을 주장했습니다.
- [ ] 테두리 쌍(바로 위-아래/바로 위-아래)을 테스트했습니다.
- [ ] 의도적으로 코드를 깨뜨려 테스트가 빨간색으로 변하는 것을 확인했습니다.
- [ ] 발견되지 않은 돌연변이에 대한 새로운 테스트를 추가했습니다.