#bdd #spec #cargo-test #test-files

spectest

一个轻量级库,用于在外部文件中定义行为驱动开发(BDD)风格的测试,并通过 cargo test 运行它们

3个版本

0.1.2 2024年7月23日
0.1.1 2024年6月26日
0.1.0 2024年6月24日

#260测试

Download history 276/week @ 2024-06-24 123/week @ 2024-07-22 7/week @ 2024-07-29

130 每月下载量

MIT/Apache

60KB
1.5K SLoC

Spectest - Rust的轻量级BDD测试

一个轻量级库,用于在外部文件中定义行为驱动开发(BDD)风格的测试,并通过 cargo test 运行它们。这可以被视为 datadriven 包的继承者/替代品。

请参阅 spectest 文档集成测试 以获取详细信息。


lib.rs:

一个轻量级库,用于在外部文件中定义行为驱动开发(BDD)风格的测试,并通过 cargo test 运行它们。

编写测试

  1. 实现一个 Handler,用于解释在您的规范文件中定义的 BackgroundExample 部分。
  2. 编写一个调用 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