코드 커버리지 란 무엇이며 어떻게 측정합니까?


275

코드 커버리지 란 무엇이며 어떻게 측정합니까?

자동화 테스트 코드 범위와 관련하여이 질문을 받았습니다. 자동화 된 도구를 제외하고는 과학보다 예술적인 것 같습니다. 코드 적용 범위를 사용하는 방법에 대한 실제 예가 있습니까?

답변:


242

코드 적용 범위는 자동화 된 테스트가 실행되는 동안 코드의 라인 / 블록 / 아크가 얼마나 많이 실행되는지를 측정 한 것입니다.

코드 범위는 특수 도구를 사용하여 바이너리를 계측하여 추적 호출을 추가하고 계측 된 제품에 대해 전체 자동화 테스트를 실행하여 수집됩니다. 좋은 도구를 사용하면 실행되는 코드의 백분율뿐만 아니라 데이터를 드릴하고 특정 테스트 중에 실행 된 코드 줄을 정확하게 볼 수 있습니다.

우리 팀은 사내 코드 커버리지 도구 인 Magellan을 사용 합니다. .NET 상점 인 경우 Visual Studio에는 코드 적용 범위를 수집하는 통합 도구가 있습니다. 다음과 같은 일부 사용자 정의 도구를 굴릴 수도 있습니다.이 기사에서 설명하는 .

C ++ 상점 인 경우 인텔은 Windows 및 Linux에서 실행되는 도구 를 사용하지만 아직 사용하지는 않았습니다. 또한 GCC를위한 gcov 도구가 있다고 들었지만 이에 대해 아무것도 몰라 링크를 제공 할 수 없습니다.

우리가 그것을 사용하는 방법에 관해서-코드 범위는 각 이정표에 대한 출구 기준 중 하나입니다. 실제로 단위 테스트 (개발 팀의), 시나리오 테스트 (테스트 팀의) 및 결합 된 범위의 3 가지 코드 범위 메트릭이 있습니다.

BTW, 코드 범위는 얼마나 많은 테스트를 수행하고 있는지에 대한 좋은 척도이지만 제품을 얼마나 잘 테스트하고 있는지에 대한 좋은 척도는 아닙니다. 품질을 보장하기 위해 코드 적용 범위와 함께 사용해야하는 다른 메트릭이 있습니다.


40
"품질을 보장하기 위해 코드 적용 범위와 함께 사용해야하는 다른 메트릭이 있습니다." 다른 측정 항목이 무엇인지 말씀해 주시겠습니까?
기병대

Testwell CTC ++ 도 사용할 수 있습니다. C, C ++, C # 및 Java를위한 완벽한 코드 커버리지 도구입니다.
B_PRIEUR

1
@Abdul 코드 범위를 측정 할 때는 두 종류의 테스트를 모두 실행하고 코드 범위를 별도로 측정해야합니다. "아크의 코드"는 if / then과 같은 코드 실행 분기입니다.
Franci Penov 1

1
@Maverick 대부분의 사람들은 코드 범위를 말할 때 단위 테스트를 가정하지만 Microsoft에서는 단위 테스트와 통합 테스트 모두에서 코드 범위를 측정하고있었습니다.
Franci Penov

1
@darth_coder는 일반적으로 아무것도 없습니다. 앱도 자동으로 계측되지 않으며 계측 데이터를 수집하는 것이 없으면 새 앱의 존재 여부는 관련이 없습니다. 영향을 줄 수있는 유일한 경우는 자동화 된 테스트가 실행되는 동시에 앱이 실행되고 테스트 자동화와 동일한 프로세스 내에서 인스트루먼트 된 OS 코드가 실행되어 잠재적으로 일부 OS 코드가 실행중인 것으로 표시되는 경우입니다 테스트에 닿지 않았습니다.
Franci Penov

189

코드 적용 범위는 기본적으로 테스트 중 코드의 양을 테스트합니다. 따라서 코드 적용 범위가 90 % 인 경우 테스트 대상이 아닌 10 %의 코드가 있음을 의미합니다. 코드의 90 %가 적용된다고 생각할 수도 있지만 다른 각도에서 봐야합니다. 100 % 코드 커버리지를 얻는 데 방해가되는 것은 무엇입니까?

