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

sif

为 Rust 设计的小巧而方便的参数化测试属性宏

1 个不稳定版本

0.1.0 2020年7月7日

#737 in 测试

MIT/Apache

10KB
72

Sif

Sif 提供了一个过程宏,允许您使用多个参数定义要运行的测试。测试用例使用 'parameterized' 属性而不是 'test' 属性定义。此包受到了 JUnit @ParameterizedTest 注解的启发,并建立在 parameterized 包的开发经验之上。

示例

除了下面的两个示例之外,您还可以在此存储库中的 sif_demo 包以及 tests 文件夹中找到更多示例。


示例:NPC

#[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;)。如果您在包中大量使用宏,第二个选项具有优势,因为您只需在包的根目录中导入一次。

使用 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 许可证,版本 2.0MIT 许可证许可。


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

依赖项

约1.5MB
约36K SLoC