Verifying components together.
WHAT IT VERIFIES
That components communicate correctly, with real dependencies where practical.
WHAT TO USE REAL
Your own database Your own messaging Your own services
WHY REAL DATABASES SPECIFICALLY
Query behaviour, transactions and constraints cannot be verified against a substitute.
WHAT CONTAINERS PROVIDE
Real dependencies started per test run, disposed afterwards.
WHY THAT CHANGED PRACTICE
It made realistic integration testing practical and repeatable.
WHAT TO SUBSTITUTE
Third-party services you do not control.
WHY
They are slow, rate-limited, and change without notice.
WHAT CONTRACT TESTING PROVIDES
Verification that a consumer's expectations match a provider's behaviour.
WHY IT MATTERS
It catches interface breakage without running everything together.
WHAT TO TEST AT THIS LEVEL
Data persisted and retrieved correctly Transactions rolling back properly Messages published and consumed Configuration loading Migrations applying
WHY MIGRATIONS SPECIFICALLY
They are run once in production and cannot be retried.
WHAT TO TEST ABOUT THEM
Applying to a database with realistic existing data.
WHAT TO RESET BETWEEN TESTS
State, so tests remain independent.
WHAT TO AVOID
Shared test databases across parallel runs.