programing

코드 커버리지 도구는 어떻게 작동합니까?

itsource 2021. 1. 16. 09:45
반응형

코드 커버리지 도구는 어떻게 작동합니까?


NCover와 같은 코드 커버리지 도구는 코드의 어떤 부분이 실행되고 어떤 부분이 실행되지 않았는지 어떻게 알 수 있습니까?


다음 은 임의 언어에 대한 테스트 커버리지 도구를 구현하는 방법 에 대한 기술 문서입니다 .

우리 회사는이 원칙을 기반으로 Java, C #, C ++, PHP, COBOL, PLSQL 등을위한 테스트 커버리지 도구 제품군을 구축합니다.


NCover FAQ 에서 바로 인용 : NCover는 자동화 된 테스트 과정에서 수행 된 코드의 분기 비율을보고합니다. 각 분기에서 소스 코드를 계측하고 파일에 '적중'포인트를 작성하여이를 달성합니다. 이러한 '적중'포인트는 '적중'되었을 수있는 총 가능한 포인트와 비교됩니다.


나는 이것이 오래된 질문이라는 것을 알고 있지만 여전히 관심이 있다면 오픈 소스 프로젝트 OpenCover를 살펴봄 으로써 .NET 응용 프로그램에 대해 그러한 계측이 어떻게 수행되는지에 대한 예를 볼 수 있습니다 .

OpenCover는 코드의 중요한 지점에 계측 지점을 삽입합니다.

  1. 코드 라인 커버리지의 경우 PDB 파일 에서 가져온 시퀀스 포인트를 사용 합니다.
  2. 분기 커버리지의 경우 점프 대상과 분기 명령 이후의 다음 명령 (즉, 점프 없음)을 계측하여 COND_BRANCH 명령을 계측합니다.
  3. 메서드 계측의 경우 모든 메서드의 첫 번째 명령을 계측합니다.

이러한 모든 규칙은 Mono.Cecil을 사용하여 적절한 지점을 찾고 콘솔 호스트에서 프로파일 러로 전달한 후 CoverageInstrumentation.cpp 에 적용됩니다 .

PartCover에 대한 소스 코드도 사용할 수 있지만 (표시된대로) 따르기가 훨씬 더 어렵지만 코드를 계측하는 위치를 결정하기 위해 PDB의 시퀀스 포인트를 사용합니다.


에서 소스 :

NCover는 .NET Framework 프로파일 러 API를 사용하여 응용 프로그램의 실행을 모니터링합니다. 메서드가 CLR에 의해로드되면 NCover는 IL을 검색하고이를 계측 된 IL 코드로 바꿉니다.

요컨대, Just-In-Time 컴파일에 연결됩니다.

하지만 모든 도구가 동일한 방식으로 작동하는 것은 아닙니다. 다른 도구는 코드가 컴파일 된 후 애플리케이션의 바이트 코드를 수정하여 작동합니다.


코드 커버리지 분석이 활성화 된 상태에서 테스트를 한 번 실행 한 다음 해당 블록 (즉, 범위 블록) 수를 계산하고 테스트중인 프로젝트의 총 블록 수와 비교해야합니다.

기본적인 이유는 가능한 각 코드 블록 조합이 포함되면 모든 코드 경로가 포함된다는 것입니다 1 . 코드 커버리지 숫자에 너무 많은 가중치를 두는 것에 대한 주된 주장은 getter 및 setter와 같은 "쉬운"블록이 실제 값을 제공하지 않고 잘못 될 가능성이 거의 없음은 오류가 발생하기 쉬운 코드 블록만큼 계산된다는 것입니다. .


1) Ira Baxter 가 의견에서 언급 했듯이이 문장의 이전 문구가 잘못되었습니다. 이에 대한 토론에 대한 의견을 읽으십시오.

참조 URL : https://stackoverflow.com/questions/3051563/how-do-code-coverage-tools-work

반응형