如何用dotnet dotcover test的--dcFilters排除代码覆盖率指定命名空间
dotCover 2020.3.3 版本
--dcFilters 参数正确使用说明 dotCover 的覆盖率过滤逻辑是基于编译后程序集的类全限定名做匹配,不解析本地源代码的文件夹路径,绝大多数规则不生效的问题,本质都是语法格式不对、参数被Shell截断、匹配维度和目标不匹配导致的。
过滤器的固定语法要求
每个过滤项必须严格遵循三段式结构:[过滤动作]:[匹配类型]=[匹配规则]
各部分不可错配的要求:
- 过滤动作:
-代表排除匹配到的内容,+代表将匹配内容纳入覆盖率统计,动作标识必须放在最前,紧跟冒号 - 匹配类型:
- 取*
c*时,代表按类的全限定名称(包含完整命名空间)做匹配 - 取*
a*时,代表按程序集的名称做匹配
- 取*
- 匹配规则:支持
*通配符,可匹配任意长度的字符 - 多个过滤项之间用分号
;分隔,所有过滤内容必须包裹在同一对外层引号内,避免被Shell解析截断
适配你解决方案的可直接套用的命令
结合你给出的项目结构,需要排除三个指定命名空间的完整执行命令为:
dotnet dotcover test \ --dcReportType=HTML \ --dcOutput=./coverage/result.html \ --dcFilters="-:c=AClient.Repository.Extensions.*;-:c=AClient.Repository.Models.*;-:c=AClient.Repository.UnitTests.*"
注意:填写测试项目的排除规则时,不要凭项目文件名主观推断命名空间。你提到的测试项目为
AClient.Repository.UnitTests.csproj,其默认生成的根命名空间为AClient.Repository.UnitTests,需匹配项目内任意.cs文件顶部声明的实际namespace值,才能保证规则命中。
导致规则失效的常见踩坑场景
- 格式顺序颠倒:把排除标识
-放到匹配规则的位置,比如误写为c=-:AClient.Repository.Extensions.*,这类格式会被dotCover判定为无效规则,直接跳过 - 误用文件路径匹配:比如写
-:c=**/Models/**/*.cs这类路径规则,2020.3.3版本的dotCover CLI不解析源代码文件路径,这类规则永远不会触发匹配 - 拆分传递参数:该版本不支持多次传入
--dcFilters参数,后一次传值会直接覆盖前一次的配置,必须把所有过滤规则拼接在同一个参数值字符串内 - 缺少外层引号:在GitLab CI的Shell执行环境下,未加引号的分号会被识别为独立命令的分隔符,最终只有第一个过滤规则生效,后续所有规则都会丢失
- 单靠命名空间匹配测试项目:更稳妥的排除方式是直接按程序集维度过滤,对应增加规则
-:a=AClient.Repository.UnitTests,哪怕后续调整了测试项目的命名空间,也不会出现漏排除的问题
内容的提问来源于stack exchange,提问作者Pooja Arya
相关产品推荐
相关产品推荐

