我正在实现一个具有内部不变量的数据结构,我想通过测试来覆盖它。这个不变量是数据结构的一部分;因此,如果实现得当,数据结构用户的任何操作序列都不会违反它,但我显然仍然希望对其进行测试。
目前,我只是使用
debug_assert!
来测试不变量,我的代码如下所示:
fn test_invariant(&self) -> bool {
// some computations
}
fn some_algorithm(&self) {
// some code
debug_assert!(self.test_invariant());
// more code
}
但是,由于
test_invariant
的计算成本较高,并且永远不应该在用户代码中触发,因此我希望断言仅在我自己的测试中处于活动状态。此外,不变量是算法的一部分,因此不能轻松地将断言转移到单元测试(您可以将其视为在实现就地版本的堆排序时测试堆不变量)。用 Rust 可以做到吗?
如所写,
test_invariant
方法只会在调试版本中调用。这通常是人们想要的,因为生产二进制文件将是发布版本,并且测试使用调试。
如果您担心代码缓慢导致难以运行调试版本,您可以创建自己的宏,这些宏是有条件定义的,具体取决于您是否处于测试中:
#[cfg(test)]
macro_rules test_assert {
($($tt: tt)*) => { assert!($($tt)*) }
}
#[cfg(not(test))]
macro_rules test_assert {
($($tt: tt)*) => {}
}
test_assert!
宏的行为就像debug_assert!
一样,除了只在测试中执行任何操作。