AI 생성 테스트 감사: 통과된 CI의 절반은 아무것도 증명하지 못한다
통과된 테스트는 증거처럼 느껴집니다. 하지만 실제로는 생각보다 훨씬 가치가 낮습니다.
테스트는 코드가 테스트의 기대치대로 동작하는지 단언합니다. 만약 동일한 작성자가 코드와 기대치를 모두 작성한다면, 기대치는 코드에 의해 형성됩니다. 즉, 테스트가 통과하도록 작성되었기 때문에 통과하는 것입니다.
초록색 체크표시는 테스트가 코드와 일치함을 증명할 뿐입니다. 코드가 올바르다는 것을 증명하지는 않습니다.
이 문제는 AI 에이전트가 전체 풀 리퀘스트(pull request)를 제출할 때 더욱 심화됩니다. AI는 구현과 테스트를 한 번에 작성합니다. 작성자가 바뀐다고 해서 체크표시의 신뢰도가 높아지는 것은 아닙니다.
저는 이 간극을 찾아내기 위해 mirror_audit.py를 만들었습니다. 이 도구는 AST를 사용하여 테스트 소스를 읽으며, 코드를 절대 실행하지 않습니다. 대신 다음과 같은 세 가지 흔한 패턴을 찾습니다.
- 재계산(The Recompute): 테스트가 코드와 동일한 공식을 사용합니다. 이는 변장한
f(x) == f(x)와 같습니다. - 골든 리터럴(The Golden Literal): 테스트가 이전 실행에서 복사한 숫자를 사용합니다. 이는 버그를 포함하여 첫날 코드가 수행한 결과에 테스트를 고정시켜 버립니다.
- 스모크 테스트(The Smoke Test): 결과가
None이 아닌지만 확인하고, 실제적인 단언(assertion)은 결여되어 있습니다.
저는 두 가지 테스트 스위트(suite)를 대상으로 이를 실행해 보았습니다.
첫 번째 스위트는 구현을 그대로 반영하도록 설계되었습니다. 미러 비율(mirror-ratio)은 50.0%를 기록했습니다. CI는 실패했습니다. 테스트의 절반이 독립적인 신호를 전혀 전달하지 못했습니다.
두 번째 스위트는 정직했습니다. 부정적인 케이스(negative cases)와 독립적인 기대치를 사용했습니다. 미러 비율은 0.0%를 기록했습니다. CI는 통과했습니다.
미러 비율은 버그 발생률을 측정하는 것이 아닙니다. 독립적인 신호가 얼마나 누락되었는지를 측정합니다. 이는 통과된 CI 중 얼마나 많은 부분이 단순히 코드의 동작에 무비판적으로 동조하고 있는지를 알려줍니다.
테스트가 구현과 동일한 잘못된 결과를 계산한다면, 테스트는 계속 초록색으로 남습니다. 만약 테스트가 실제 계약(contract)을 단언한다면, 테스트는 빨간색으로 변하며 버그를 잡아낼 것입니다.
커버리지(coverage)만 보지 마십시오. 테스트가 실제로 타당한 이유로 실패할 수 있는지 자문해 보십시오.
Source: https://dev.to/alex_spinov/audit-ai-generated-tests-half-of-green-ci-proves-nothing-4bmb
Optional learning community: https://t.me/GyaanSetuAi
