使用#[rstest]时cargo build失败,如何正确组织代码?
解决rstest在cargo build时找不到依赖的问题
出现这个问题的核心原因是:你把测试相关代码(use rstest::rstest和#[rstest]标注的测试函数)放到了主程序代码中,而rstest默认是作为dev依赖添加的——cargo build编译主程序时不会引入dev依赖,自然找不到rstest;但cargo test会自动包含dev依赖,所以测试能正常运行。
下面是两种解决方案,优先推荐第一种:
方案一:将测试代码分离到专属测试模块(推荐)
把所有测试逻辑放到带有#[cfg(test)]标记的模块中,这样只有执行cargo test时才会编译这段代码,cargo build会直接忽略它。
示例代码(main.rs):
fn main() { // 你的主程序业务逻辑 println!("Hello, world!"); } // 测试模块,仅在测试模式下编译 #[cfg(test)] mod tests { // 引入rstest宏 use rstest::rstest; // 参数化测试示例 #[rstest] #[case(2, 3, 5)] #[case(10, 20, 30)] fn test_add(#[case] a: i32, #[case] b: i32, #[case] expected: i32) { assert_eq!(a + b, expected); } }
对应的Cargo.toml只需保留dev依赖:
[dev-dependencies] rstest = "0.17.0" # 替换为最新版本号
方案二:将rstest设为普通依赖(不推荐)
如果你的主程序代码确实需要用到rstest的功能(这种场景极少,rstest本质是测试工具),可以把它添加到普通依赖中:
[dependencies] rstest = "0.17.0"
这样cargo build和cargo test都能找到依赖,但会增加最终二进制包的体积,因此仅在必要时使用。
内容的提问来源于stack exchange,提问作者Reinhard
相关产品推荐
相关产品推荐

