jacoco:对于报告生成,必须在运行时使用相同的类文件

ale*_*.tu 5 java android powermock gradle jacoco

我一直在研究android项目,并使用roboletric和powermock来完成unitTest.

当我跑gradle jacocoTestReport,它会显示

[ant:jacocoReport] Classes in bundle 'app' do no match with execution data. For report generation the same class files must be used as at runtime.
[ant:jacocoReport] Execution data for class com/my/app/MyClass does not match.
Run Code Online (Sandbox Code Playgroud)

我使用powermock来模拟Myclass.java中的静态方法

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@PrepareForTest(MyClass.class)
public class TheTest {

    @Rule
    public PowerMockRule rule = new PowerMockRule();

    @Test
    public void test1() throws Exception {
        PowerMockito.mockStatic(MyClass.class);
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

build.gradle如下所示

apply plugin: 'jacoco'
def coverageSourceDirs = [
         '../app/src/main/java'
]

task jacocoTestReport(type:JacocoReport, dependsOn: "testDebugUnitTest") {
    group = "Reporting"
    description = "Generate Jacoco coverage reports"

    classDirectories = fileTree(
            dir: '../app/build/intermediates/classes/debug',
            excludes: ['**/R.class',
                       '**/R$*.class',
                       '**/*$ViewInjector*.*',
                       '**/BuildConfig.*',
                       '**/Manifest*.*']
    )

    additionalSourceDirs = files(coverageSourceDirs)
    sourceDirectories = files(coverageSourceDirs)
    executionData = files('../app/build/jacoco/testDebugUnitTest.exec')

    reports {
        xml.enabled = true
        html.enabled = true
    }

}
Run Code Online (Sandbox Code Playgroud)

我仍然可以看到覆盖率报告没有失真.

但是如何摆脱这种警告呢?

谢谢.

Aru*_*gal 6

发生这种情况时,您使用的是Java版本X编译类和运行测试(jacoco),但在运行jacocoTestReport任务(在摇篮),你正在使用其他的Java版本也叫Java ÿ.

您是在设置不同的JAVA版本还是使用不同的Gradle(使用不同的JAVA)?你可能会得到一个部分覆盖,当你看到有关类执行数据此警告/错误消息XXX/YYY/ZZZ不匹配,这意味着它会反映覆盖率为0%.

要解决以下问题:

[ant:jacocoReport] Classes in bundle 'app' do no match with execution data. For report generation the same class files must be used as at runtime.
[ant:jacocoReport] Execution data for class com/my/app/MyClass does not match.
Run Code Online (Sandbox Code Playgroud)

确保:

  1. 您运行"gradle clean build"或"gradle integrationTest"或"gradle someKindOfnonUnitTest"(在Tomcat之类的外部容器之后)以及使用jacoco使用jacocoTestReport任务生成覆盖率报告时,您的JAVA版本是相同的.

或者,如果以上没有帮助,

  1. 在运行"gradle jacocoTestReport"时(假设您在工作区中有Unit/NonUnit测试的有效.exec文件),请传递一些命令行开关,如下所示.

例如:

gradle clean build 
gradle ...some..nonUnitTestTask
Run Code Online (Sandbox Code Playgroud)

然后

gradle jacocoTestReport -x test -x testClasses -x compileJava -x classes
Run Code Online (Sandbox Code Playgroud)