You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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会更高效。它支持直接传入代码字符串,无需创建大量单独文件:

  1. 在Cargo.toml的dev-dependencies中添加依赖:
[dev-dependencies]
trybuild = "1.0"
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:16:01