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/

 

JaCoCo를 사용하여 안드로이드 프로젝트 유닛 테스트 커버리지 측정하기

#Android, #Koltin, and #Tesla

www.androidhuman.com

 

다만!! 일부 설정이 제 환경과 다른 부분들이 발생을 하였습니다.

해당 포스팅에서 설정은 다 gradle 파일 안에서 이루어지면 크게 3단계로 나뉘어져 있습니다.

  1. JaCoCo 플러그인 설정
  2. 커버리지 측정 태스크 정의
  3. 커버리지 측정 실행

이 중에서 제 환경에서 다른 부분은 커버리지 측정 태스크 정의 에서 일부 항목이었습니다.

    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 를 사용하는 프로젝트에서는 아래의 항목들이 FlavorBuildType 옵션에 맞춰 설정이 필요하였습니다.

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를 확인합니다. -끝-

+ Recent posts