리팩토링 가이드
GitLab v19.1이 문서는 리팩토링을 수행하면서 고려할 수 있는 기법과 모범 사례를 모아놓은 자료입니다. 핀닝 테스트는 리팩토링 대상 엔티티의 출력이나 동작을 의도치 않게 변경하지 않았는지 확인하는 데 도움이 됩니다. 리팩토링 대상에 가능한 모든 입력을 파악합니다(예: 템플릿에 주입되거나 조건문에 사용되는 모든 것).
이 문서는 리팩토링을 수행하면서 고려할 수 있는 기법과 모범 사례를 모아놓은 자료입니다.
핀닝 테스트#
핀닝 테스트는 리팩토링 대상 엔티티의 출력이나 동작을 의도치 않게 변경하지 않았는지 확인하는 데 도움이 됩니다. 이는 기존의 버그가 있는 동작을 보존하는 것도 포함하는데, 소비자들이 암묵적으로 해당 버그에 의존하고 있을 수 있기 때문입니다.
예시 단계#
-
리팩토링 대상에 가능한 모든 입력을 파악합니다(예: 템플릿에 주입되거나 조건문에 사용되는 모든 것).
-
각 가능한 입력에 대해, 중요한 가능 값들을 파악합니다.
-
입력별로 유용한 값 조합마다 전체 상세 스냅샷을 저장하는 테스트를 생성합니다. 이렇게 하면 현재 동작을 "핀으로 고정"했다는 것을 보장할 수 있습니다. 스냅샷은 말 그대로 스크린샷, 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
그런 다음 머지 리퀘스트에 핀닝 테스트를 실행하는 방법에 대한 리뷰어 지침을 남길 수 있습니다. 예시:
핀을 제거한 커밋을 먼저 되돌립니다.
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% 순수하기란 어렵습니다. 이는 모든 것을 완전히 캡처하는 핀이 사소하고 예상된 차이로 인해 실패할 수밖에 없다는 것을 의미합니다. 예상되는 변경 사항으로 핀을 정리하여 핀을 녹색으로 유지하도록 노력하세요. 이렇게 하면 다른 사람들이 리팩토링이 안전했는지 빠르게 확인하는 데 도움이 됩니다.
예시:
// funky_foo_pin_spec.js
const cleanForSnapshot = el => {
Array.from(rootEl.querySelectorAll('[data-deprecated-attribute]')).forEach(el => {
el.removeAttribute('data-deprecated-attribute');
});
};
// ...
expect(cleanForSnapshot(wrapper.element)).toMatchSnapshot();