Coverage가 갑자기 떨어져습니다?!?

이 글은 Why did my coverage just drop?! 을 번역한 글입니다


업그레이드 이후, 실질적인 코드 변동이 없음에도 불구하고 분석 결과 Coverage 지표가 현저하게 떨어지는 현상 때문에 일부 사용자들이 놀랐습습니다. 믿지 않으실 수 있겠지만, 이는 버그가 아니라 기능의 추가로 인한 것입니다. 이 기능은 실행 가능한 라인(Executable Lines)라고 부릅니다.

Executable Lines는 새롭게 도입된 메트릭으로써, 하나의 파일에서 단위 테스트에 의해 실행되는 코드 라인의 수를 의미하며 coverage percentage 결과에 많은 영향을 줍니다 – 이 지표는 total coverage 계산 시의 분모로 활용되기 때문입니다. 이해를 돕기 위해 100라인의 코드를 각각 가진 두 개의 파일이 있다고 가정해보겠습니다. A 파일은 단위 테스트로 완전히 커버되었고, B 파일은 단위 테스트가 없는 상태입니다. Coverage 엔진은 (엔진에 따라 다를 수 있지만) 아마도 파일 A 만을 대상으로 coverage 정보를 수집해 coverage 100%로 계산을 할 것입니다. Executable Lines 메트릭을 도입하기 이전에는 coverage report에 의존해 coverage를 계산해야 했으므로, 실제 coverage는 50%임에도 불구하고 두 파일에 대해 coverage 100%로 결과를 표시했습니다. Executable Lines 메트릭을 사용함으로써, coverage report에 누락된 파일들의 정보를 모아 보다 실질적인 coverage 지표를 계산할 수 있게 되었습니다.

실질적인 coverage 지표는 coverage 값이 존재하지 않는 프로젝트의 경우에도 매우 중요합니다. 프로젝트 레벨에서 볼 때, Executable Lines 도입을 통해 coverage 정보가 '-'에서 '0%'로 표시됩니다. 해당 프로젝트의 품질 게이트는 이미 coverage 지표를 무시하도록 설정되어 있을 것이므로, 실질적인 차이는 없을 것입니다. 그러나 해당 프로젝트를 포트폴리오어플리케이션 레벨로 통합하게 되면, 단위 테스트가 전혀 존재하지 않는 프로젝트의 존재유무를 알 수 있게 됩니다.

이 시점에서 굳이 새로운 메트릭이 필요한지에 대한 궁금증을 가지실 수 있을 겁니다. 그냥 Lines of Code를 사용해도 충분하지 않은가?하고 말입니다. 그것은 코든 코드 라인이 실행 가능하지는 않기 때문입니다. 예를 들면 중요한 하나의 구문(a statement)이 Line of Code에 포함될 수는 있지만, 단위 테스트에 의해 커버해야 하는(혹은 커버할 수 있는) 필요는 없을 수 있기 때문입니다. 클래스 선언(class declarations), 인터페이스 선언(interface declarations), 변수 선언(variable declarations) 등도 이에 포함도리 수 있습니다. 실제로 우리는 developer guide를 통해 Lines of Code에는 해당하지만 Executable Lines에는 해당하지 않는 코드 종류에 대해 언급해 왔습니다.

물론, 이로 인한 사이드 이펙트도 존재합니다. 우선 SonarQube의 coverage percentage가 여러분이 사용하는 coverage report의 그것과 일치하지 않을 수 있습니다. 기존의 coverage report는 위에서 언급한 바와 같이 일부분적인 관점에서 생성되었기 때문입니다. 이와 함께, 기존 coverage report가 코드 베이스의 특정 부분을 무시하도록 설정해 둔 경우라 할지라도... SonarQube는 해당 부분을 무시하지 않게 되므로, 해당 부분을 무시하도록 exclusions 설정을 한차례 추가로 수행해 주셔야 합니다.

최신 SonarQube를 사용하는 경우, 아래 기술할 각 언어 분석기의 최신 버전은 Executable Lines 메트릭을 지원합니다. 혼란스러울 수 있는 부분은 이들이 분석기를 업그레이드 하는 것이 아니라, 플랫폼을 업그레이드 한다는 점입니다. 하지만 릴리스 되는 모든 플랫폼은 릴리스 당시 최신의 분석기를 포함하므로, 마이그레이션은 자동으로 이루어질 것입니다.

Executable Lines 메트릭을 지원하는 구체적인 분석기 엔진 버전은 아래와 같습니다:

  • SonarC# 6.0
  • SonarCFamily 4.9
  • SonarJava 4.4
  • SonarJS 2.20
  • SonarPHP 2.9.2
  • SonarPLSQL 3.0
  • SonarPython 1.9
  • SonarSwift 2.1

위에 기술되지 않은 다른 분석기 역시 "곧" Executable Lines 메트릭을 지원할 예정입니다.

© 2017-2018 Moses Kim.

별도의 언급이 없는 한, 이 스페이스의 컨텐츠는 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
SONARQUBE는 SonarSource SA의 트레이드 마크입니다. 모든 트레이트 마크 및 저작권은 각 소유자의 소유물입니다.

::: SonarQube 관련 문의 : 이메일 :::