name: terraform-test description: 'WORKFLOW SKILL — Write and run Terraform tests (.tftest.hcl). WHEN: "create terraform test", "write tftest", ".tftest.hcl", "mock provider", "test module", "test assertion". USE FOR: test files, run blocks, assertions, mock providers, plan-mode unit tests, apply-mode integration tests, test troubleshooting. DO NOT USE FOR: Bicep code, architecture decisions, deployment (use azure-deploy).' compatibility: Requires Terraform >= 1.6 (test blocks), >= 1.7 (mock providers), >= 1.9 (parallel execution)
Terraform Test Skill
Write, organize, and run Terraform's built-in test framework for Azure infrastructure modules.
Reference: Terraform Testing Documentation
Quick Reference
| Concept | Description | Min Version |
|---|---|---|
| Test file | .tftest.hcl in tests/ directory |
1.6 |
| Run block | Single test scenario with assertions | 1.6 |
| Assert block | Condition that must be true for test to pass | 1.6 |
| Plan mode | command = plan — validates logic, no resources created |
1.6 |
| Apply mode | command = apply (default) — creates real infrastructure |
1.6 |
| Mock provider | Simulates provider without real API calls | 1.7 |
| Parallel execution | parallel = true on independent run blocks |
1.9 |
| Expect failures | Verify validation rules reject invalid input | 1.6 |
File Structure
my-module/
├── main.tf
├── variables.tf
├── outputs.tf
└── tests/
├── defaults_unit_test.tftest.hcl # Plan mode (fast)
├── validation_unit_test.tftest.hcl # Plan mode (fast)
└── full_stack_integration_test.tftest.hcl # Apply mode (creates resources)
Naming convention: *_unit_test.tftest.hcl (plan mode), *_integration_test.tftest.hcl (apply mode).
Test File Components
- 0–1
testblock (test-wide settings) - 1+
runblocks (test scenarios, sequential by default) - 0–1
variablesblock (file-level inputs, highest precedence) - 0+
providerblocks (provider configuration) - 0+
mock_providerblocks (simulated providers, TF 1.7+)
Canonical Example
See references/test-examples.md for a complete Azure Resource Group test
(unit tests, tag validation, expect_failures).
Key Syntax Rules
Run Block Attributes
| Attribute | Type | Default | Description |
|---|---|---|---|
command |
plan/apply |
apply |
Test mode |
variables |
block | — | Override file-level variables |
module |
block | — | Test alternate module (local/registry only) |
assert |
block (1+) | — | Validation conditions |
expect_failures |
list | — | Expected validation failures |
Assert Syntax
assert {
condition = <boolean expression>
error_message = "Human-readable failure description"
}
Assertions can reference: resource attributes, outputs, run.<name>.<output>, var.*, data sources.
Variables precedence: run-block > file-level > all other sources.
See references/test-examples.md for module blocks, plan options, and prior run references.
Mock Providers (TF 1.7+)
Simulate Azure provider without API calls — ideal for unit tests.
Use mock_provider "azurerm" with mock_resource and mock_data blocks.
When to use: Unit tests, CI without Azure credentials, fast local development.
When NOT to use: Integration tests, validating actual Azure API behavior.
See references/mock-providers.md for full mock patterns and examples.
Common Test Patterns
See references/test-examples.md for: conditional resources, tag validation,
resource count with for_each, variables precedence, and prior run references.
Steps
terraform test # All tests
terraform test tests/defaults.tftest.hcl # Specific file
terraform test -verbose # Detailed output
terraform test -filter=test_resource_group # Filter by name
terraform test -no-cleanup # Debug: keep resources
Rules
- Naming:
*_unit_test.tftest.hcl/*_integration_test.tftest.hcl - Plan mode first: Use
command = planfor fast, cost-free validation - Clear error messages: Describe what went wrong and expected state
- Test isolation: Independent run blocks where possible
- Variable coverage: Test multiple combinations for all code paths
- Mock for speed: Use mock providers in CI without Azure access
- Negative testing: Use
expect_failuresfor validation rule coverage - Sequential only when needed: Only chain run blocks via
run.<name>when required
Terraform MCP Integration
Use mcp_terraform_search_providers to validate that resource types used in
test assertions exist in the target provider version.
Reference Index
| File | Contents |
|---|---|
references/test-examples.md |
Canonical example, common patterns, variables, module blocks |
references/test-patterns.md |
Unit vs integration patterns, CI/CD examples, complex assertions |
references/mock-providers.md |
Mock provider setup, mock resources/data sources, override files |
references/test-execution.md |
CLI commands, parallel execution, verbose/debug, diagnostics |