Android Studio
에서는 간단히 Run ... with coverage
를 통해 Test Coverage를 확인할 수 있습니다.
다만 SonarQube 사용시 Coverage 항목을 위해서는 xml 형태의 Test Coverage Report가 필요하였고요.
그래서 JaCoCo 플러그인을 사용하여 간단히 뽑아볼 수 있었습니다.
아래의 포스팅에 잘 정리가 되어 있어 따라가면 되었고요.
https://www.androidhuman.com/lecture/quality/2016/02/13/jacoco_unit_test_android/
다만!! 일부 설정이 제 환경과 다른 부분들이 발생을 하였습니다.
해당 포스팅에서 설정은 다 gradle 파일 안에서 이루어지면 크게 3단계로 나뉘어져 있습니다.
- JaCoCo 플러그인 설정
- 커버리지 측정 태스크 정의
- 커버리지 측정 실행
이 중에서 제 환경에서 다른 부분은 커버리지 측정 태스크 정의 에서 일부 항목이었습니다.
classDirectories.from = fileTree(
dir: "${buildDir}/tmp/kotlin-classes/debug",
excludes: ['**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*',
'com/android/**/*.class']
)
sourceDirectories.from = files(coverageSourceDirs)
executionData.from = files("${buildDir}/jacoco/testDebugUnitTest.exec")
차이라면 제가 작성한 테스트 프로젝트는 Kotlin 코드만 있었습니다.
그러다 보니 classDirectories
경로가 달랐습니다.
-
dir: "${buildDir}/intermediates/classes/debug",
-
dir: "${buildDir}/tmp/kotlin-classes/debug",
그리고 몇몇 속성이 Deprecated 되었다고 떠서 검색해보니 .from
을 추가하라 하더군요.
그래서 아래 항목들에 .from
이 추가되었습니다.
- classDirectories.from
- sourceDirectories.from
- executionData.from
추가로 Flaovr
를 사용하는 프로젝트에서는 아래의 항목들이 Flavor
와 BuildType
옵션에 맞춰 설정이 필요하였습니다.
ex) Flavor
가 dev이고, BuildType
이 debug일 경우
task coverageReport(type: JacocoReport, dependsOn: 'testDevDebugUnitTest') {
...
classDirectories = fileTree(
dir: "${buildDir}/intermediates/classes/dev/debug",
...
)
...
executionData = files("${buildDir}/jacoco/testDevDebugUnitTest.exec")
...
}
제가 사용한 최종 수정본입니다~
apply plugin: 'jacoco'
jacoco {
reportsDir = file("${buildDir}/reports")
}
task coverageReport(type: JacocoReport, dependsOn: 'testDevDebugUnitTest') {
group = "Reporting"
description = "Generate Jacoco coverage reports"
def coverageSourceDirs = ['src/']
classDirectories = fileTree(
dir: "${buildDir}/intermediates/classes/dev/debug",
excludes: ['**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*',
'com/android/**/*.class']
)
sourceDirectories = files(coverageSourceDirs)
executionData = files("${buildDir}/jacoco/testDevDebugUnitTest.exec")
reports {
xml.enabled = true
html.enabled = true
}
}
빌드 완료 후에 지정된 폴더 밑에 Report 파일이 잘 들어갔는지 확인해봅니다.
SonarQube 사용 중이라면 저 Report 경로를 잡아주면 gradle task 에 추가하면 됩니다.
apply plugin: 'org.sonarqube'
sonarqube {
properties {
...
property "sonar.coverage.jacoco.xmlReportPaths", "build/reports/coverageReport/coverageReport.xml"
}
}
하는 김에 SonarQube 도 다시 돌려봅니다.
> gradlew sonarqube
SonarQube 프로젝트 리스트에서 Coverage를 확인합니다. -끝-