3个版本
0.1.2 | 2024年7月23日 |
---|---|
0.1.1 | 2024年6月26日 |
0.1.0 | 2024年6月24日 |
#260 在 测试 中
130 每月下载量
60KB
1.5K SLoC
Spectest - Rust的轻量级BDD测试
一个轻量级库,用于在外部文件中定义行为驱动开发(BDD)风格的测试,并通过 cargo test
运行它们。这可以被视为 datadriven 包的继承者/替代品。
请参阅 spectest
文档 和 集成测试 以获取详细信息。
lib.rs
:
一个轻量级库,用于在外部文件中定义行为驱动开发(BDD)风格的测试,并通过 cargo test
运行它们。
编写测试
- 实现一个
Handler
,用于解释在您的规范文件中定义的Background
和Example
部分。 - 编写一个调用
run
的测试,传入一个Handler
实例和一个指向规范文件的路径。您还可以使用glob_test
为指定文件夹(包括子文件夹)中的每个规范文件推导出这样一个测试。
示例
以下是一个最小示例
use spectest;
struct MevalHandler<'a> {
ctx: meval::Context<'a>,
}
impl<'a> MevalHandler<'a> {
fn new() -> Self {
Self {
ctx: meval::Context::new(),
}
}
}
impl<'a> spectest::Handler for MevalHandler<'a> {
type Error = String;
fn example(&mut self, example: &mut spectest::Example) -> Result<(), Self::Error> {
let Some(input) = example.when.get("input") else {
let msg = format!("missing `input` definition in the 'When' spec");
return Err(msg);
};
let input = match input.parse::<meval::Expr>() {
Ok(expr) => expr,
Err(err) => {
let msg = format!("cannot parse `input` expression `{input}`: {err}");
return Err(msg);
}
};
match input.eval_with_context(self.ctx.clone()) {
Ok(value) => {
example.then.insert("result", value.to_string() + "\n");
}
Err(err) => {
let msg = format!("cannot evaluate expression: {err}\n");
example.then.insert("result", msg);
}
}
Ok(())
}
}
#[spectest::glob_test("testdata/integration/**/*.md")]
fn test_meval(path: &str) {
let mut handler = MevalHandler::new();
spectest::run(path, &mut handler);
}
假设 testdata/integration
文件夹包含一个名为 calculator.md
的文件,可以这样运行测试
# Expand the prefix to narrow the set of tested spec files
cargo test test_meval_
在修复/更新待测试的 meval
库的行为后,也可以按以下方式大量重写失败的测试
REWRITE_SPECS=true cargo test test_calculator
有关一个更详细版本,该版本也会根据当前激活的 Background
章节更新评估上下文,请参阅源代码仓库中的 test/integration.rs
。
依赖项
~2.3–3.5MB
~57K SLoC