# Testing Patterns

## Overview

Testing patterns provide structured approaches to writing reliable, maintainable, and expressive tests. They address common challenges: isolating units under test, structuring test logic clearly, managing complex test data, and abstracting UI interactions for end-to-end tests.

## Pattern Comparison

| Pattern | Purpose | Scope | Key Benefit |
|---|---|---|---|
| **Test Doubles** | Replace real dependencies with controlled substitutes | Unit / Integration | Isolation from external systems |
| **Arrange-Act-Assert** | Structure each test in three clear phases | Unit / Integration | Readability and consistency |
| **Given-When-Then** | Express tests as BDD scenarios | Acceptance / BDD | Business-readable specifications |
| **Page Object** | Encapsulate UI page structure behind an API | UI / E2E | Decouple tests from page layout |
| **Test Data Builder** | Construct complex test fixtures fluently | Unit / Integration | Reduce boilerplate, improve clarity |

## When to Use Which

- **Need to isolate a unit from its dependencies?** Use **Test Doubles** (mock, stub, spy, fake, dummy).
- **Want a simple, consistent test layout?** Use **Arrange-Act-Assert** for any unit or integration test.
- **Writing acceptance tests with stakeholders?** Use **Given-When-Then** for natural-language scenarios.
- **Testing web UIs that change layout frequently?** Use **Page Object** to centralise selectors.
- **Creating many similar but slightly different test objects?** Use **Test Data Builder** for fluent construction.

## Relationships Between Patterns

- **Arrange-Act-Assert** and **Given-When-Then** are structural alternatives; AAA is more common in unit tests, GWT in BDD.
- **Test Doubles** are used inside the "Arrange" / "Given" phase of either structure.
- **Test Data Builder** simplifies the "Arrange" / "Given" phase when fixtures are complex.
- **Page Object** is typically combined with AAA or GWT for UI tests.

## Further Reading

- *xUnit Test Patterns* by Gerard Meszaros
- *Growing Object-Oriented Software, Guided by Tests* by Freeman & Pryce
- Martin Fowler's "Mocks Aren't Stubs" article
