4 个版本 (2 个重大更改)
0.3.0 | 2023年4月13日 |
---|---|
0.2.0 | 2022年11月6日 |
0.1.1 | 2022年11月5日 |
0.1.0 | 2022年11月5日 |
1299 在 文件系统 中
每月 76 次下载
在 2 crates 中使用
12KB
90 行
目标测试目录
此 crate 为需要测试特定目录的测试提供了一个方便的 proc-macro [macro@with_test_dir]。
[macro@with_test_dir] proc-macro 将 get_test_dir
宏插入到函数体中。 get_test_dir
根据测试函数的名称在已知位置创建并返回一个测试目录: target/test-data/<module-path-and-function-name>
这些 test-data
目录在测试运行之间持续存在,并在开始新的测试运行时删除和重新创建。这有助于在测试运行之间检查通过和失败的测试数据。
示例
您的测试需要在 [dev-dependencies]
中依赖此 crate
[dev-dependencies]
target-test-dir = "…"
然后在任何需要目录的测试中,在测试函数上使用 [macro@with_test_dir] proc-macro 属性
use target_test_dir::with_test_dir;
use std::path::PathBuf;
#[test]
#[with_test_dir]
fn write_and_read_hello_world() -> std::io::Result<()> {
let testdir = get_test_dir!();
let hwpath = testdir.join("hello_world.txt");
std::fs::write(&hwpath, "Hello World!")?;
let bytes = std::fs::read(hwpath)?;
let output = String::from_utf8(bytes).unwrap();
assert_eq!(&output, "Hello World!");
Ok(())
}
测试目录不变性
测试目录遵循以下不变性
- 由于调用 [get_base_test_dir],
get_test_dir
宏需要$CARGO_MANIFEST_DIR
被设置。 - 每个测试都有一个位于
target/test-data/${TEST_SPECIFIC_NAME}
的测试特定目录。 TEST_SPECIFIC_NAME
是完整的模块 + 测试函数 rust 项目路径名称,其中::
被替换为-
。- 测试过程和
test-data
一致性- 在测试过程运行期间,如果需要使用这些目录之一的第一项测试,如果存在,则会删除所有
target/test-data
。 - 每个测试在执行封装的测试函数之前都会创建一个自己的特定于测试的目录。
- 这两个不变性旨在保证该目录的内容始终是由于最近运行的测试(并且不应该混合来自不同测试进程的数据)。
- 在测试过程运行期间,如果需要使用这些目录之一的第一项测试,如果存在,则会删除所有
- 此框架不会删除这些目录,以便开发人员可以检查通过和失败的测试结果。
- 它们位于
target/
下,因此应该由 Cargo 的版本控制约定忽略,并使用cargo clean
清理。
非测试函数
如果满足 [get_base_test_dir] 的期望并且这些函数在每次测试运行中只调用一次,则可以使用宏应用于非 #[test]
函数。示例
use target_test_dir::with_test_dir;
use std::path::PathBuf;
#[with_test_dir]
fn setup_test_data() -> PathBuf {
let testdir = get_test_dir!();
populate_test_data(&testdir);
testdir
}
#[test]
fn test_validator() {
let testdir = setup_test_data();
run_validator(testdir);
}
边界情况
get_test_dir
宏如果在目录已存在时恐慌,因为设计假设测试应始终针对新空目录执行以实现可重复性。
这可能会发生,例如,在多次重用函数时
这可能会在任何给定的时间发生,当在一个测试过程中多次调用 #[with_test_dir]
函数时。这种情况发生在使用 test_case
宏时,该宏在一个测试过程中为每个情况调用相同的测试函数。
依赖关系
~0.5–1MB
~21K SLoC