4次发布
0.1.3 | 2023年3月21日 |
---|---|
0.1.2 | 2022年12月13日 |
0.1.1 | 2022年5月30日 |
0.1.0 | 2022年5月18日 |
在调试类别中排名第421
每月下载量22次
13KB
128 代码行
Rust-Invariants
这是什么?
这是一个带有断言宏的库,用于控制某些断言何时被编译或运行。这使得在测试期间,即使代码中充满了许多debug_assertions,也不会对性能造成巨大影响。因此,您可以使用跟踪断言tassert!(true)
,它只有在您启用跟踪断言时才会编译为检查。
动机
在任何语言中,尤其是在Rust中,调试可能会有些痛苦。编写特殊的调试打印可能会弄脏您的代码并使其更难维护,而每次都要重新进行调试工作是非常昂贵的。因此,我们通常会有一些有意义的日志打印,也许还有这里或那里的断言。
我开始改变我的工作方式,我称之为“不变量调试”。除了日志记录之外,而不是调试表达式(据我所知,在Rust中这是不可能的),我使用断言。您在开发期间定义不变量,然后您可以使用断言来检查它们。这样,它既用于测试也用于文档。例如,在一个hashset实现中,您可以添加以下断言
pub fn add(key) {
...
let res = self.data.insert(key, value);
debug_assert!({
let mut set = vec![];
for e in v.iter() {
if !set.contains(e) {
set.push(0);
}
}
set.len() == self.len()
}, "HashSet has a non-unique key");
res
}
这不是检查重复的有效方法。而且更糟糕的是,我们的某些测试会非常慢。通常我们会在修复了我们的错误后注释掉或删除这个断言,但仍然是一个好主意。相反,当使用这个宏时,您可以使用tassert!
,这样您就会得到类似的代码片段
pub fn add(key) {
...
let res = self.data.insert(key, value);
tassert!({...}, "HashSet has a non-unique key");
res
}
但这样,您可以在某些路径或某些测试中只打开跟踪断言。
如何使用它?
iassert!(true, "This is always true");
wassert!(true, "This is always true");
tassert!(false, "Opps, this doesn't work when used in trace level");
目前,我们仅支持使用日志级别作为断言级别。在不久的将来,我们将添加对自定义断言级别、动态断言级别以及使用过程宏定义断言函数等其他优秀特性的支持。
安装
[dependencies]
assertions = "0.1"
依赖项
~87KB