#unit-testing #test-cases #proc-macro #case #unit #test-macro

dev test-case

Provides #[test_case(...)] procedural macro attribute for generating parametrized test cases easily

29 releases (stable)

3.3.1 Nov 17, 2023
3.1.0 Apr 2, 2023
3.0.0 Feb 13, 2023
2.2.2 Oct 1, 2022
0.3.3 Oct 1, 2019

#4 in Testing

Download history 93512/week @ 2024-07-03 90982/week @ 2024-07-10 101609/week @ 2024-07-17 107607/week @ 2024-07-24 144706/week @ 2024-07-31 146826/week @ 2024-08-07 126033/week @ 2024-08-14 164609/week @ 2024-08-21 133914/week @ 2024-08-28 156297/week @ 2024-09-04 147533/week @ 2024-09-11 141337/week @ 2024-09-18 150098/week @ 2024-09-25 154607/week @ 2024-10-02 137383/week @ 2024-10-09 161795/week @ 2024-10-16

634,341 downloads per month
Used in 724 crates (573 directly)

MIT license

14KB
63 lines

Crates.io Crates.io Docs.rs MIT License Build Status Maintenance

Test Case

Overview

test_case crate provides procedural macro attribute that generates parametrized test instances.

Getting Started

Crate has to be added as a dependency to Cargo.toml:

[dev-dependencies]
test-case = "*"

and imported to the scope of a block where it's being called (since attribute name collides with rust's built-in custom_test_frameworks) via:

use test_case::test_case;

Example usage:

#[cfg(test)]
mod tests {
    use test_case::test_case;

    #[test_case(-2, -4 ; "when both operands are negative")]
    #[test_case(2,  4  ; "when both operands are positive")]
    #[test_case(4,  2  ; "when operands are swapped")]
    fn multiplication_tests(x: i8, y: i8) {
        let actual = (x * y).abs();

        assert_eq!(8, actual)
    }
}

Output from cargo test for this example:

$ cargo test

running 4 tests
test tests::multiplication_tests::when_both_operands_are_negative ... ok
test tests::multiplication_tests::when_both_operands_are_positive ... ok
test tests::multiplication_tests::when_operands_are_swapped ... ok

test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

Test Matrix

The #[test_matrix(...)] macro allows generating multiple test cases from the Cartesian product of one or more possible values for each test function argument. The number of arguments to the test_matrix macro must be the same as the number of arguments to the test function. Each macro argument can be:

1. A list in array (`[x, y, ...]`) or tuple (`(x, y, ...)`) syntax. The values can be any
   valid [expression](https://doc.rust-lang.org/reference/expressions.html).
2. A closed numeric range expression (e.g. `0..100` or `1..=99`), which will generate
   argument values for all integers in the range.
3. A single expression, which can be used to keep one argument constant while varying the
   other test function arguments using a list or range.

Example usage:

#[cfg(test)]
mod tests {
    use test_case::test_matrix;

    #[test_matrix(
        [-2, 2],
        [-4, 4]
    )]
    fn multiplication_tests(x: i8, y: i8) {
        let actual = (x * y).abs();

        assert_eq!(8, actual)
    }
}

MSRV Policy

Starting with version 3.0 and up test-case introduces policy of only supporting latest stable Rust. These changes may happen overnight, so if your stack is lagging behind current stable release, it may be best to consider locking test-case version with = in your Cargo.toml.

Documentation

Most up to date documentation is available in our wiki.

License

Licensed under of MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)

Contributing

Project roadmap is available at link. All contributions are welcome.

Recommended tools:

  • cargo readme - to regenerate README.md based on template and lib.rs comments
  • cargo insta - to review test snapshots
  • cargo edit - to add/remove dependencies
  • cargo fmt - to format code
  • cargo clippy - for all insights and tips
  • cargo fix - for fixing warnings

Dependencies

~0.3–1.3MB
~27K SLoC