#proc-macro #cleanup #state #global #procedural #module #reset

macro after-test

A procedural macro that allows you to run a clean up function after each test from a test module

5 releases

0.1.4 Sep 13, 2024
0.1.3 Sep 10, 2024
0.1.2 Sep 8, 2024
0.1.1 Sep 7, 2024
0.1.0 Sep 7, 2024

#321 in Procedural macros

Download history 382/week @ 2024-09-06 132/week @ 2024-09-13 10/week @ 2024-09-20 5/week @ 2024-09-27 2/week @ 2024-10-04

163 downloads per month

Custom license

10KB
127 lines

Introduction

This crate provides users with a simple macro that allows to define a cleanup function which can be applied to all tests in a module. This can be useful if you require to remove temporary files or directories at the end of each test, or if you need to reset some global state.

Examples

Call cleanup function

Simply provide the cleanup function you wish to call for each of your test a the end of the execution. The below shows an example to reset the state of a global variable used across the tests.

use after_test::cleanup;

#[cfg(test)]
#[cleanup(reset_global_state)]
mod tests {
    use std::sync::{Arc, LazyLock, Mutex};

    static ZERO: LazyLock<Arc<Mutex<u32>>> = LazyLock::new(|| Arc::new(Mutex::new(0)));


    fn reset_global_state() {
        // Reset the global state
        *ZERO.lock().unwrap() = 0;
    }

    #[test]
    fn test_increment() {
        let mut zero = ZERO.lock().unwrap();
        *zero += 1;
        assert_eq!(*zero, 1);
    }

    #[test]
    fn test_increment_double() {
        let mut zero = ZERO.lock().unwrap();
        *zero += 2;
        assert_eq!(*zero, 2);
    }
}

The reset_global_state function will be called at the end of each function marked with the #[test] attribute in the module. You can also provide arguments to your cleanup function, if it takes any arguments. Arguments can be literals ( e.g. "hello" or 1), but also identifiers to variables that you have in your test (e.g. my_var).

Call closure as cleanup function

You can also provide a closure if you wish to. Provide the closure as an argument to the macro.

use after_test::cleanup;

#[cfg(test)]
#[cleanup(|| {println ! ("this will be called at the end of each test")})]
mod tests {
    #[test]
    fn my_test() {}
}

Roadmap

  • Add support for async functions: this causes some issues because of the way tokio::test processes the tests and doesn't return a function marked as #[test] or #[tokio::test].
  • Add support for disallowing the macro on certain tests.
  • Add support for parametrized cleanup functions
  • Add support for closures

Dependencies

~305–760KB
~18K SLoC