#parameterized #attributes #junit #unit-testing #test-cases

sif_macro

Sif 的一部分:参数化测试的属性宏

1 个不稳定版本

0.1.0 2020 年 7 月 7 日

#16#parameterized


sif 中使用

MIT/Apache

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 cratemacro_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.0MIT 协议许可。


除非您明确声明,否则根据 Apache-2.0 协议定义的,您有意提交以包含在此软件包中的任何贡献,都应按上述方式双许可,不附加任何其他条款或条件。

依赖关系

~1.5MB
~35K SLoC