如何在Rust测试框架中验证代码无法编译?
如何在Rust测试框架中确保代码无法编译
方法一:使用内置的#[compile_fail]测试属性
Rust标准测试框架自带#[compile_fail]属性,专门用来验证某段代码无法通过编译,完全满足你的需求,无需额外创建单独文件。
具体用法如下:
在测试模块中添加带该属性的测试函数,把需要验证的错误代码放在函数内部:
#[cfg(test)] mod tests { use super::*; #[test] #[compile_fail] fn test_dangling_reference_not_compile() { // 放入要验证无法编译的代码 fn invalid_code<'a>() -> &'a i32 { MyBox::new(7).get() } } }
- 运行
cargo test时,这个测试只有在代码编译失败时才会通过;如果代码意外能编译,测试就会失败,正好帮你守住边界。 - 不需要关注错误细节,只要确认代码无法编译即可,属性会自动完成检查。
注意事项:
- 确保测试函数内的代码和主代码的Rust版本、edition一致,避免环境差异导致误判。
- 如果需要精准匹配错误类型,可以在
#[compile_fail]后追加reason = "错误关键词"(比如#[compile_fail(reason = "lifetime")]),不需要的话可以省略。
方法二:使用trybuild crate(适合批量测试)
如果需要批量验证多个错误代码片段,trybuild crate会更高效。它支持直接传入代码字符串,无需创建大量单独文件:
- 在
Cargo.toml的dev-dependencies中添加依赖:
[dev-dependencies] trybuild = "1.0"
- 在
tests目录下创建测试文件(比如compile_tests.rs),编写代码:
use trybuild::TestCases; #[test] fn invalid_codes() { let mut cases = TestCases::new(); // 直接传入错误代码字符串 cases.compile_fail(" use crate::MyBox; fn test<'a>() -> &'a i32 { MyBox::new(7).get() } "); }
运行cargo test后,trybuild会自动验证这段代码是否编译失败,测试通过的前提是代码无法编译。
内容的提问来源于stack exchange,提问作者Aiden4
相关产品推荐
相关产品推荐

