9 releases

0.3.6 Sep 24, 2023
0.3.5 Sep 1, 2023
0.3.4 Apr 19, 2023
0.3.3 Mar 22, 2023
0.1.0 Dec 3, 2021

#20 in Testing

Download history 33465/week @ 2025-01-28 41186/week @ 2025-02-04 41434/week @ 2025-02-11 42351/week @ 2025-02-18 46905/week @ 2025-02-25 53429/week @ 2025-03-04 52745/week @ 2025-03-11 61861/week @ 2025-03-18 59855/week @ 2025-03-25 60942/week @ 2025-04-01 55510/week @ 2025-04-08 51976/week @ 2025-04-15 50416/week @ 2025-04-22 54012/week @ 2025-04-29 55750/week @ 2025-05-06 47651/week @ 2025-05-13

216,314 downloads per month
Used in 115 crates (100 directly)

MIT/Apache

26KB
415 lines

temp-env

Set environment variables temporarily.

This crate is useful for testing with different environment variables that should not interfere.

This code started as a small test helper written by @fabian-braun and @nbaztec and published by @fabian-braun on StackOverflow. @vmx found it useful and took the time to make it a proper crate.

Examples

temp_env::with_var("MY_ENV_VAR", Some("production"), || {
    // Run some code where `MY_ENV_VAR` set to `"production"`.
});


temp_env::with_vars(
    [
        ("FIRST_VAR", Some("Hello")),
        ("SECOND_VAR", Some("World!")),
    ],
    || {
        // Run some code where `FIRST_VAR` is set to `"Hello"` and `SECOND_VAR` is set to
        // `"World!"`.
    }
);

temp_env::with_vars(
    [
        ("FIRST_VAR", Some("Hello")),
        ("SECOND_VAR", None),
    ],
    || {
        // Run some code where `FIRST_VAR` is set to `"Hello"` and `SECOND_VAR` is unset (even if
        // it was set before)
    }
);

Starting from version 0.3.0 you can return a value from inside the closure:

let r = temp_env::with_var("MY_ENV_VAR", Some("production"), || {
    let envvar = env::var("MY_ENV_VAR").unwrap();
    if envvar == "production" {
        true
    } else {
        false
    }
});

How does it work?

This crate sets and unsets environment variables for the currently running (Rust) process. It leverages std::env::set_var.

The provided functions temp_env::with_* provide the following features:

  • Avoid interference when running concurrently
  • Reset previously set env variables back to their original value upon completion, also in case of panic
  • Temporarily unsetting env variables

Note that the crate makes use of a singleton mutex to avoid side effects between concurrently running tests. This may impact the degree of concurrency in your test execution.

Features

  • async_closure: When enabled you can use async_with_var() with async closures. This feature needs at least Rust version 1.64.

License

This project is licensed under either of

at your option.

Dependencies

~0.3–5.5MB
~13K SLoC