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

Posted

技术标签:

【中文标题】如何从测试覆盖率中排除 Dagger2 类【英文标题】:How to exclude Dagger2 classes from test coverage 【发布时间】:2017-07-23 09:15:30 【问题描述】:

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

【问题讨论】:

您的意思是由 dagger-compiler apt 或您的模块和组件生成的类?连接测试还是单元测试? 匕首生成的类 【参考方案1】:

JaCoCo 不包括

如果您使用 JaCoCo,例如使用 android 仪器 连接测试,您需要配置 excludes(或包含),根据 @987654321 @是...

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

这意味着您需要匹配生成的匕首类名称。以下规则几乎涵盖了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 目录中生成的匕首类,看看是否有任何其他生成的类要与排除项匹配。

这个excludes数组是jacoco插件的配置属性。现在,将这个excludes 数组放在哪里取决于您是基于 jacoco 插件定义自己的任务,还是使用为您执行此操作的“更高级别的插件”。例如使用this plugin(您可以查看插件源以查看实际应用了排除项的位置):

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

连接测试

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


IntelliJ 测试运行器

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

    打开编辑配置窗口:

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

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

【讨论】:

【参考方案2】:

较新版本的 Dagger 会生成模式略有不同的附加文件。使用 Dagger 2.15 时,我在以下排除方面取得了成功

'**/*_MembersInjector.class',
'**/Dagger*Component*.class',
'**/Dagger*Subcomponent*.class',
'**/*Subcomponent$Builder.class',
'**/*Module_*Factory.class',

【讨论】:

【参考方案3】:

从 AndroidStudio 索引中排除文件

几天后我找到了解决方案:IDE 索引中的排除文件也将它们从 IDE 的代码覆盖率报告中排除。 所以我们需要为所有 codegen 文件(或只有 Dagger/Hilt 文件)创建新的 File-Type,并从索引中排除这个 File-Type。

要实现这一点,您需要:

1。为代码生成文件创建新的文件类型“代码生成”

转到Preferences -> File Types,并添加新的文件类型Codegen

添加此模板(模板将来可能会更改):

*_*Factory.java
*_ComponentTreeDeps.java
*_Factory.java
*_GeneratedInjector.java
*_HiltComponents.java
*_HiltModules.java
*_HiltModules_BindsModule.java
*_HiltModules_KeyModule.java
*_MembersInjector.java
*_ProvideFactory.java
*_SingletonC.java
*_TestComponentDataSupplier.java
BR.java
BuildConfig.java
DataBinderMapperImpl.java
Hilt_*.java
_test_*.java

2。从索引中排除“Codegen”

打开Go to File,选择标签Files,然后点击Filter并取消选中Codegen文件类型。

就是这样!

在此之后,当您将运行具有代码覆盖率的测试(使用 IntelliJ IDEA 运行程序)时,匹配的 Codegen 文件也将从 IDE 中的代码覆盖率报告中排除。


注意:使用这种方法,您无法从 CLI 获得覆盖。如果您需要从 CLI 获取覆盖 - 使用 Jacoco。

【讨论】:

这对我有用!感谢您的提示!

以上是关于如何从测试覆盖率中排除 Dagger2 类的主要内容,如果未能解决你的问题,请参考以下文章

如何从VS2012单元测试中的代码覆盖率分析中排除名称以“.Test”结尾的项目

如何在颤振测试覆盖率中排除文件?

如何从代码覆盖率伊斯坦布尔记者中排除模拟文件

为什么?在单元测试覆盖范围内显示的类即使未在测试目标中添加

如何从覆盖范围中排除文件?

如何使用 isparta 从业力的代码覆盖范围中排除第三方导入(如 jquery)?