#parameterized #attributes #junit #unit-testing #test #test-cases

macro dev parameterized-macro

Attribute macro crate for parameterized tests

9 releases (4 stable)

2.0.0 Mar 5, 2024
1.1.0 Oct 12, 2023
1.0.1 Nov 9, 2022
1.0.0 May 2, 2022
0.1.1 Nov 14, 2019

#7 in #unit-test

Download history 761/week @ 2024-03-13 791/week @ 2024-03-20 917/week @ 2024-03-27 926/week @ 2024-04-03 1017/week @ 2024-04-10 881/week @ 2024-04-17 1567/week @ 2024-04-24 1041/week @ 2024-05-01 1662/week @ 2024-05-08 1162/week @ 2024-05-15 779/week @ 2024-05-22 1210/week @ 2024-05-29 1001/week @ 2024-06-05 963/week @ 2024-06-12 853/week @ 2024-06-19 1179/week @ 2024-06-26

4,432 downloads per month
Used in 26 crates (via parameterized)

MIT/Apache

16KB
281 lines

High level overview of test case generation

An example

With this macro we generate the following code (1) from the given parameterized test definition (0):

parameterized test definition:

// 0

#[parameterized(a = {1, 2}, b = { "wanderlust", "wanderer" })]
fn my_test(a: i32, b: &str) {
    assert!(a > 0 && b.starts_with("w"))
}

generated test cases:

// 1

#[cfg(test)]
mod my_test {
    #[test]
    fn case_0() {
        let a: i32 = 1;
        let b: &str = "wanderlust";
        assert!(a > 0 && b.starts_with("w"))
    }

    #[test]
    fn case_1() {
        let a: i32 = 2;
        let b: &str = "wanderer";
        assert!(a > 0 && b.starts_with("w"))
    }
}

More examples can be found in the expand crate, and the tests.

notes:

  • The function name in (1) is the same as the module name in (0)

  • Note that arguments are not limited to primitives; they can be any expression (assuming:)

  • In a parameterized test case, the input arguments (which are expressions) specified in the attribute should evaluate to the same type as their identically named companions in the function signature.

  • Tests executed from the workspace crate should be run individually, e.g. (cargo test --package parameterized-macro --test tests individual_cases -- --exact). Otherwise, if just cargo test is used, some generated test cases will run in an incorrect context setting.

Dependencies

~1.2–1.7MB
~33K SLoC