我正在实现一个具有内部不变量的数据结构,我想通过测试来覆盖它。这个不变量是数据结构的一部分;因此,如果正确实现,它永远不会被数据结构用户的任何操作序列所破坏,但我显然仍然希望它被测试。
目前,我只是使用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不能轻易地移动到单元测试中(你可以认为它是在实现堆排序的就地版本时测试堆不变量)。
1条答案
按热度按时间gzjq41n41#
正如所写的那样,
test_invariant
方法只会在调试版本中被调用。也就是说,参数中的表达式在非调试版本中根本不会被计算,这与debug_assert
是函数而不是宏时的行为不同。这通常是人们想要的,因为生产二进制文件将是发布版本,测试使用调试。如果你担心运行调试版本的代码速度太慢,不切实际,你可以创建自己的宏,它是有条件定义的,这取决于你是否在测试中:
字符串
test_assert!
宏的行为就像debug_assert!
一样,除了只在测试中做任何事情。不过,通常情况下,如果测试Assert在可能的情况下显式地完成,情况会更清楚。