我可以为无效的生命周期编写测试吗?

时间:2014-10-30 22:51:38

标签: testing rust

我正在编写一些操作原始指针的Rust代码。然后,这些原始指针通过使用ContravariantLifetime的结构向用户公开,以将结构的生命周期与我的对象联系起来。

我希望能够编写测试来验证面向用户的结构不能比我的对象更长寿。我有以下代码:

fn element_cannot_outlive_parts() {
    let mut z = {
         let p = Package::new();
         p.create() // returns an object that cannot live longer than p
    };
 }

这无法编译,这正是我想要的。但是,我想进行一些自动检查,即使我对代码进行了任何重构,这种行为也是如此。

目前我最好的想法是使用此代码编写一次性Rust文件并装配bash脚本以尝试编译它们并查找特定的错误消息,这些都感觉非常hacky。

2 个答案:

答案 0 :(得分:2)

Rust项目有一组特殊的测试,称为“编译 - 失败”测试,它们可以完全满足您的需求。

compiletest crate是对这个想法的提取,允许其他库做同样的事情:

fn main() {
    let x: (u64, bool) = (true, 42u64);
    //~^ ERROR mismatched types
    //~^^ ERROR mismatched types
}

中途的一个想法就是使用Cargo的“功能”。

使用功能标志指定测试:

#[test]
#[cfg(feature = "compile_failure")]
fn bogus_test() {}

将此添加到Cargo.toml:

[features]

compile_failure = []

运行测试
cargo test --features compile_failure

显而易见的是,自动检查“它是否是正确的失败”。如果不出意外,这使我可以在我的代码库中进行半生活测试。

答案 1 :(得分:-3)

您可以注释您希望失败的测试。

#[should_fail]

因此,您可以编写一个试图破坏其应有的生命周期的测试,从而失败,这实际上是一个过程。

有关索引越界的测试示例'见下文(从Rust guides拉出来)

#[test]
#[should_fail]
fn test_out_of_bounds_failure() {
    let v: &[int] = [];
    v[0];
}

我相信这个例子是一个编译错误,所以它也可以理解你的编译生命周期违规错误。