My Commit-Message Script Has 8 Assertions in --selftest. None of Them Touch the Code That Can Actually Fail.

개요

git_commit.py 스크립트의 테스트 커버리지 분석 결과, 기존 8개의 assertion이 실제 코드의 실패 경로를 테스트하지 못하는 문제점을 발견했으며, 이는 다른 파일들의 테스트 방식과 비교하여 불충분함을 보여준다.

주요 내용

* git\_commit.py의 테스트 불충분성: git_commit.py 스크립트는 subprocess.check_output을 사용하여 git diff와 claude -p를 호출하며, 여기서 발생하는 다양한 실패 경로(타임아웃, 클라이언트 오류, 실행 파일 부재 등)를 테스트하지 못하는 selftest 블록을 가지고 있다.
* 기존 selftest의 한계: git_commit.py의 --selftest 블록은 8개의 assertion만을 포함하며, 이는 AI-attribution 줄을 제거하는 정규식(_STRIP_RE)의 유효성만 검증할 뿐, 실제 외부 의존성(git, claude, 네트워크)에 따른 실패 시나리오를 다루지 않는다.
* 다른 파일과의 비교: publish_devto.py와 server.py는 네트워크 호출이나 서브프로세스 호출을 urllib.request.urlopen 및 자체 헬퍼 함수 (_gh, _dev)로 추상화하고, 이를 stubbing하여 다양한 오류 경로(타임아웃, 자격 증명 누락 등)를 성공적으로 테스트하고 있다.
* 개선 필요성: git_commit.py 역시 subprocess.check_output 호출 부분을 명명된 함수로 분리하고, 해당 함수에 대해 stubbing 및 assertion 테스트를 적용해야 한다.
* 구체적인 해결 방안: git_commit.py의 diff 읽기 및 commit 메시지 생성 로직을 별도의 함수로 추출하고, 다른 파일들처럼 stubbed된 subprocess.check_output을 사용하여 해당 함수의 실패 경로를 테스트하도록 개선해야 한다.

시사점

git_commit.py 스크립트의 테스트 커버리지를 강화하기 위해서는 실제 실패 경로를 포괄하는 테스트 케이스를 추가하고, 코드 구조를 리팩토링하여 테스트 용이성을 확보하는 것이 필요하다.

원문 읽기 →
원문을 불러오는 중...

댓글

GitHub Discussions