21 个版本

0.8.0 2023 年 10 月 4 日
0.7.1 2022 年 3 月 22 日
0.7.0 2022 年 2 月 22 日
0.6.3 2020 年 5 月 7 日
0.2.2 2019 年 2 月 21 日

#111 in 测试


用于 3 crates

MIT/Apache 许可

52KB
825

Datatest:Rust 中的数据驱动测试

crates.io Documentation Build Status

支持数据驱动测试的 crate。

数据驱动测试是通过数据定义测试用例,而不是在代码中定义。此 crate 实现了一个自定义测试运行器,添加了对其他测试类型的支持。

文件驱动测试

数据驱动测试的第一种类型是“文件驱动”测试。这些测试定义了一个扫描测试数据的目录,一个匹配模式(正则表达式),以及可选地,一组模板,根据匹配的文件名推导其他文件路径。对于每个匹配的文件,创建一个新的测试实例,测试函数的参数根据指定的映射推导。

测试函数的每个参数都必须映射到模式或模板。请参见下面的示例语法。

支持以下参数类型

  • &strString:将文件内容捕获为字符串并传递给测试函数
  • &[u8]Vec<u8>:捕获文件内容并传递给测试函数
  • &[u8]:直接传递文件路径

注意

每个测试也可以通过添加#[test]属性来进行标记,以便在具有内置#[test]测试支持的IDE中运行测试。然而,如果使用了此类属性,它应该放在#[datatest::files]属性之后,以便在处理datatest属性之前删除#[test]属性。

示例

#![feature(custom_test_frameworks)]
#![test_runner(datatest::runner)]

#[datatest::files("tests/test-cases", {
  input in r"^(.*).input\.txt",
  output = r"${1}.output.txt",
})]
fn sample_test(input: &str, output: &str) {
  assert_eq!(format!("Hello, {}!", input), output);
}

忽略单个测试

可以通过指定签名为fn(&std::path::Path) -> bool的函数来忽略单个测试,使用以下语法在模式中指定(if !<func_name>)。

#![feature(custom_test_frameworks)]
#![test_runner(datatest::runner)]

fn is_ignore(path: &std::path::Path) -> bool {
  true // some condition
}

#[datatest::files("tests/test-cases", {
  input in r"^(.*).input\.txt" if !is_ignore,
  output = r"${1}.output.txt",
})]
fn sample_test(input: &str, output: &str) {
  assert_eq!(format!("Hello, {}!", input), output);
}

数据驱动测试

此crate支持的第二种测试类型是“数据驱动”测试。这些测试定义了一个包含测试用例列表的YAML文件(通过#[datatest::data(..)]属性,请参见下面的示例)。此文件中的每个测试用例(文件内容必须是数组)都将反序列化为测试函数的参数类型,并为每个测试用例创建一个单独的测试实例。

测试函数必须恰好接受一个参数,并且该参数的类型必须实现serde::Deserialize。如果这个类型实现了ToString(或std::fmt::Display),则它的ToString::to_string结果被用来生成测试名称。

#[test]属性

每个测试也可以通过添加#[test]属性来进行标记,以便在具有内置#[test]测试支持的IDE中运行测试。然而,如果使用了此类属性,它应该放在#[datatest::files]属性之后,以便在处理datatest属性之前删除#[test]属性。

示例

#![feature(custom_test_frameworks)]
#![test_runner(datatest::runner)]

use serde::Deserialize;

#[derive(Deserialize)]
struct TestCase {
  name: String,
  expected: String,
}

#[datatest::data("tests/tests.yaml")]
fn sample_test(case: TestCase) {
  assert_eq!(case.expected, format!("Hi, {}!", case.name));
}

更多示例

有关更多示例,请参阅测试

Rust通道说明

目前此crate主要针对nightly Rust,可能会随时破坏。

可以通过启用某些功能在稳定版本中进行编译(请参阅Cargo.toml),但使用此功能将破坏Rust提供的任何稳定性保证。

许可证

在以下任一许可证下授权:

根据您的选择。

贡献

除非您明确表示,否则根据Apache-2.0许可证定义的您有意提交以包含在工作中的任何贡献,应以上述方式双许可,不得添加任何附加条款或条件。

依赖项

~4-13MB
~159K SLoC