Rust testing setup and teardown fixtures
We can create setup/teardown fixtures using a struct and the Drop trait that will be executed even if the test panics.
#![allow(unused)] fn main() { pub fn div(left: u64, right: u64) -> u64 { left / right } #[cfg(test)] mod tests { use super::*; struct Thing { name: String, } impl Thing { pub fn new(name: &str) -> Self { println!("before {name}"); Self { name: name.to_owned(), } } } impl Drop for Thing { fn drop(&mut self) { println!("after {}", self.name); } } #[test] fn works_2_2() { let _thing = Thing::new("2_2"); let result = div(2, 2); assert_eq!(result, 1); } #[test] fn works_2_0() { let _thing = Thing::new("2_0"); let result = div(2, 0); assert_eq!(result, 1); } #[test] fn works_4_3() { let _thing = Thing::new("4_3"); let result = div(4, 3); assert_eq!(result, 1); } } }
running 3 tests
before 2_2
after 2_2
test tests::works_2_2 ... ok
before 2_0
before 4_3
after 4_3
test tests::works_4_3 ... ok
after 2_0
test tests::works_2_0 ... FAILED
failures:
failures:
tests::works_2_0
test result: FAILED. 2 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s