좋은 예는 다음과 같습니다.

if(customer.IsOldCustomer()) 
{
}
else 
{
}

위의 코드에는 두 개의 경로 / 분기가 있습니다. 항상 "YES"분기를 치면 else 부분을 덮지 않고 코드 적용 결과에 표시됩니다. 이것은 다루지 않은 것을 알았으므로 else 부분을 다루는 테스트를 작성할 수 있기 때문에 좋습니다. 코드 적용 범위가 없다면 폭발하기 위해 시한 폭탄에 앉아있는 것입니다.

NCover 는 코드 적용 범위를 측정하는 좋은 도구입니다.


5
거의 10 년 전의 가장 좋은 답변! 제길! :)
니 코스

4
간단하고 의미있는 답변 :)
Parveen

예. 말이되는 유일한 것. 비록 아래로 스크롤을 계속 귀찮게하지 않더라도. 내가 멈춘 곳이다. 북마크.
TheRealChx101 2018 년

64

"100 % code-coverage"가 모든 것을 완벽하게 테스트한다는 것을 의미하지는 않습니다. 모든 코드 라인이 테스트되었다는 것을 의미하지만 모든 (일반적인) 상황에서 테스트되는 것은 아닙니다.

코드 커버리지를 사용하여 테스트를 작성해야 할 코드 비트를 강조 표시합니다. 예를 들어, 현재 단위 테스트를 실행하는 동안 myImportantFunction ()이 실행되지 않는 코드 범위 도구가 표시되면 개선해야합니다.

기본적으로 100 % 코드 범위가 코드가 완벽하다는 것을 의미하지는 않습니다. 보다 포괄적 인 (단위) 테스트를 작성하기위한 안내서로 사용하십시오.


1
"100 % 코드 범위"는 모든 것이 완전히 테스트되었다는 의미는 아닙니다. 모든 코드 라인이 테스트되었다는 것을 의미하는 것은 아니며, 모든 상황이 모든 상황에서 테스트되는 것은 아닙니다. 상황 "이 데이터 입력 및 매개 변수와 관련되어 있습니까? 왜 모든 것이 테스트되는지, 왜 완전히 테스트되는지에 대해 이해하는 데 어려움을 겪고 있습니다.
Abdul

20
코드의 모든 줄이 테스트의 특정 시점에서 실행된다고해서 코드가 실행될 수있는 모든 가능한 시나리오를 테스트 한 것은 아닙니다. 방금 가져 와서 x반환 한 함수가 있고 x/xmy_func (2)를 사용하여 테스트를 실행했다면 100 % 적용 범위를 갖지만 (함수 코드가 실행됨에 따라) 0이 매개 변수 일 때 큰 문제를 놓쳤습니다. 즉 , 100 % 적용 범위로도 필요한 모든 시나리오를 테스트 하지 않았습니다 .
steve

단위 테스트 사례가 모든 방법에 대해 작성되지 않은 경우이 상황을 살펴볼 수 있습니다. 코드 범위가 여전히 100 %입니까? stackoverflow.com/questions/43395968/…
Sachin Kumar

52

이전 답변 중 몇 가지를 보완하면 다음과 같습니다.

코드 범위는 테스트 세트가 소스 코드를 얼마나 잘 포함하고 있는지를 의미합니다. 즉, 일련의 테스트 사례에 의해 소스 코드가 어느 정도까지 적용 되는가.

