이론적으로 불가능한 코드 경로를 직접 공격하여 gcov를 종료 할 수있는 관련 기능의 단위 테스트를 도입 할 수 있습니까? 단위 테스트이기 때문에 상황의 "불가능"을 무시할 수 있습니다. 그들은 결코 호출되지 않는 함수를 호출하거나 기본 분기를 포착하기 위해 유효하지 않은 열거 형 값을 전달할 수 있습니다.
그런 다음 NDEBUG로 컴파일 된 코드 버전에서만 테스트를 실행하거나 테스트하는 하네스에서 실행하십시오 테스트 프레임 워크가 지원하는 것이 무엇이든간에 어설 션이 트리거됩니다.
코드에 대한 기능 요구 사항을 포함하는 스펙보다는 코드가 있어야한다고 스펙에서 다소 이상하다고 생각합니다. 특히 테스트가 이러한 요구 사항을 테스트하지 않고 있다는 것을 의미합니다. 이는 요구 사항을 기능적으로 유지하는 데 좋은 이유입니다. 개인적으로 "잘못된 enum 값으로 호출 된 경우 함수는 assert
을 실패하고 발신자는 릴리스 모드에서 유효하지 않은 enum 값을 가진 함수를 호출하지 않아야합니다"라는 사양을 수정하고 싶습니다. " 또는 일부 그러한.
아마도 현재 말하는 모든 스위치 문은 기본 사례가 있어야합니다. 그러나 이것은 코딩 표준이 데드 코드를 도입함으로써 관찰 가능한 동작 (적어도 gcov에서 관찰 가능)을 방해한다는 것을 의미합니다. 코딩 표준이 그렇게해서는 안되기 때문에 가능한 경우 코딩 표준을 기능적 사양에서 고려해야합니다.
실패하면 unhittable 코드를 #if !GCOV_BUILD
에 넣고 gcov의 이점을 위해 별도의 빌드를 수행 할 수 있습니다. 이 빌드는 몇 가지 요구 사항을 충족시키지 못하지만 올바른 코드 분석을 조건으로하면 테스트 스위트가 다른 모든 것을 테스트한다는 확신을 얻을 수 있습니다.
편집 : 당신은 dodgy 코드 생성기를 사용하고 있지만 소스 코드에 주석을 달아 솔루션을 요청할 수도 있습니다. 소스를 변경하는 경우 대부분의 경우 데드 코드를 제거 할 수 있습니까? 생성 된 소스를 변경하는 것이 이상적은 아니지만 필요합니다 ...
는 선이 unhittable 것을 당신이 그렇게 확실하게 무엇? 당신이 그들을 때릴 수 없기 때문에 그것이라면, 당신이 코드 커버리지로 찾으려고하는 것입니다. – doron
@ deus-ex-machina399 : 아니요. 내가 그들을 때리지 못했기 때문이 아닙니다. 그것은 코드의 이해와 분석 때문입니다. 물론, 나는 틀릴 수도 있지만 코드 커버리지 분석을 사용하여 소스 코드에 대한 내 이해를 검증하려고하지는 않습니다. 필자는 테스트 커버리지의 품질을 검증하기 위해 코드 커버리지 분석을 사용하고 있습니다. – jchl
@doron, unhittable해야하는 코드의 한 예는 테스트 인프라의 실패 경로입니다. 물론, 당신은 아마 그런 경로없이 할 수 있지만, 나는 그것들을 가지고있다. –