有没有办法指定仅在 Rust 测试中有效的断言?

问题描述 投票:0回答:1

我正在实现一个具有内部不变量的数据结构,我想通过测试来覆盖它。这个不变量是数据结构的一部分;因此,如果实现得当,数据结构用户的任何操作序列都不会违反它,但我显然仍然希望对其进行测试。

目前,我只是使用

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 可以做到吗?

unit-testing testing rust assert conditional-compilation
1个回答
0
投票

如所写,

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!
一样,除了只在测试中执行任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.