3 个版本
使用旧的 Rust 2015
0.1.14 | 2018年8月31日 |
---|---|
0.1.13 | 2018年8月15日 |
0.1.12 | 2018年8月14日 |
522 in 测试
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_each
和after_each
减少样板代码。
Stainless目前支持以下类型的子块
before_each
和after_each
it
、failing
和ignore
bench
- 嵌套
describe!
before_each
和after_each
允许您将一组测试的共同初始化和清理操作组合成一个单独的块,从而缩短您的测试。
it
生成使用before_each
和after_each
的测试。failing
执行相同操作,但生成的测试被标记为#[should_panic]
。它可以选择性地接受一个参数,该参数与失败消息匹配。ignore
相当于用#[ignore]
标记测试,默认情况下禁用测试。
bench
允许您以相同的方式生成基准测试,尽管目前before_each
和after_each
块不会影响bench
块。
嵌套describe!
块允许您更好地将测试组织成小单元,并为您提供对before_each
和after_each
应用位置更细粒度的控制。当然,包装describe!
块中的before_each
和after_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。