Kluever Maneuver - 버그 동작을 통과하는 테스트로 기록한 뒤 두 커밋으로 수정하기

1 day ago 8

버그 수정을 두 커밋으로 나누는 기법으로, 먼저 잘못된 현재 동작을 확인하는 통과 테스트를 작성하고 다음 커밋에서 코드와 테스트의 기대값을 함께 수정함 목적은 버그가 실제로 수정됐다는 증거를 남기면서도 모든 커밋에서 CI 통과 상태를 유지하는 것임 수정 코드와 테스트를 한 커밋에 추가하면, 테스트가 수정 전에도 통과했는지 놓칠 수 있어 효과 없는 수정에 잘못된 확신을 줄 수 있음 나이 계산 사례에서는 연도 차이만 계산하는 오류를 재현한 뒤, 비교 연산자가 아니라 실제 나이 계산을 고치고 테스트의 기대 결과도 뒤집음 버그 추적기에 문제를 등록하고 첫 커밋에서 버그를 참조, 두 번째 커밋에서 수정 완료를 기록하는 방식을 권장함 두 커밋으로 버그 재현과 수정 연결하기 첫 커밋에서는 버그가 있는 동작을 그대로 확인하는 통과 테스트를 작성하고, 두 번째 커밋에서는 버그와 테스트를 함께 고침 add(a, b)가 a + b + 1을 반환한다면 먼저 assert add(2, 2) == 5로 현재의 잘못된 동작을 기록함 다음 커밋에서 구현을 a + b로 바꾸고 테스트 기대값도 4로 수정함 이 방식은 수정 전후의 동작 차이를 보여주면서 각 커밋의 CI가 계속 통과하도록 함 코드 수정과 테스트를 한 커밋에 추가하는 방식에서는 테스트가 수정 전에도 통과했을 수 있음 이 경우 실제로 버그를 고치지 못했어도 새 테스트가 잘못된 확신을 줄 수 있음 이름은 이 기법을 알려준 동료 Kurt Kluever 에서 따옴 Kluever는 이를 보통 “terrible tests”라고 부르며, 잘못됐음을 알면서도 그 동작을 단언하는 테스트를 작성하도록 요청함 나이 확인 예제와 버그 추적 연도 차이만 계산하는 나이 확인은 생일이 지나지 않은 사람도 18세로 처리할 수 있음 age_in_years가 today.year - birthday.year를 반환하고 can_access가 18 <= age_in_years(...)로 접근을 허용하는 경우임 2008년 12월생은 2026년 10월에 아직 18세가 아니지만 이 계산으로는 18세가 됨 조건을 18 <=에서 18 <로 바꾸는 수정은 나이 계산 오류를 해결하지 못함 2007년 1월 1일생이 2026년 1월 1일에 접근할 수 있는지 확인하는 테스트는 수정 전후 모두 통과함 따라서 이 테스트로는 제안한 수정이 실제 버그를 해결했는지 확인할 수 없음 Kluever Maneuver를 적용하면 먼저 2...

Read Entire Article




피플앤툴즈 네트워크
🛍 샵