如何从测试范围中排除 Dagger2 类
How to exclude Dagger2 classes from test coverage
是否有任何选项可以将 Dagger2 类 从 Android Studio
的测试覆盖率报告中排除
JaCoCo 排除
如果您正在使用 JaCoCo,例如使用 android 检测 连接测试 ,您需要配置 excludes (或包括),根据 documentation 是...
A list of class files to exclude from the report. May use wildcard characters (* and ?). When not specified nothing will be excluded.
这意味着您需要匹配生成的匕首 class 名称。以下规则几乎涵盖了 dagger-compiler
生成的任何 class,而不匹配任何非生成的 classes(除非您将 class 命名为与 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
目录中检查您生成的匕首 classes,看看是否有任何您想要的额外生成的 classes与排除相匹配。
这个excludes数组是jacoco插件的一个配置属性。现在,将此 excludes
数组放在哪里取决于您是基于 jacoco 插件定义自己的任务,还是使用 'higher level plugin' 为您完成此任务。例如使用 this plugin(您可以查看插件源以查看实际应用排除项的位置):
jacocoAndroidUnitTestReport {
excludes += [
'**/*_MembersInjector.class',
'**/Dagger*Component.class',
'**/Dagger*Component$Builder.class',
'**/*Module_*Factory.class'
]
}
连接测试
如果您通过在 buildType 中设置 testCoverageEnabled true
来 运行 android 连接测试覆盖率,不幸的是没有惯用的方法来声明 excludes,因为 android gradle plugin doesn't provide such options, and the predefined jacoco report task 具有硬编码的排除项。在这种情况下,您必须使用 excludes.
编写您自己的任务脚本
IntelliJ 测试运行器
如果您使用的是IntelliJ测试运行器,无论覆盖是由IntelliJ还是JaCoCo完成,您都需要为测试配置添加includes。
- 打开编辑配置 window:
- 选择您的测试配置并定义包含(classes 或整个包)。在这种情况下,我包含了整个
com.google.android.gms
包,例如:
要排除 dagger生成的文件,最快的方法是把所有的dagger依赖放在一个根包里,include所有的其他 个包在测试配置中。
较新版本的 Dagger 会生成模式略有不同的附加文件。使用 Dagger 2.15
时,我成功排除了以下问题
'**/*_MembersInjector.class',
'**/Dagger*Component*.class',
'**/Dagger*Subcomponent*.class',
'**/*Subcomponent$Builder.class',
'**/*Module_*Factory.class',
从 AndroidStudio 索引中排除文件
很多天后我找到了解决方案:exclusion files from IDE index also exclude them from IDE's code coverage report.
因此我们需要为所有代码生成文件(或仅 Dagger/Hilt 文件)创建新的文件类型,并从索引中排除该文件类型。
为此你需要:
1。为 codegen-files
创建新的文件类型 'Codegen'
转到 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 运行ner)时,匹配的代码生成文件也将从 [中的代码覆盖率报告中排除=52=].
注意:使用此方法无法从 CLI 获得覆盖。如果您需要从 CLI 获得覆盖 - 使用 Jacoco。
是否有任何选项可以将 Dagger2 类 从 Android Studio
的测试覆盖率报告中排除JaCoCo 排除
如果您正在使用 JaCoCo,例如使用 android 检测 连接测试 ,您需要配置 excludes (或包括),根据 documentation 是...
A list of class files to exclude from the report. May use wildcard characters (* and ?). When not specified nothing will be excluded.
这意味着您需要匹配生成的匕首 class 名称。以下规则几乎涵盖了 dagger-compiler
生成的任何 class,而不匹配任何非生成的 classes(除非您将 class 命名为与 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
目录中检查您生成的匕首 classes,看看是否有任何您想要的额外生成的 classes与排除相匹配。
这个excludes数组是jacoco插件的一个配置属性。现在,将此 excludes
数组放在哪里取决于您是基于 jacoco 插件定义自己的任务,还是使用 'higher level plugin' 为您完成此任务。例如使用 this plugin(您可以查看插件源以查看实际应用排除项的位置):
jacocoAndroidUnitTestReport {
excludes += [
'**/*_MembersInjector.class',
'**/Dagger*Component.class',
'**/Dagger*Component$Builder.class',
'**/*Module_*Factory.class'
]
}
连接测试
如果您通过在 buildType 中设置 testCoverageEnabled true
来 运行 android 连接测试覆盖率,不幸的是没有惯用的方法来声明 excludes,因为 android gradle plugin doesn't provide such options, and the predefined jacoco report task 具有硬编码的排除项。在这种情况下,您必须使用 excludes.
IntelliJ 测试运行器
如果您使用的是IntelliJ测试运行器,无论覆盖是由IntelliJ还是JaCoCo完成,您都需要为测试配置添加includes。
- 打开编辑配置 window:
- 选择您的测试配置并定义包含(classes 或整个包)。在这种情况下,我包含了整个
com.google.android.gms
包,例如:
要排除 dagger生成的文件,最快的方法是把所有的dagger依赖放在一个根包里,include所有的其他 个包在测试配置中。
较新版本的 Dagger 会生成模式略有不同的附加文件。使用 Dagger 2.15
时,我成功排除了以下问题'**/*_MembersInjector.class',
'**/Dagger*Component*.class',
'**/Dagger*Subcomponent*.class',
'**/*Subcomponent$Builder.class',
'**/*Module_*Factory.class',
从 AndroidStudio 索引中排除文件
很多天后我找到了解决方案:exclusion files from IDE index also exclude them from IDE's code coverage report.
因此我们需要为所有代码生成文件(或仅 Dagger/Hilt 文件)创建新的文件类型,并从索引中排除该文件类型。
为此你需要:
1。为 codegen-files
创建新的文件类型 'Codegen'转到 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 运行ner)时,匹配的代码生成文件也将从 [中的代码覆盖率报告中排除=52=].
注意:使用此方法无法从 CLI 获得覆盖。如果您需要从 CLI 获得覆盖 - 使用 Jacoco。