#test-runner #file #com #deno #specs

file_test_runner

File-based test runner for running tests found in files

13 releases (6 breaking)

0.7.4 Dec 3, 2024
0.7.3 Nov 22, 2024
0.7.2 May 31, 2024

#72 in Testing

Download history 726/week @ 2025-01-29 838/week @ 2025-02-05 721/week @ 2025-02-12 874/week @ 2025-02-19 764/week @ 2025-02-26 627/week @ 2025-03-05 1072/week @ 2025-03-12 951/week @ 2025-03-19 1121/week @ 2025-03-26 1549/week @ 2025-04-02 977/week @ 2025-04-09 1786/week @ 2025-04-16 1073/week @ 2025-04-23 1274/week @ 2025-04-30 2019/week @ 2025-05-07 1370/week @ 2025-05-14

5,832 downloads per month
Used in 8 crates (4 directly)

MIT license

37KB
964 lines

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).
  2. 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

Setup

  1. Add a [[test]] section to your Cargo.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:

    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.

Dependencies

~3–10MB
~87K SLoC