위의 답변에서 언급했듯이 경로, 조건, 기능, 진술 등과 같은 다양한 범위 기준이 있습니다. 그러나 추가 기준은 다음과 같습니다.

  1. 조건 범위 : 모든 부울 표현식이 true 및 false로 평가됩니다.
  2. 의사 결정 범위 : 부울 표현식은 참과 거짓에 대해 한 번만 평가되는 것이 아니라 모든 후속 if-elseif-else 본문을 포함합니다.
  3. 루프 범위 : 가능한 모든 루프가 한 번, 한 번 이상, 0 번 이상 실행되었음을 의미합니다. 또한 최대 제한에 대한 가정이있는 경우 가능하면 최대 제한 시간과 최대 제한 시간을 1 회 이상 테스트하십시오.
  4. 시작 및 종료 범위 : 가능한 모든 통화 및 반환 값을 테스트합니다.
  5. 파라미터 값 범위 (PVC). 매개 변수에 가능한 모든 값이 테스트되었는지 확인합니다. 예를 들어, 문자열은 일반적으로 a) null, b) 비어 있음, c) 공백 (공백, 탭, 줄 바꿈), d) 유효한 문자열, e) 잘못된 문자열, f) 1 바이트 문자열, g ) 2 바이트 문자열 가능한 각 매개 변수 값을 테스트하지 않으면 버그가 남을 수 있습니다. 이 중 하나만 테스트하면 각 라인이 적용되므로 코드 범위가 100 %가 될 수 있지만 7 가지 옵션 중 하나만 테스트됨에 따라 매개 변수 값의 범위는 14.2 %입니다.
  6. 상속 범위 : 객체 지향 소스의 경우 기본 클래스에서 참조하는 파생 객체를 반환 할 때 형제 객체가 반환되는 경우 평가할 커버리지를 테스트해야합니다.

참고 : 정적 코드 분석은 도달 할 수없는 코드 또는 행잉 코드 (예 : 다른 함수 호출에서 다루지 않는 코드)가 있는지 확인합니다. 또한 다른 정적 범위. 정적 코드 분석에서 100 % 코드가 적용된다고보고하더라도 가능한 모든 코드 적용 범위가 테스트 된 경우 테스트 세트에 대한 보고서를 제공하지 않습니다.


2
다른 답변에 대한 멋진 추가
HDave

14

코드 범위는 이전 답변에서 잘 설명되었습니다. 따라서 이것은 질문의 두 번째 부분에 대한 답변입니다.

코드 적용 범위를 결정하기 위해 세 가지 도구를 사용했습니다.

  1. JTest -JUnit에 구축 된 독점 도구입니다. (단위 테스트도 생성합니다.)
  2. Cobertura -JUnit 테스트와 쉽게 결합하여 보고서를 생성 할 수있는 오픈 소스 코드 범위 도구입니다.
  3. Emma- 다른-단위 테스트와는 약간 다른 목적으로 사용했습니다. 최종 사용자가 웹 응용 프로그램에 액세스 할 때 적용 범위 보고서를 생성하는 데 사용되었습니다. 웹 테스트 도구 (예 : Canoo)와 함께 사용하면 일반적인 최종 사용자 사용 중에 얼마나 많은 코드가 적용되는지 알려주는 매우 유용한 범위 보고서를 제공 할 수 있습니다.

우리는 이러한 도구를 사용하여

  • 개발자가 좋은 단위 테스트를 작성했는지 검토
  • 블랙 박스 테스트 중에 모든 코드가 통과되는지 확인

6

코드 적용 범위는 단순히 테스트 된 코드의 척도입니다. 측정 할 수있는 다양한 적용 범위 기준이 있지만 일반적으로 전체 적용 범위를 구성하는 프로그램 내의 다양한 경로, 조건, 기능 및 설명입니다. 코드 적용 범위 메트릭은 이러한 각 적용 범위 기준을 실행하는 테스트의 비율입니다.

프로젝트에서 단위 테스트 적용 범위를 추적하는 방법에 대해서는 정적 코드 분석 도구를 사용하여 추적합니다.


5

Perl의 경우 모듈에서 정기적으로 사용 하는 우수한 Devel :: Cover 모듈이 있습니다.

빌드 및 설치가 Module :: Build에 의해 관리되는 ./Build testcover경우 서브, 라인 및 조건 별 적용 범위를 알려주는 멋진 HTML 사이트를 얻기 위해 간단하게 실행할 수 있습니다 .


1

이전 답변에서 코드 범위는 잘 설명되었습니다. Xcode는 코드 작업 을 테스트하고 모니터링 할 수있는 기능을 제공하면서 플랫폼 iOS과 작업중 인 경우 도구와 관련된 지식을 추가 하고 OSX있습니다.

참조 링크 :

https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/07-code_coverage.html

https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51

둘 다 Xcode를 사용하여 코드 적용 범위를 학습하고 탐색하는 데 유용한 링크입니다.


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