#assert #proc-macro #test

assert

将测试辅助函数转换为 assert! 样式宏的过程宏

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

Download history 1/week @ 2024-03-05 126/week @ 2024-03-12 67/week @ 2024-03-19 36/week @ 2024-03-26 101/week @ 2024-04-02 65/week @ 2024-04-09 37/week @ 2024-04-16 67/week @ 2024-04-23 113/week @ 2024-04-30 28/week @ 2024-05-07 65/week @ 2024-05-14 112/week @ 2024-05-21 81/week @ 2024-05-28 105/week @ 2024-06-04 72/week @ 2024-06-11

每月下载量 381

MIT 许可证

19KB
256

Rust crates.io docs.rs

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);

使用它的两个原因:

  1. 可读性 - assert! 样式宏在测试中易于识别。它们帮助其他人阅读测试时理解这是断言正确性的地方。
  2. 可追溯性 - 在上述示例中,如果您在调用 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