11 个版本 (稳定)
1.0.7 | 2021 年 9 月 22 日 |
---|---|
1.0.6 | 2021 年 9 月 17 日 |
0.2.6 | 2021 年 9 月 16 日 |
0.1.5 | 2021 年 9 月 15 日 |
在 测试 中排名第 487
每月下载量 381 次
19KB
256 行
assert_fn
为什么使用它?
assert_fn 库提供了一个过程宏,可以将测试辅助函数转换为 assert! 样式宏。它旨在用于测试辅助函数执行断言的场景,例如:
fn check_eq_if_doubled(a: usize, b: usize) {
assert_eq!(a * 2, b)
}
check_eq_if_doubled(1, 2);
check_eq_if_doubled(2, 4);
check_eq_if_doubled(4, 8);
使用它的两个原因:
- 可读性 - assert! 样式宏在测试中易于识别。它们帮助其他人阅读测试时理解这是断言正确性的地方。
- 可追溯性 - 在上述示例中,如果您在调用 check_eq_if_doubled 时遇到失败,panic 将起源于第 2 行,而不是触发失败的那一行。在更复杂的测试中,这可能会使定位测试错误变得困难。
使用 assert_fn,上述代码可以写成:
use assert_fn::assert_fn;
#[assert_fn]
fn eq_if_doubled(a: usize, b: usize) -> bool {
a * 2 == b
}
assert_eq_if_doubled!(1, 2);
assert_eq_if_doubled!(2, 4);
assert_eq_if_doubled!(4, 8);
或者,如果您想使用 assert_eq! 而不是 assert! 来查看值,只需返回一个元组而不是布尔值即可:
use assert_fn::assert_fn;
#[assert_fn]
fn eq_if_doubled(a: usize, b: usize) -> (usize, usize) {
(a * 2, b)
}
assert_eq_if_doubled!(1, 2);
assert_eq_if_doubled!(2, 4);
assert_eq_if_doubled!(4, 8);
在这两个示例中,失败都将记录在测试中错误起源的行上,而不是在 eq_if_doubled 代码行内。
请参阅 Rust 文档 了解更多示例。
API
#[assert_fn]
宏支持的字段。
message
仅支持返回元组或元组结果的函数。
在断言失败时提供默认消息。列表中的第一项必须是字符串字面量。列表中的其他项将从返回的元组中解构,并可以通过命名属性替换到消息中。任何未使用的元组字段必须在需要使用之前用 _
标记。
示例:消费返回元组的第三个属性。
use assert_fn::assert_fn;
#[assert_fn(message("Nope! But {panic}", _, _, panic))]
fn meaning_of_life(a: usize) -> (usize, usize, String) {
(a, 42, "don't panic!".to_string())
}
export
如果将 export
字段传递给 #[assert_fn]
,则 #[macro_export]
将被添加到生成的宏中,以便在其它地方使用。
use assert_fn::assert_fn;
#[assert_fn(export)]
fn is_ten(num: usize) -> (usize, usize) {
(num, 10)
}
故障排除
由于宏必须在可以使用之前定义,因此您的辅助函数必须在您想使用它们的测试上方声明。
如果您收到 找不到 macro
错误,请检查您的函数是否按正确顺序排列。
依赖关系
~1.5MB
~34K SLoC