如何仅在测试中导入外部crate宏且无编译警告?
解决仅在测试模块导入外部crate宏且无警告的问题
你碰到的这个场景很常见——全局加#[macro_use]会因为主逻辑没用到日志宏触发未使用警告,但去掉全局导入后,测试模块里又找不到debug!这类宏。这里有几个干净的解决方案:
方案一:仅在测试模式下启用全局宏导入
把原来的extern crate声明改成带条件编译的形式,让#[macro_use]只在测试编译时生效:
#[cfg_attr(test, macro_use)] extern crate log; pub fn do_nothing() { let _ = log::Level::Info; } #[cfg(test)] mod tests { #[test] fn test_a() { debug!("Message."); } }
这样主代码编译时不会加载宏导入,自然不会有未使用警告;测试编译时宏会被全局导入,debug!能正常工作。
方案二:在测试模块内按需导入宏
如果不想用全局导入,也可以直接在测试模块里通过use语句导入需要的宏,这种方式更精准:
extern crate log; pub fn do_nothing() { let _ = log::Level::Info; } #[cfg(test)] mod tests { // 按需导入单个宏 use log::debug; // 如果需要多个宏,也可以批量导入:use log::{debug, info, warn}; #[test] fn test_a() { debug!("Message."); } }
这种做法完全避免了全局宏导入的冗余,只在测试模块里引入需要的宏,主代码不受任何影响,也不会有警告。
补充说明
如果你的项目用的是Rust 2018及以后的版本,还可以用use log::*;在测试模块导入所有日志宏,但按需导入的方式更清晰,能明确看到测试里用到了哪些宏,更推荐后者。
这两种方案都能完美解决你的问题:编译无警告,测试宏正常可用。
内容的提问来源于stack exchange,提问作者Dave Challis
相关产品推荐
相关产品推荐

