有没有一种方法可以指定只在Rust中的测试中活动的Assert?

6kkfgxo0  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(46)

我正在实现一个具有内部不变量的数据结构,我想通过测试来覆盖它。这个不变量是数据结构的一部分;因此,如果正确实现,它永远不会被数据结构用户的任何操作序列所破坏,但我显然仍然希望它被测试。
目前,我只是使用debug_assert!来测试不变量,我的代码看起来像这样:

fn test_invariant(&self) -> bool { 
    // some computations
}

fn some_algorithm(&self) {
    // some code

    debug_assert!(self.test_invariant());

    // more code
}

字符串
然而,由于test_invariant在计算上有些昂贵,并且永远不应该在用户代码中触发,所以我希望Assert只在我自己的测试中活动。此外,不变量是算法的一部分,因此Assert不能轻易地移动到单元测试中(你可以认为它是在实现堆排序的就地版本时测试堆不变量)。

gzjq41n4

gzjq41n41#

正如所写的那样,test_invariant方法只会在调试版本中被调用。也就是说,参数中的表达式在非调试版本中根本不会被计算,这与debug_assert是函数而不是宏时的行为不同。这通常是人们想要的,因为生产二进制文件将是发布版本,测试使用调试。
如果你担心运行调试版本的代码速度太慢,不切实际,你可以创建自己的宏,它是有条件定义的,这取决于你是否在测试中:

macro_rules! test_assert {
    ($($tt: tt)*) => { 
        #[cfg(test)]
        assert!($($tt)*)
    }
}

字符串
test_assert!宏的行为就像debug_assert!一样,除了只在测试中做任何事情。
不过,通常情况下,如果测试Assert在可能的情况下显式地完成,情况会更清楚。

相关问题