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
52KB
825 行
Datatest:Rust 中的数据驱动测试
支持数据驱动测试的 crate。
数据驱动测试是通过数据定义测试用例,而不是在代码中定义。此 crate 实现了一个自定义测试运行器,添加了对其他测试类型的支持。
文件驱动测试
数据驱动测试的第一种类型是“文件驱动”测试。这些测试定义了一个扫描测试数据的目录,一个匹配模式(正则表达式),以及可选地,一组模板,根据匹配的文件名推导其他文件路径。对于每个匹配的文件,创建一个新的测试实例,测试函数的参数根据指定的映射推导。
测试函数的每个参数都必须映射到模式或模板。请参见下面的示例语法。
支持以下参数类型
&str
,String
:将文件内容捕获为字符串并传递给测试函数&[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版(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
根据您的选择。
贡献
除非您明确表示,否则根据Apache-2.0许可证定义的您有意提交以包含在工作中的任何贡献,应以上述方式双许可,不得添加任何附加条款或条件。
依赖项
~4-13MB
~159K SLoC