# file_test_runner
File-based test runner for running tests found in files via `cargo test`.
This does two main steps:
1. Collects all files from a specified directory using a provided strategy
(`file_test_runner::collect_tests`).
1. Runs all the files as tests with a custom test runner
(`file_test_runner::run_tests`).
The files it collects may be in any format. It's up to you to decide how they
should be structured.
## Examples
- https://github.com/denoland/deno_doc/blob/main/tests/specs_test.rs
- https://github.com/denoland/deno_graph/blob/main/tests/specs_test.rs
- https://github.com/denoland/deno/tree/main/tests/specs
## Setup
1. Add a `[[test]]` section to your Cargo.toml:
```toml
[[test]]
name = "specs"
path = "tests/spec_test.rs"
harness = false
```
2. Add a `tests/spec_test.rs` file to run the tests with a main function:
```rs
use file_test_runner::collect_and_run_tests;
use file_test_runner::collection::CollectedTest;
use file_test_runner::collection::CollectOptions;
use file_test_runner::collection::strategies::TestPerFileCollectionStrategy;
use file_test_runner::RunOptions;
use file_test_runner::TestResult;
fn main() {
collect_and_run_tests(
CollectOptions {
base: "tests/specs".into(),
strategy: Box::new(TestPerFileCollectionStrategy {
file_pattern: None
}),
filter_override: None,
},
RunOptions {
parallel: false,
},
// custom function to run the test...
|test| {
// * do something like this
// * or do some checks yourself and return a value like TestResult::Passed
// * or use `TestResult::from_maybe_panic_or_result` to combine both of the above
TestResult::from_maybe_panic(AssertUnwindSafe(|| {
run_test(test);
}))
}
)
}
// The `test` object only contains the test name and
// the path to the file on the file system which you can
// then use to determine how to run your test
fn run_test(test: &CollectedTest) {
// Properties:
// * `test.name` - Fully resolved name of the test.
// * `test.path` - Path to the test file this test is associated with.
// * `test.data` - Data associated with the test that may have been set
// by the collection strategy.
// helper function to get the text
let file_text = test.read_to_string().unwrap();
// now you may do whatever with the file text and
// assert it using assert_eq! or whatever
}
```
3. Add some files to the `tests/specs` directory or within sub directories of
that directory.
4. Run `cargo test` to run the tests. Filtering should work OOTB.