자동화 된 테스트로 레거시 코드를 개선하는 모범 사례


22

비교적 크고 오래된 코드 기반에서 이미 정의 된 인터페이스 (C ++ 헤더 파일 집합)를 다시 구현하는 작업을 수행하려고합니다. 이 작업을 수행하기 전에 가능한 한 완전한 테스트 적용 범위를 갖기를 원하므로 재 구현 오류를 최대한 빠르고 쉽게 감지 할 수 있습니다. 문제는 이미 존재하는 코드베이스가 (매우) 큰 클래스와 함수, 높은 수준의 커플 링, (많은) 부작용이있는 함수 등으로 쉽게 테스트 할 수 있도록 설계되지 않았다는 것입니다.

유사한 작업에 대한 이전의 경험과 자동화 된 테스트 (단위, 통합, 회귀 등)를 레거시 코드로 개조하는 방법에 대한 구체적이고 유용한 팁을 듣는 것이 좋습니다.


1
1 단계 : 검색 스택 오버플로 질문을 받았습니다. 여러 번.
S.Lott

답변:


20

우선, Michael Feathers의 레거시 코드효과적으로 작업하십시오.

그런 다음 몇 가지 참고 사항 :

  • 인터페이스에 대한 정확한 사양 / 계약이 있습니까? 아니면 실제로 "구체화"로 기존 구현 만 가지고 있습니까? 전자의 경우 처음부터 완전히 다시 작성하는 것이 더 쉬우 며, 후자는 불가능하기가 어렵습니다.
  • 인터페이스를 다시 구현하려는 경우 테스트 리소스를 사용하는 가장 유용한 방법은 인터페이스에 대해서만 테스트를 작성하는 것입니다. 물론 이것은 엄격한 의미에서 단위 테스트로 자격이 없지만 기능 / 수락 테스트는 아니지만 순전히 아닙니다 :-) 그러나 이러한 테스트는 재사용 가능하며 두 구현의 결과를 나란히 직접 비교할 수 있습니다 .
  • 전반적으로, 나는 유지 보수 할 수없는 한, 기존 코드를 처음부터 다시 작성하는 대신 리팩토링하는 것을 선호합니다. (이 경우 어쨌든 단위 테스트를 작성하는 방법은 무엇입니까?) 주제에 대한 자세한 내용 은 Joel의이 게시물을 확인하십시오 . 인터페이스에 대해 일련의 승인 테스트를 작성하면 얇지 만 유용한 안전망이 제공되므로 기존 코드를 Feathers 'book의 아이디어를 사용하여 테스트 할 수 있도록 기존 코드를 신중하게 리팩토링 할 수 있습니다.

가능하다면 +3하겠습니다. WELC는 반드시 읽어야하며 리팩토링을 위해 반드시 가야합니다.
Johnsyweb

두 번째 요점에 대한 하나의 작은 의견은 레거시 시스템의 경우 특성화 테스트 사고 방식 에 따라 테스트를 수행해야한다는 것 입니다. 즉, 소프트웨어의 현재 동작을 충실하게 캡처하고 단위 테스트 마인드에 따라 테스트 결과 중 일부가 이상하게 보이거나 만족스럽지 않더라도 동작을 변경하지 마십시오. (이 아이디어는 WELC의 저자로부터 나왔습니다.)
rwong

실제로 @rwong. 자세한 사양이나 지식이 풍부한 제품 소유자가 없으면 개발자가 프로그램의 특정 동작이 의도적이며 필요한지 여부를 결정할 수 없습니다. b) 의도하지 않았지만 이제는 사용자가 의존합니다. c) 버그 실제로 사용자에게 해를 끼친다. d) 지금까지 전혀 눈치 채지 못한 버그. 처음 두 경우 "고정"은 실제로 사용자에게 해를 끼치며 마지막 경우에는 이론적으로는 정확하지만 눈에 띄는 이점이 없습니다.
Péter Török

4

가장 좋은 방법은 Mikado 방법입니다. http://mikadomethod.wordpress.com/2010/08/04/the-mikado-method-book/ 이것은 간단한 기술의 일반 화일 뿐이지 만 큰 코드 기반에서 코드 품질 향상을 시작하는 유일한 방법입니다. 불필요한 위험을 감수하지 않고

WEWLC는 또한 그것에 관한 아주 좋은 책이지만 C ++로 작성된 것이 Java 또는 Ruby 코드에서 항상 유용한 것은 아닙니다.


2

구식 코드 기반에 대한 레트로 피팅 테스트는 디자인이 모 놀리 식인 경우 상당히 어려울 수 있습니다.

가능하다면 (시간 / 돈이 있습니까), 앞으로 나아갈 수있는 한 가지 방법은 코드를 더 테스트 가능한 단위로 리팩터링하는 것입니다.


1

하나의 링크 를 추가하고 싶습니다 . 좀 더 쉬운 xUnit 친화적 인 코드로 리팩토링 된 테스트하기 어려운 구현의 예는 거의 없습니다. 일반적인 접근 방식은 이미 언급 한 링크 (Joel post, 레거시 코드 작업)를 시도하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.