2017-11-26 10 views
2

Android Gradle Plugin 3.0.0을 사용하고 있습니다.Jacoco가 Android 프로젝트에서 유닛 테스트를 통해 Kotlin 클래스의 0 커버리지를보고했습니다.

자바에서 kotlin으로 Android 앱을 이전하려고합니다. 내 응용 프로그램은 Java 및 Kotlin의 클래스를 가지고 있으며 테스트는 Java로되어 있습니다.

./gradlew clean jacocoTestReport입니다.

단위 테스트 (src/test)와 계측 테스트 (src/androidTest)를 모두 실행합니다.

app/build/reports/jacoco/jacocoTestReport/html/index.html에 jacoco가 작성한 보고서에는 실제로 단위 테스트에서 다루는 Kotlin 클래스의 적용 범위가 나와 있지 않습니다.

이 보고서는 계측 테스트에서 올바르게 적용 범위를 보여줍니다.

참고 : 나는 정확히 같은 문제가되지 않습니다 이러한 다른 질문 건너 온 :

관련 부분 :

apply plugin: 'jacoco' 
apply plugin: 'kotlin-android' 
apply plugin: 'kotlin-kapt' 
... 
android { 
    defaultConfig { 
     sourceSets { 
      main.java.srcDirs += "$projectDir/src/main/kotlin" 
     } 
    } 

    testOptions { 
     unitTests { 
      all { 
       jvmArgs '-noverify', '-ea' 
      } 
      includeAndroidResources = true 
     } 
    } 
} 

dependencies { 
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 
    .... 
} 

jacoco { 
    toolVersion '0.7.9' 
} 

task jacocoTestReport(type: JacocoReport, dependsOn: ["testDebugUnitTest", "createDebugCoverageReport"]) { 
    reports { 
     html.enabled = true 
    } 
    classDirectories = fileTree(
      dir: "${buildDir}", 
      includes: ["tmp/kotlin-classes/debug/ca/rmen/android/poetassistant/**/*.class", 
         "intermediates/classes/debug/ca/rmen/android/poetassistant/**/*.class"], 
      excludes: ["**/R.class", "**/R*.class", "**/Manifest.class", "**/Manifest*.class", "**/BuildConfig.class", 
         // ignore databinding generated code: 
         "**/ca/rmen/android/poetassistant/databinding/*.class", 
         ... other excludes ... 
         "**/ca/rmen/android/poetassistant/BR.class", 
         "**/com/android/**/*.class"]) 
    sourceDirectories = files("${project.projectDir}/src/main/java", "${project.projectDir}/src/main/kotlin") 
    executionData = fileTree(
      dir: "${buildDir}", 
      includes: [ 
        "jacoco/testDebugUnitTest.exec", 
        "outputs/code-coverage/connected/*coverage.ec" 
      ]) 
} 

답변

3

나는 다음과 같이 jacoco 보고서를 만들 단위 테스트에 의해 코 틀린 클래스의 범위를 반영하기 위해, 내 Gradle을 파일에 includeNoLocationClasses = true을 추가했다 :

android { 
    testOptions { 
     unitTests { 
      all { 
       jvmArgs '-noverify', '-ea' 
       jacoco { 
        includeNoLocationClasses = true 
       } 
      } 
      includeAndroidResources = true 
     } 
    } 
} 

참고 :이 솔루션은 명령 줄에서 테스트를 실행하기위한 작동하지만, 안드로이드 스튜디오 내부에서 적용 범위 실행할 때 난 아직도 0 % 적용 범위를 얻을.