[Rust] Table Driven Tests

Oct 6, 2019 · 254 words · 2 minute read

One of my favorite ways to write tests in Go is with a table driven test. If you are unfamiliar with the concept check out the excellent Dave Cheney post. If you need to unit test a component under a multitude of edge cases, then this is good technique to adopt. Anyway, I’m learning Rust in my spare time so I thought I’d best give it a go. Hopefully this will suffice, but if you think it could be improved please hit me up on twitter.

Following in Dave’s footsteps, let’s implement a recursive function to calculate the fibonacci number:

fn fib(n: i64) -> i64 {
    if n < 2 {
            return n
    }
    return fib(n-1) + fib(n-2)
}

For the structure itself we’ll need to define a struct which details our required input(s) - in this case n - and our expected result (e). We can then iterate over an array of these test cases, using the macro assert_eq! to ensure the computed result matches.

#[test]
fn table() {
    struct Pair {
        n: i64,
        e: i64,
    }

    let fib_tests: [Pair; 7] = [
        Pair {
            n: 1,
            e: 1, 
        },
        Pair {
            n: 2,
            e: 1, 
        },
        Pair {
            n: 3,
            e: 2, 
        },
        Pair {
            n: 4,
            e: 3, 
        },
        Pair {
            n: 5,
            e: 5, 
        },
        Pair {
            n: 6,
            e: 8, 
        },
        Pair {
            n: 7,
            e: 13, 
        },
    ];

    for test in fib_tests.iter() {
        assert_eq!(test.e, fib(test.n))
    }
}

See the docs for more information on unit testing in Rust!