Attribute Macro ntest::test_case

source ·
#[test_case]
Expand description

Test cases can be used to have multiple inputs for a given function. With the #[test_case] attribute multiple tests will be generated using the Procedural Macros capabilities of rust.

The function input can be of type int, bool, or str, or a path to an enum or constant of those types.

Please note that rust functions can only contain alphanumeric characters and ‘’ signs. Special characters will be escaped using a meaning full replacement (for example # will be replaced with _hash), or as a default the ‘’ sign.

A function annotated with a #[test_case] attribute will be split into multiple rust functions annotated with the #[test] attribute.

§Examples

Example with a single argument

#[test_case(13)]
#[test_case(42)]
fn one_arg(x: u32) {
    assert!(x == 13 || x == 42)
}

The test cases above will be parsed at compile time and two rust test functions will be generated instead:

#[test]
fn one_arg_13() {
    x = 13;
    assert!(x == 13 || x == 42)
}

#[test]
fn one_arg_42() {
    x = 42;
    assert!(x == 13 || x == 42)
}

Example with multiple arguments:

#[test_case(true, "true", 1)]
fn test_mix(x: bool, y: &str, z: u16) {
    assert!(x);
    assert_eq!(y, "true");
    assert_eq!(z, 1);
}

Example with name attribute:

#[test_case(42, name="my_fancy_test")]
fn with_name(x: u32) {
    assert_eq!(x, 42)
}

Example with rust test attributes. All attributes after a test case will be appended after the generated #[test] attribute. For example the following test cases…

#[test_case(18)]
#[ignore]
#[test_case(15)]
#[should_panic(expected = "I am panicing")]
fn attributes_test_case(x: u32) {
    panic!("I am panicing");
}

… will be compiled to these two tests. One gets ignored and the other succeeds:

#[test]
#[ignore]
fn attributes_test_case_18 {
   let x = 18;
   panic!("I am panicing");
}

#[test]
#[should_panic(expected = "I am panicing")]
fn attributes_test_case_15() {
   let x = 15;
   panic!("I am panicing");
}

Test functions with a Result return are also supported:

#[test_case(27)]
#[test_case(33)]
fn returns_result(x: u32) -> Result<(), ()> {
    Ok(())
}