如何从测试覆盖率中排除 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 类的主要内容,如果未能解决你的问题,请参考以下文章