4 个版本 (2 个稳定版本)
1.1.0 | 2024 年 6 月 5 日 |
---|---|
1.0.0 | 2022 年 4 月 9 日 |
0.2.0 | 2022 年 2 月 5 日 |
0.1.0 | 2021 年 12 月 7 日 |
在 文件系统 中排名 79
每月下载量 15,120
用于 7 crates
15KB
145 行
Sealed test
此crate公开了#[sealed_test]
宏属性,以在隔离环境中运行您的测试。它提供了以下功能
- 使用rusty-fork提供的隔离进程
- 带有tempfile的临时工作目录。
- 一系列便于配置测试的属性,包括
before
/after
:测试的设置和清理函数。env
:在测试进程中设置环境变量。files
:将文件从crate目录复制到测试临时目录。
注意:使用#[sealed_test]
而不是#[test]
将在临时文件中创建一个设置,并将其设置为测试当前目录,但是,没有任何东西阻止您使用std::env::set_current_dir
更改该目录。
为什么?
如果您运行cargo test
,则测试将在并行中运行,在某些情况下这可能是个问题。让我们看看一个具体的例子。
#[test]
fn foo() -> Result<(), VarError> {
std::env::set_var("VAR", "foo");
let var = std::env::var("VAR")?;
assert_eq!(var, "foo");
Ok(())
}
#[test]
fn bar() -> Result<(), VarError> {
std::env::set_var("VAR", "bar");
// During the thread sleep, the `foo` test will run
// and set the environment variable to "foo"
std::thread::sleep(Duration::from_secs(1));
let var = std::env::var("VAR")?;
// If running tests on multiple threads the below assertion will fail
assert_eq!(var, "bar");
Ok(())
}
使用sealed_test
在这里,每个测试都有自己的环境,测试总是通过!
use sealed_test::prelude::*;
#[sealed_test]
fn foo() -> Result<(), VarError> {
std::env::set_var("VAR", "bar");
let var = std::env::var("VAR")?;
assert_eq!(var, "bar");
Ok(())
}
#[sealed_test]
fn bar() -> Result<(), VarError> {
std::env::set_var("VAR", "bar");
std::thread::sleep(Duration::from_secs(1));
let var = std::env::var("VAR")?;
assert_eq!(var, "bar");
Ok(())
}
示例
env
属性
env
属性允许您快速在测试中设置环境变量。这只是一个语法糖,您仍然可以使用 std::env
正常地操作环境变量。
#[sealed_test(env = [ ("FOO", "foo"), ("BAR", "bar") ])]
fn should_set_env() {
let foo = std::env::var("FOO").expect("Failed to get $FOO");
let bar = std::env::var("BAR").expect("Failed to get $BAR");
assert_eq!(foo, "foo");
assert_eq!(bar, "bar");
}
提示:密封测试有自己的环境,父环境中的变量不会受到测试环境操作的影响。
files
属性
如果您需要测试行为修改文件系统,可以使用 files
属性快速将文件从crate根目录复制到测试工作目录。测试工作目录位于tmpfs中,并在测试执行后清理。
#[sealed_test(files = ["tests/foo", "tests/bar"])]
fn should_copy_files() {
assert!(PathBuf::from("foo").exists());
assert!(PathBuf::from("bar").exists());
}
设置和清理
使用 before
和 after
在测试周围运行一个Rust表达式,通常是一个函数,例如 setup = setup_function()
。
before
和 after
#[sealed_test(before = setup(), after = teardown())]
fn should_run_setup_and_tear_down() {
// ...
}
fn setup() {
println!("Hello from setup")
}
fn teardown() {
println!("Hello from teardown")
}
依赖项
~2–11MB
~127K SLoC