리팩터링 가이드
이 문서는 리팩터링을 수행하는 동안 고려해야 할 기법과 모범 사례의 모음입니다.
테스트 핀 지정
테스트 핀 지정은 리팩터링 대상 엔터티의 출력물 또는 동작을 의도치 않게 변경하지 않도록 보장하는 데 도움이 됩니다. 이는 소비자가 해당 버그를 암시적으로 의존할 수 있기 때문에 기존의 버그 있는 동작을 보존하는 데도 포함됩니다.
예제 단계
- 리팩터링 대상에 대한 가능한 입력을 모두 식별합니다(예: 템플릿에 삽입되는 것이나 조건부로 사용되는 것).
- 각 가능한 입력에 대해 중요한 가능한 값 확인합니다.
- 각 유용한 결합 값에 대해 상세한 스냅샷을 저장하는 테스트를 생성합니다. 이는 현재 동작을 ‘핀’ 지정했다는 것을 보장해야 합니다. 이 스냅샷은 스크린샷, HTML 덤프 또는 디버깅 문에서의 목록일 수 있습니다.
- 리팩터링을 시작하기 전에 코드에 대해 모든 테스트 핀 지정을 실행합니다(Oracle).
- 리팩터링을 수행합니다(또는 작업이 완료된 커밋을 확인합니다).
- 리팩터링 후 코드에 대해 다시 모든 테스트 핀을 실행합니다(Pin).
- Oracle과 Pin을 비교합니다. Pin이 다르면, 리팩터링이 기존 동작을 보존하지 않음을 알 수 있습니다.
- 리팩터링이 완료될 때까지 이전 세 가지 단계를 필요에 따라 반복합니다.
예제 커밋 기록
테스트를 추가하거나 제거하는 커밋을 남겨 다른 사람이 테스트의 결과를 확인하고 검증할 수 있도록 합니다.
AAAAAA Add pinning tests to funky_foo
BBBBBB Refactor funky_foo into nice_foo
CCCCCC Remove pinning tests for funky_foo
그런 다음 MR에서 테스트 핀을 실행하는 방법에 대한 검토자에게 지침을 남길 수 있습니다. 예:
먼저 테스트를 제거하는 커밋을 되돌립니다.
git revert --no-commit $(git log -1 --grep="Remove pinning test for funky_foo" --pretty=format:"%H")
그런 다음 테스트를 실행하십시오.
yarn run jest path/to/funky_foo_pin_spec.js
핀을 초록색으로 유지하기
리팩터링이 100% 순수하게 이루어지는 것은 어렵습니다. 이는 모든 것을 절대로 포착하는 핀이 미미하고 예상된 차이로 실패할 수 있다는 것을 의미합니다. 예상된 변경사항으로 핀을 정리하여 핀을 초록색으로 유지하려고 노력하세요. 이렇게 하면 다른 사람들이 리팩터링이 안전했음을 빠르게 확인할 수 있습니다.