3 个版本

使用旧的 Rust 2015

0.1.14 2018年8月31日
0.1.13 2018年8月15日
0.1.12 2018年8月14日

522 in 测试

MIT 许可证

34KB
402

Stainless 构建状态

Stainless 是一个轻量级、灵活、无偏见的测试框架。

请注意,Stainless 目前需要 Rust 编译器的夜间版本!

安装

将 stainless 添加到您的 Cargo.toml 文件中的依赖项

[dev-dependencies]
stainless = "*"

将以下行添加到您的 根模块 的顶部。该文件通常称为 src/main.rs 用于可执行文件,对于库则是 src/lib.rs

#![feature(plugin)]
#![cfg_attr(test, plugin(stainless))]

这将使 stainless 在您使用 cargo test 运行测试时可用。当只使用库的 stainless 时,请确保使用 cargo test --lib 运行测试。

概述

Stainless导出了describe!语法扩展,允许您快速生成复杂的测试层次结构,并通过before_eachafter_each减少样板代码。

Stainless目前支持以下类型的子块

  • before_eachafter_each
  • itfailingignore
  • bench
  • 嵌套describe!

before_eachafter_each允许您将一组测试的共同初始化和清理操作组合成一个单独的块,从而缩短您的测试。

it生成使用before_eachafter_each的测试。failing执行相同操作,但生成的测试被标记为#[should_panic]。它可以选择性地接受一个参数,该参数与失败消息匹配。ignore相当于用#[ignore]标记测试,默认情况下禁用测试。

bench允许您以相同的方式生成基准测试,尽管目前before_eachafter_each块不会影响bench块。

嵌套describe!块允许您更好地将测试组织成小单元,并为您提供对before_eachafter_each应用位置更细粒度的控制。当然,包装describe!块中的before_eachafter_each块也会执行。

这4种子块类型一起,为您提供了比内置测试基础设施更多的灵活性和控制。

示例

describe! stainless {
    before_each {
        // Start up a test.
        let mut stainless = true;
    }

    it "makes organizing tests easy" {
        // Do the test.
        assert!(stainless);
    }

    after_each {
        // End the test.
        stainless = false;
    }

    bench "something simple" (bencher) {
        bencher.iter(|| 2 * 2)
    }

    describe! nesting {

        before_each {
          let mut inner_stainless = true;
        }

        after_each {
          inner_stainless = false;
        }

        it "makes it simple to categorize tests" {
            // It even generates submodules!
            assert_eq!(2, 2);
        }
    }
}

展开为(大致)

mod stainless {
    #[test]
    fn makes_organizing_tests_easy() {
        let mut stainless = true;
        assert!(stainless);
        stainless = false;
    }

    #[bench]
    fn something_simple(bencher: &mut test::Bencher) {
        bencher.iter(|| 2 * 2)
    }

    mod nesting {
        #[test]
        fn makes_it_simple_to_categorize_tests() {
            let mut stainless = true;
            let mut inner_stainless = true;
            assert_eq!(2, 2);
            inner_stainless = false;
            stainless = false;
        }
    }
}

导入模块

在此阶段,无法在describe!块内部放置use语句。为了允许使用来自其他模块和crate的数据结构,每个describe!块都包含一个隐式的pub use super::*;。这样,您在包含模块中使用的所有内容都可以在测试中使用。

#[cfg(test)]
mod tests {
    pub use std::collections::HashMap;

    describe! stainless {
        it "can use HashMap" {
            let map = HashMap::new();
        }
    }
}

许可证

MIT。有关详细信息,请参阅LICENSE文件。

作者

有关作者的全名单,请参阅Cargo.toml。

无运行时依赖