dir-test provides a macro to generate single test cases from files in a directory.
Add the following dependency to your Cargo.toml.
[dev-dependencies]
dir-test = "0.4"use dir_test::{dir_test,Fixture};#[dir_test( dir:"$CARGO_MANIFEST_DIR/fixtures", glob:"**/*.txt",)]fnmytest(fixture:Fixture<&str>){// The file content and the absolute path of the file are available as follows.let content = fixture.content();let path = fixture.path();// Write your test code here.// ...}Assuming your crate is as follows, then the above code generates two test
cases mytest__foo() and mytest__fixtures_a_bar().
my-crate/
├─ fixtures/
│ ├─ foo.txt
│ ├─ fixtures_a/
│ │ ├─ bar.txt
├─ src/
│ ├─ ...
│ ├─ lib.rs
├─ Cargo.toml
├─ README.md
🔽
#[test]fnmytest__foo(){mytest(fixture);}#[test]fnmytest__fixtures_a_bar(){mytest(fixture);}NOTE: The dir argument must be specified in an absolute path because
of the limitation of the current procedural macro system. Consider using
environment variables, dir-test crate resolves environment variables
internally.
You can specify a custom loader function to load the file content from the
file path. The loader will be passed &'static str file path and can return
an arbitrary type.
use dir_test::{dir_test,Fixture};#[dir_test( dir:"$CARGO_MANIFEST_DIR/fixtures", glob:"**/*.txt", loader: std::fs::read_to_string,)]fntest(fixture:Fixture<std::io::Result<String>>){let content = fixture.content().unwrap();// ...}If the loader function is not specified, the default content type is
&'static str.
Test names can be customized by specifying the postfix argument.
postfix is appended to the test name.
use dir_test::{dir_test,Fixture};#[dir_test( dir:"$CARGO_MANIFEST_DIR/fixtures", glob:"**/*.txt", postfix:"custom",// `_custom` is appended to the test name.)]fntest(fixture:Fixture<std::io::Result<String>>){// ...}Test attributes can specified by the dir_test_attr attribute. The
attributes inside dir_test_atrr are applied to the all generated test.
use dir_test::{dir_test,Fixture};#[dir_test( dir:"$CARGO_MANIFEST_DIR/fixtures", glob:"**/*.txt",)]#[dir_test_attr( #[wasm_bindgen_test] #[cfg(target_family = "wasm")])]fnwasm_test(fixture:Fixture<std::io::Result<String>>){// ...}NOTE: The dir_test_attr attribute must be specified after the
dir_test.
Tests may have a return type, allowing for the [Result<T, E>] type to be used in the test.
See the relevant book link here.
use dir_test::{dir_test,Fixture};#[dir_test( dir:"$CARGO_MANIFEST_DIR/fixtures", glob:"**/*.txt",)]fntest(fixture:Fixture<&str>) -> std::io::Result<()>{// ...}