Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
stop-slop, taste-skill, terrashark had embedded .git dirs causing Woodpecker clone to fail on submodule update.
3.4 KiB
3.4 KiB
Testing Matrix
Use this guide to choose testing depth proportional to risk and cost.
Testing layers
- static checks: format, validate, lint, security scan
- plan checks: reviewed execution intent
- native tests: module-level assertions (
terraform test/tofu test) - integration tests: ephemeral apply + live assertions
- Terratest: workflow/system validation in Go for complex scenarios
Tier A (all changes)
Required:
fmt -checkinit -backend=false+validate- lint + security scan
- reviewed plan artifact
Use for low-risk isolated updates.
Tier B (shared modules or medium-risk changes)
Add:
- native test runs for module behavior
- targeted integration apply tests in ephemeral environment
- policy checks on plan JSON
Typical triggers:
- shared module changes
- IAM/network updates
- encryption/data-boundary updates
Tier C (high-risk production changes)
Add:
- staged rollout (dev -> stage -> prod)
- rollback rehearsal or documented rollback proof
- manual owner approvals + security/compliance sign-off where needed
- post-apply drift detection
Typical triggers:
- state backend migration
- major refactor with address changes
- foundational platform stack changes
Native test guidance
When to use command = plan
Use for:
- input validation
- static contract checks
- argument shape assertions not relying on computed runtime values
When to use command = apply
Use for:
- computed attributes known only after creation
- assertions over provider-populated fields
- set/list semantics that are unresolved in plan stage
Frequent pitfalls
- asserting unknown values in plan mode
- indexing set-type blocks directly
- assuming mocked providers equal integration confidence
Terratest guidance
Use Terratest when native tests are insufficient:
- cross-module workflows
- external API verification (health checks, connectivity)
- failover/disaster-recovery scenarios
- multi-step lifecycle tests (apply-change-destroy)
Terratest test pyramid
- fast contract tests (mocked or plan-level)
- environment integration tests (ephemeral)
- limited end-to-end smoke tests for critical paths
Terratest cost controls
- tag tests by class (
unit,integration,destructive) - parallelize only isolated stacks
- auto-clean resources with TTL tags
- run expensive tests nightly and on protected branches
Test framework scaffolding
Use a thin, consistent structure so tests are easy to run in CI:
.
test/
terratest/
go.mod
helpers/
examples/
network_test.go
native/
main.tftest.hcl
Makefile
Minimal Makefile targets:
test-native:
\tterraform test
test-terratest:
\tgo test ./test/terratest -timeout 45m
Example command flow
terraform fmt -check
terraform init -backend=false
terraform validate
terraform plan -out=plan.bin
terraform show -json plan.bin > plan.json
conftest test plan.json --policy policy/
terraform test
Terratest stage:
go test ./test -run TestCriticalPath -timeout 45m
Selection quick rules
- tiny tag change in isolated stack: Tier A
- module contract change: Tier A + Tier B
- refactor with
movedand shared impact: Tier A + Tier B + targeted Terratest - production identity/network/encryption/state changes: Tier A + Tier B + Tier C + Terratest smoke
Done criteria
Not done until:
- required tier passes
- reviewed plan is approved
- apply path is trusted and auditable
- evidence artifacts are retained