#testing #env-var #temp-dir #proc-macro-attributes #isolated #directory #run

开发 sealed_test

一个用于在隔离环境中运行测试的 procmacro 属性

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

Download history 2427/week @ 2024-04-20 2598/week @ 2024-04-27 2914/week @ 2024-05-04 2811/week @ 2024-05-11 3225/week @ 2024-05-18 3119/week @ 2024-05-25 3245/week @ 2024-06-01 3418/week @ 2024-06-08 3547/week @ 2024-06-15 3137/week @ 2024-06-22 3971/week @ 2024-06-29 3353/week @ 2024-07-06 3576/week @ 2024-07-13 3659/week @ 2024-07-20 3852/week @ 2024-07-27 3631/week @ 2024-08-03

每月下载量 15,120
用于 7 crates

MIT 许可证 MIT

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());
}

设置和清理

使用 beforeafter 在测试周围运行一个Rust表达式,通常是一个函数,例如 setup = setup_function()

beforeafter

#[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