# Life-Cycle Annotations

In addition to the life-cycle methods according to your style, you can make any method a life-cycle method by giving it the desired annotation in its function definition. This is especially useful for parent classes that want to hook in to the TestBox life-cycle.

* `@beforeAll` - Executes once before all specs for the entire test bundle CFC
* `@afterAll` - Executes once after all specs complete in the test bundle CFC
* `@beforeEach` - Executes before every single spec in a single describe block and receives the currently executing spec.
* `@afterEach` - Executes after every single spec in a single describe block and receives the currently executing spec.
* `@aroundEach` - Executes around the executing spec so you can provide code surrounding the spec.

Below are several examples using script notation.

**DBTestCase.cfc (parent class)**

```javascript
component extends="coldbox.system.testing.BaseTestCase"{

    /**
     * @aroundEach
     */
    function wrapInDBTransaction( spec, suite ){
        transaction action="begin" {
            try {
                arguments.spec.body();
            } catch (any e) {
                rethrow;
            } finally {
                transaction action="rollback"
            }
        }
     }
}
```

**PostsTest.cfc**

```javascript
component extends="DBTestCase"{

    /**
     * @beforeEach
     */
    function setupColdBox() {
        setup();
    }

    function run() {
        given( "I have a two posts", function(){
            when( "I visit the home page", function(){
                then( "There should be two posts on the page", function(){
                    queryExecute( "INSERT INTO posts (body) VALUES ('Test Post One')" );
                    queryExecute( "INSERT INTO posts (body) VALUES ('Test Post Two')" );

                    var event = execute( event = "main.index", renderResults = true );

                    var content = event.getCollection().cbox_rendered_content;

                    expect(content).toMatch( "Test Post One" );
                    expect(content).toMatch( "Test Post Two" );
                });
            });
        });
    }
}
```

This also helps parent classes enforce their setup methods are called by annotating the methods with `@beforeAll`. No more forgetting to call `super.beforeAll()`!

{% hint style="info" %}
You can have as many annotated methods as you would like. TestBox discovers them up the inheritance chain and calls them in reverse order.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://testbox.ortusbooks.com/digging-deeper/life-cycle-methods.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
