1 个不稳定版本
0.1.0 | 2020 年 7 月 7 日 |
---|
#16 在 #parameterized
在 sif 中使用
8KB
177 行
Sif
Sif 提供了一个过程宏,允许你定义一个可以运行多个参数的测试。测试用例使用 'parameterized' 属性而不是 'test' 属性来定义。这个 crate 是受 JUnit @ParameterizedTest
注解和 parameterized crate 的开发经验启发而创建的。
示例
除了以下两个示例外,你还可以在这个存储库中的 sif_demo crate 和 tests 文件夹中找到更多示例。
示例:NPCs
#[cfg(test)] #[macro_use] extern crate sif;
enum NPC {
Andre,
Lautrec,
Siegmeyer,
Solaire,
}
trait Home {
fn reigns_from(&self) -> &str;
}
impl Home for NPC {
fn reigns_from(&self) -> &str {
match self {
NPC::Solaire | NPC::Andre => "Astora",
NPC::Lautrec => "Carim",
NPC::Siegmeyer => "Catarina",
}
}
}
#[parameterized]
#[case(NPC::Andre, "Astora")]
#[case(NPC::Lautrec, "Carim")]
#[case(NPC::Siegmeyer, "Catarina")]
#[case(NPC::Solaire, "Astrora")]
fn npc_reigns_from_test(npc: NPC, place: &str) {
assert_eq!(npc.reigns_from(), place)
}
导入 Sif
在 Rust 2018 中,有两种主要方法导入属性宏。
第一种是将宏导入局部作用域,就像常规导入一样,例如:use sif::parameterized;
。这种方法还可以很容易地将宏的属性别名到其他标识符,例如 use sif::parameterized as pm;
。
第二种是使用 extern crate
与 macro_use
属性(例如:#[cfg(test)] #[macro_use] extern crate sif;
)。如果你在 crate 中大量使用宏,这个选项有优势,因为只需在 crate 的根目录中导入一次。
使用 IDE 运行测试
IntelliJ IDEA (+ intellij-rust)
IntelliJ IDEA 识别测试用例并提供上下文菜单,允许您在特定范围(例如模块或单个测试用例)内运行测试,例如通过点击位于代码块开头旁边的空白处旁边的▶图标。例如,通过点击包含以下代码的代码块开头的空白处的▶图标:#[test]
。遗憾的是,由于属性宏目前没有被展开,IDE 无法识别由 sif::parameterized
宏生成的测试用例。由于我发现这种运行测试的方式非常有用,所以我选择实现了一个简单的解决方案,通过提供一个小的声明性宏将其展开为一个空的测试用例。我还尝试了其他各种解决方案,这些方案将在 #ISSUENR 中进行记录。
#[cfg(test)] #[macro_use] extern crate sif;
fn squared(input: i8) -> i8 {
input * input
}
#[cfg(test)]
/*▶*/mod tests {
use super::*;
/*▶*/mod squared_tests { // <--
use super::*;
// this macro generates an empty test case which will mark the module as containing tests.
ide!(); // <--
#[pm(input = {
-2, -1, 0, 1, 2
}, expected = {
4, 1, 0, 1, 4
})]
fn test_squared(input: i8, output: i8) {
assert_eq(squared(input), output);
}
}
}
许可协议
根据您的选择,此软件受Apache License, Version 2.0 或 MIT 协议许可。
除非您明确声明,否则根据 Apache-2.0 协议定义的,您有意提交以包含在此软件包中的任何贡献,都应按上述方式双许可,不附加任何其他条款或条件。
依赖关系
~1.5MB
~35K SLoC