naver/cover-checker

OpenCppCoverage의 cobertura 리포트 사용 시 커버리지 측정 문제

Closed this issue · 7 comments

안녕하세요 : )
1.4.1 버전을 릴리즈 해주셔서 감사합니다!

1.4.1 버전으로 #24 이슈를 다시 테스트 해보았는데요.
제가 테스트 한 환경은 이전과 같게 Windows에서 OpenCppCoverage를 사용해서 cobertura 형식의 Report 파일을 산출하였습니다.
해당 케이스에서 이전처럼 Exception이 발생하지는 않지만, 커버리지가 항상 0% 로 측정되는 문제가 있는 것 같습니다.

출력 로그

아래는 실행 시 출력 로그입니다.
BufferMgr.cpp 와 CoreMain.cpp 에서 여러 코드를 수정했지만, 수정한 코드 라인이 0으로 출력되고 있습니다.

18:42:56.200 [main] INFO  (CoverChecker.java:47) Check new line of code coverage by XmlCoverageReportParser
18:42:56.216 [main] INFO  (CoverChecker.java:53) read diff by GithubDiffReader
18:42:56.232 [ForkJoinPool.commonPool-worker-5] INFO  (GithubDiffManager.java:40) get diff video-tech1/P2PCore/338
18:42:56.299 [ForkJoinPool.commonPool-worker-5] INFO  (GithubDiffReader.java:59) get file src/core/BufferMgr.cpp
18:42:56.299 [ForkJoinPool.commonPool-worker-5] INFO  (DiffMapper.java:53) parse diff / Optional[src/core/BufferMgr.cpp]
18:42:56.314 [ForkJoinPool.commonPool-worker-5] INFO  (GithubDiffReader.java:59) get file src/core/CoreMain.cpp
18:42:56.314 [ForkJoinPool.commonPool-worker-5] INFO  (DiffMapper.java:53) parse diff / Optional[src/core/CoreMain.cpp]
18:42:56.346 [main] INFO  (ConsoleReporter.java:28) coverage check result
18:42:56.346 [main] INFO  (ConsoleReporter.java:30) 0/0 100
18:42:57.507 [main] INFO  (CoverChecker.java:61) check result pass

OpenCppCoverage 로 산출 된 cobertura 포멧

아래는 OpenCppCoverage 으로 산출 된 cobertura 포멧의 일부입니다.
일부 내용은 보안을 위해 삭제하였습니다.
UnitTestCoverage_sample.zip

Jenkins cobertura plugin 스크린샷

위 xml 을 사용해서 Jenkins cobertura plugin과 연동 하였을 때, 커버리지가 정상적으로 노출됩니다.

  • image
  • image

시간 되실 때 한번 검토 부탁드리겠습니다.
항상 감사드립니다 : ) 👍

안녕하세요. ㅎㅎ
항상 관심가지고 지켜봐주셔서 감사합니다. 👍

지금 보내주신 자료로 볼 땐, 비교하는 diff 정보와 coverage report 정보가 매치가 안된 것 같습니다.
현재 diff 로 분석한 파일은 BufferMgr.cpp, CoreMain.cpp 인데,
첨부해주신 cobertura report에는 HlsServer.cpp, m3u8Generator.cpp, HlsClient.cpp 만 확인 됩니다. 첨부해주신 zip 파일에서도 비슷한 것 같은데요.
실제 추출된 coverage report 상의 파일과 diff 대상인 파일들과 비교 확인 가능하실까요?

안녕하세요. 확인 감사드립니다 : )

전체 내용을 공개 된 장소에 올리기 어렵다보니, 파일 공유를 위해 네이버 사내망 링크를 공유 드립니다.
: https://works.do/xwwtl6

  • UnitTestCoverage.xml : OpenCppCoverage에서 산출 된 cobertura 포멧의 xml 파일 전체 입니다.
  • PR수정_CoreMain.PNG, PR수정_BufferMgr.PNG : PR에서 변경 된 파일 내용에 대한 스크린샷입니다.
  • HIT-BufferMge.PNG, HIT-CoreMain.PNG : 위 xml 파일로 산출 된 Jenkins cobertura plugin 리포트 내용 중 PR에서 변경 된 부분 HIT 에 대한 스크린샷입니다.

Linux / gcovr 에서는 매우 잘 되는데, 해당 환경에서는 뭔가 매치가 잘 안되는지, 제가 잘못 셋팅한건지 모르겠네요.
참고로 jar 빌드는 Linux(CentOS) 에서 하고, 복사해서 Windows 에서도 사용하고 있습니다.
혹시 추가로 필요한 내용이 있다면 전달 부탁드리겠습니다 : )
저도 확인해 보도록 하겠습니다.

감사합니다. 👍

자료 감사합니다.
윈도우상의 path 구분자(\)와 github에서 제공하는 path 구분자(/)가 달라생기는 문제 같습니다;;;
수정해놓을게요 ㅎㅎ

OpenCppCoverage에서 filename 부분이 달라서 매칭이 안되는 부분이 있었는데요.
OpenCppCoverage의 --substitute_pdb_source_path 옵션을 사용하여 맞춰주니 정상적으로 동작하는 것을 확인 하였습니다.
정말 감사드립니다^^

확인 감사합니다. ㅎㅎ @choi-inkyun

혹시 괜찮으시면 해당 옵션으로 결과물이 어떻게 바뀌는지 간략하게라도 알 수 있을까요?
https://github.com/OpenCppCoverage/OpenCppCoverage/releases/tag/release-0.9.7.0 여기에 나오는 설명만 봤을 때에는 coverage 결과물을 다른 경로에 생성할 수 있다 정도로만 보여서요 ㅎㅎ; 귀찮게 해드려 죄송합니다;;;

@ksmail13 님 안녕하세요.

저희 프로젝트에서는 Windows 서버의 Jenkins에서 빌드 후 OpenCppCoverage를 사용해서 cobertura 리포트를 산출하면 xml 파일에 아래와 같이 filename이 되어 있었습니다.

<class name="LogThread.cpp" filename="Program Files (x86)\Jenkins\workspace\server-pr-build\src\base\LogThread.cpp" line-rate="0" branch-rate="0" complexity="0">

filename이 cover-checker 로그 내용과 달라서 diff가 안되는 것 같아 xml 파일에서 수동으로 filename의 src 이전 부분을 삭제하고 테스트 해보니 cover-checker가 잘 동작하였습니다. 그래서 OpenCppCoverage 실행 시 filename을 조정할 수 있는 옵션을 찾아보았고, 아래와 같은 옵션을 적용하였습니다.

--substitute_pdb_source_path="C:\\Program Files (x86)\\Jenkins\\workspace\\server-pr-build"?"/"

해당 옵션을 적용한 경우 아래와 같이 filename에서 src 이후 부분만 남는 것을 확인 하였습니다.

<class name="LogThread.cpp" filename="src\base\LogThread.cpp" line-rate="0" branch-rate="0" complexity="0">

감사합니다 : )

아 ㅎㅎ 그렇군요. 알려주셔서 감사합니다.
알려주신 내용 참고하여 가이드 수정해놓아야겠네요 ㅎㅎ