Skip to content
/ testdir Public

Semi-persistent, scoped test directories

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

flub/testdir

Folders and files

NameName
Last commit message
Last commit date

Latest commit

1d9a408 · Jan 27, 2025

History

69 Commits
Dec 4, 2024
Jan 27, 2025
Jan 13, 2023
Nov 16, 2022
Dec 6, 2020
Oct 7, 2021
Dec 4, 2024
Dec 4, 2024
Dec 6, 2020
Dec 6, 2020
Sep 19, 2024

Repository files navigation

Semi-persistent, scoped test directories

This crate aims to make it easier to use temporary directories in tests, primarily by calling the testdir!() macro somewhere in a test function. The directories are structured per-scope and per-test and will be available for inspection after the test has finished. On subsequent test runs older generations of test directories will be cleaned up.

If you've ever used pytest's tmp_path or tmpdir fixtures this pattern should be similar.

By default test directories are created in cargo's target directory:

target/testdir-$N/module/path/test_name

Here $N is an integer generation number increasing with each cargo test invocation. Generations older than the 8 most recent ones are removed on the next cargo test run.

There is also a symlink pointing to the most recent generation:

target/testdir-current -> testdir-$N`

Note however that on windows sometimes this can not be updated due to permissions, this symlink is a best-effort on windows.

Example

Even when executing this with cargo test --jobs=1 these tests will pass as each gets their own unique directory:

// E.g. in lib.rs

mod tests {
    use std::path::PathBuf;
    use testdir::testdir;

    #[test]
    fn test_write() {
        let dir: PathBuf = testdir!();
        let path = dir.join("hello.txt");
        std::fs::write(&path, "hi there").ok();
        assert!(path.exists());
    }
    
    #[test]
    fn test_read() {
        let dir: PathBuf = testdir!();
        let path = dir.join("hello.txt");
        assert!(!path.exists());
    }
}

Afterwards you can inspect the directories and they should look something like this:

$ tree target/
target/
+- testdir-0
|    +- cratename
|         +- tests
|              +- test_read
|              +- test_write
|                   +- hello.txt
+- testdir-current -> testdir-0

Feedback and contributing

The code lives in a git repository at https://github.com/flub/testdir from which you can create issues, clone the repository and create pull requests.