기존의 일반 C 프로젝트에 단위 테스트 추가


12

제목이 다 나와 있습니다. 우리 회사는 평범한 C로 작성된 마이크로 컨트롤러 장치에 레거시 펌웨어 프로젝트를 재사용하고 있습니다.

분명히 잘못되고 변경이 필요한 부분이 있으며 C # / TDD 배경에서 비롯됩니다. 기능이 변경되지 않은 상태로 유지되도록 테스트없이 무작위로 리팩터링하는 아이디어가 마음에 들지 않습니다. 또한, 버그를 찾기가 어렵다는 것이 아주 작은 변화 (회귀 테스트를 사용하면 해결 될 것이라고 생각되는 경우)를 통해 많은 경우에 발생하는 것으로 나타났습니다. 이러한 실수를 피하려면 많은주의를 기울여야합니다. 코드 주변의 여러 글로벌을 추적하기는 어렵습니다.

요약:

  • 리팩토링하기 전에 밀접하게 결합 된 기존 코드에 단위 테스트를 어떻게 추가합니까?
  • 어떤 도구를 추천하십니까? (더 중요하지는 않지만 알아두면 여전히 좋습니다)

나는이 코드를 작성하는 데 직접 관여하지는 않지만 (내 책임은 다양한 방법으로 장치와 상호 작용하는 응용 프로그램입니다), 좋은 프로그래밍 원칙을 사용할 수있는 기회가 남아 있다면 좋지 않을 것입니다.

답변:


7

의 사본을 잡아 레거시 코드를 효과적으로 작업을 마이클 깃털에 의해. 그러한 상황을 다루기위한 것입니다. C ++ 및 Java와 같은 OO 언어에 더 초점을 맞추고 있지만 여전히 많은 도움이 될 수 있다고 생각합니다.

그것의 일부 (또는 초기 초안 기사)도 무료로 제공 됩니다 .


+1 감사합니다. 그러나 나는 더 많은 OO 코드로 OO 코드를 리팩토링하는 것이 상당히 좋다고 생각합니다. 내가 모르는 것은 절차 코드를 테스트하고 덜 결합 된 절차 코드로 절차 코드를 리팩터링하는 방법입니다.
Groo

@Groo,이 책은 리팩토링 자체가 아닙니다. 단위 테스트가없는 스파게티 코드를 단위 테스트로 잘 구성된 (스파게티가 적은) 코드로 변환하는 방법에 대해 설명합니다. 이러한 코드는 테스트하기 어렵 기 때문에 테스트 할 수 있도록 먼저 리팩터링해야합니다. 그러나 앞에서 언급했듯이 단위 테스트가없는 리팩토링은 위험하므로 캐치 22 상황입니다. 이 책은 코드를 가장 작고 안전하게 변경하여 단위 테스트를 통해 코드를 커버 할 수 있도록하는 방법을 안내하며, 따라서 코드를 본격적으로 리팩토링하기 시작합니다.
Péter Török

이 책은 좋은 제안이며 OO 언어와 함께 C를 다룹니다.
ThomasW

7

기술적 으로 Péter Török의 답변 에서 Michael Feathers 은 매우 포괄적 일 것입니다. 책을보고 싶지 않다면 3 단계 프로세스를 제안합니다.

  1. 테스트 할 수없는 코드를 검사하고 해당 코드 기능의 작은 부분 을 테스트 가능한 함수로 복제하십시오 . 새로운 함수는 복제하려는 함수와 분명히 동등한 동작을 갖는 것이 중요합니다. 실제로 레거시 코드를 중심으로 단위 테스트 작성을 옹호하는 것이 아닙니다. 따라서 매우 신중하고 범위를 제한해야합니다. 리팩토링에 대한 신뢰를 유지하기 위해.
  2. 새로운 기능에 대한 단위 테스트를 작성하십시오.
  3. 원래 코드를 수정하여 새 함수를 호출하십시오.

이 과정을 몇 번 반복하면 레거시 코드 기반의 품질이 크게 향상되었음을 알 수 있습니다.

도구가 사용되는 한 C ++은 C를 호출 할 수 있으므로 C ++ 단위 테스트 프레임 워크를 사용하여 C 코드를 테스트 할 수 있습니다. 예를 들어, CPPUnit 을 사용하여 프로젝트에서 많은 C 코드를 단위 테스트합니다.


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