AI가 작성한 판단을, AI의 기대값이 아닌 PHP 본연의 답변으로 테스트합니다
요약
AI가 생성한 코드와 기대값(test case)을 사용하는 과정에서 발생할 수 있는 오류를 지적하며, 테스트의 신뢰성을 높이는 방법을 제시합니다. 특히 PHP의 `disable_functions` 목록을 읽는 방식과 WordPress 플러그인 개발 시 대체 부품 사용 및 AI 코딩 도구(Codex)의 피드백 반영 과정을 다룹니다.
핵심 포인트
- AI가 작성한 기대값에 의존하면, 실제 환경과의 괴리로 인해 테스트가 잘못 통과할 수 있습니다.
- PHP `disable_functions` 목록 비교 시, 쉼표 구분 방식 대신 PHP 본연의 방식으로 접근해야 정확합니다.
- WordPress 플러그인 개발 시, 변화하는 핵심 구조를 모방한 '대체 부품'을 사용하여 안정성을 확보했습니다.
- AI 코딩 도구(Codex)가 제시한 재현 절차까지 테스트 케이스에 반영하여 견고함을 높였습니다.
테스트의 기대값은 누가 쓰고 있나요?
제가 직접 만든 WordPress 플러그인 Rapls PDF Image Creator의 코드는 대부분 Claude와 함께 작성했습니다. 테스트도 마찬가지입니다. 그렇게 되면 판단 코드와, 그 판단이 맞는지 확인하는 기대값을 같은 상대방과 동일한 이해를 바탕으로 쓰게 됩니다. 만약 이해가 어긋나 있다면, 코드와 기대값은 같은 방향으로 틀어지고, 테스트는 녹색(성공) 상태로 남습니다.
10월 7일 버전 1.4.25에서, 이를 피하는 형태의 테스트를 하나 추가했습니다. 기대값을 쓰는 것을 포기하고, PHP 본연에게 답을 받게 했습니다.
수정한 부분: disable_functions 읽는 방식
플러그인은 서버에서 putenv()가 비활성화(stop)되어 있지 않은지, disable_functions 목록을 읽어서 확인합니다. 버전 1.4.24까지는, 쉼표로 구분하여 소문자로 비교했습니다.
foreach (explode(',', (string) ini_get('disable_functions')) as $name) {
if ('putenv' === strtolower(trim($name))) {
return false;
...
}
PHP는 이 목록을 반각 공백과 쉼표로 구분하고, 이름은 작성된 그대로 비교합니다. exec putenv는 두 개의 이름으로 존재하며, PUTENV는 아무것도 막지 않습니다. 수정 전 코드는 이 두 가지를 역으로 판단하고 있었습니다.
여기서, 수정 전 코드에 기대값이 있는 테스트가 있었다고 가정해 봅시다. 작성자가 쉼표 구분이라고 생각했다면, 기대값도 쉼표 구분이라는 전제하에 쓰게 됩니다. exec putenv의 줄은 '막혀있지 않다'가 정답으로 적히고, 테스트는 통과합니다.
기대값을 자식 프로세스의 PHP에게 답변받기
1.4.25의 테스트는 다음과 같습니다.
// disable_functions read as PHP reads it: compared with PHP's own answer, in
// a child process started with each list.
foreach (['putenv', 'exec putenv', 'exec,putenv', 'exec , putenv', 'PUTENV',
같은 날인 1.4.31의 테스트는 사정이 달랐습니다.
확인하고 싶었던 것은 WordPress 미디어 화면의 JavaScript에 자신의 스크립트가 어떻게 삽입되는지였습니다. 테스트에는 실제 `media-views.js`가 아니라, “media-views.js가 만드는 것과 같은 형태로 만든 대체 부품”을 사용했습니다.
/**
- The states are stand-ins built the way media-views.js builds them: each
- subclass calls Library.prototype.initialize from its own, and a library
...
이것은 PHP 본체에게 묻는 테스트와는 다릅니다. 대체 부품은 작성 시점의 WordPress 구조를 모방한 것입니다. WordPress 본체의 구조가 바뀌어도, 대체 부품은 변하지 않습니다. 테스트는 변화하기 전의 WordPress에 맞춰져 녹색 상태입니다.
그 때문에 커밋할 때 한 번, WordPress 7.1.3의 실제 미디어 화면 스크립트를 jsdom에 로드하여 확인합니다. 다만, 이 확인 과정은 리포지토리 테스트에는 포함되어 있지 않으므로, 다음에 WordPress가 바뀌어도 자동으로 재실행되지는 않습니다.
또 하나, 이 테스트에는 리뷰에서 나온 지적이 그대로 반영되어 있습니다. 다른 AI(Codex)가 1.4.30을 읽고, “같은 화면에서 다른 플러그인이 이미지 전용 화면을 만들면 PDF가 섞인다”는 재현 절차를 제시했습니다. 이를 테스트의 한 줄에 넣었습니다.
// Codex's repro: a state another plugin adds while the same frame is built, asking for images.
## 다음 자신에게 남기는 메모
- 판단 코드가 기대값과 같은 이해로 작성되면, 벗어나도 녹색 상태를 유지한다.
- 본체(PHP 본체, WordPress 본체)에 답을 요구할 거라면, 기대값을 적지 않고 묻는다.
- 본체에서 사용할 수 없는 도구도 배포물에는 포함되지 않는다.
`tests/`
내에서는 사용 가능한 - 본체에게 물어볼 수 없어 모방한 부품을 쓸 때는, 본체가 바뀌어도 테스트가 알아차리지 못한다는 것을 기억한다.
- 리뷰에서 나온 재현 절차는 테스트의 한 줄로 남긴다.
당신의 테스트 기대값은 코드를 작성한 사람과 같은 머리로 작성되지 않았나요?
평소에는 raplsworks.com에서 WordPress 플러그인 개발이나 Claude Code 관련 글을 쓰고 있습니다.
### Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기