   However, `on_exit/2` may also be called dynamically, where a
   reference can be used to guarantee the callback will be invoked
   only once.
+
+  `on_exit/2` gets executed in a blocking fashion after a test
+  exits and **before** running the next test. This means that no
+  other test from the same test case will be running while the
+  `on_exit/2` callback for a previous test is running.
+
+  `on_exit/2` is executed in a different process than the test
+  process.
+
+  ## Examples
+
+      setup do
+        File.write!("fixture.json", "{}")
+        on_exit(fn -> File.rm!("fixture.json") end)
+      end
+
   """
   @spec on_exit(term, (() -> term)) :: :ok
   def on_exit(name_or_ref \\ make_ref(), callback) when is_function(callback, 0) do

        # Same as above, but receives the context as argument
        setup context do
          IO.puts("Setting up: #{context.test}")
          
          # We can simply return :ok when we don't want add any extra metadata
          :ok
        end

        :ok
      end

      # Block
      setup_all do
        [conn: Plug.Conn.build_conn()]
      end

  The context returned by `setup_all/1` will be available in all subsequent
  `setup_all`, `setup`, and the `test` itself. For instance, the `conn` from
  the previous example can be accessed as:

      test "fetches current users", %{conn: conn} do
        # ...
