如何从测试覆盖范围中排除Dagger2类

时间:2017-03-03 10:02:25

标签: android android-studio android-testing jacoco dagger-2

是否有任何选项可以从Android Studio中的测试覆盖率报告中排除Dagger2类

2 个答案:

答案 0 :(得分:13)

JaCoCo排除

如果您正在使用JaCoCo,例如使用Android工具连接测试,则需要配置排除(或包含),根据documentation是......

  

要从报告中排除的类文件列表。可以使用通配符(*和?)。未指定时,不会排除任何内容。

这意味着您需要匹配生成的匕首类名称。以下规则几乎涵盖dagger-compiler生成的任何类,而不匹配任何非生成的类(除非您将类命名为与dagger相同的......):

excludes = [
    '**/*_MembersInjector.class',
    '**/Dagger*Component.class', // covers component implementations
    '**/Dagger*Component$Builder.class', // covers component builders
    '**/*Module_*Factory.class'
]

运行构建后,您可以在app/build/generated/source/apt目录中检查生成的dagger类,以查看是否有任何其他要生成的类与排除项匹配。

排除数组是jacoco插件的配置属性。现在,放置此excludes数组的位置取决于您是基于jacoco插件定义自己的任务,还是使用更高级别的插件'这样做对你来说。例如,使用this plugin(您可以看到插件源以查看实际应用排除的位置):

jacocoAndroidUnitTestReport {
  excludes +=  [
        '**/*_MembersInjector.class',
        '**/Dagger*Component.class',
        '**/Dagger*Component$Builder.class',
        '**/*Module_*Factory.class'
    ]
}

连接测试

如果您通过在 buildType 中设置testCoverageEnabled true来运行Android连接测试覆盖率,那么很遗憾,没有惯用的方式来声明排除,因为android gradle plugin没有提供此类选项,预定义的jacoco report task排除了硬编码。在这种情况下,您必须使用排除编写自己的任务脚本。

IntelliJ测试跑步者

如果您正在使用IntelliJ测试运行器,无论覆盖范围是由IntelliJ还是JaCoCo完成,您都需要将包括用于测试配置。

  1. 打开修改配置窗口:
  2. Edit Configurations

    1. 选择您的测试配置并定义包含(类或整个包)。在这种情况下,我包含了整个com.google.android.gms包,仅作为示例:
    2. Test coverage includes

      排除 dagger生成的文件,最快捷的方法是将所有匕首依赖项放在一个根包中,包含所有其他测试配置中的包。

答案 1 :(得分:3)

更新版本的Dagger会生成具有略微不同模式的其他文件。使用Dagger 2.15时,我取得了以下成功

'**/*_MembersInjector.class',
'**/Dagger*Component*.class',
'**/Dagger*Subcomponent*.class',
'**/*Subcomponent$Builder.class',
'**/*Module_*Factory.class',
相关问题