Tarpaulin统计覆盖率将log::info()记为未覆盖,如何忽略日志追踪调用?
Rust tarpaulin 统计覆盖率时自动忽略日志调用的配置方案
不需要逐行给日志调用加#[cfg_attr(tarpaulin, ignore)]属性,以下三种零侵入/低侵入方案都可以实现需求,优先推荐前两种,完全不影响代码可读性:
方案1:编译期剔除日志代码(最干净,无额外维护成本)
默认场景下cargo test运行时虽然不会输出log::info!/log::warn!等日志,但log库默认会保留所有日志调用的生成代码,只是运行时没有绑定日志实现所以不执行,这部分未执行的代码就会被tarpaulin统计为未覆盖。
你可以在tarpaulin构建时通过log库提供的编译开关,直接把不需要统计的日志级别在编译阶段裁掉,这些日志调用根本不会出现在最终生成的测试二进制里,自然不会产生未覆盖记录:
- 直接运行tarpaulin时传入编译参数即可:
RUSTFLAGS="--cfg log_max_level_error" cargo tarpaulin
log库提供的常用编译级别开关如下,可以按需选择:
log_max_level_off:所有级别日志调用全部编译为空,完全不保留log_max_level_error:仅保留error级别日志,info/warn/debug/trace全部被剔除log_max_level_warn:保留warn、error级别,更低级别日志被剔除log_max_level_info:保留info、warn、error级别,debug/trace被剔除
如果不想每次运行都手动输入环境变量,可以在项目根目录新建tarpaulin.toml配置文件,把参数写进去永久生效:
[build] # 按需替换成你需要的级别开关 rustflags = "--cfg log_max_level_error"
方案2:配置tarpaulin行忽略规则(不修改编译逻辑)
如果不想调整编译时的日志级别,可以用tarpaulin自带的行忽略规则,通过正则批量匹配所有日志调用行,自动跳过这些行的覆盖率统计,同样不需要修改业务代码。
在项目根目录的tarpaulin.toml中添加如下配置即可:
[report] # 正则匹配所有log宏调用行,按需调整匹配规则即可 ignore_lines = [ "^\\s*log::(info|warn|debug|trace|error)!\\(", # 如果你用tracing日志库,再加一行匹配规则即可 # "^\\s*tracing::(info|warn|debug|trace|error)!\\(", ]
配置完成后正常执行cargo tarpaulin,所有匹配到的日志行都会被自动排除在覆盖率统计之外。
方案3:封装日志模块统一加全局忽略(适合自定义日志场景)
如果项目中所有日志调用都经过自己封装的统一日志模块(比如src/common/logger.rs),只需要在该模块的头部加一次全局忽略属性即可,不需要逐行标记:
// 放在logger.rs文件最顶部 #![cfg_attr(tarpaulin, ignore)]
该模块下的所有日志相关代码都会被tarpaulin自动跳过统计。
注意:逐行给日志调用加
#[cfg_attr(tarpaulin, ignore)]的方式维护成本极高,新增日志或者调整日志位置时很容易漏加标记,非特殊场景不推荐使用。
内容的提问来源于stack exchange,提问作者Simson
相关产品推荐
相关产品推荐

