Integration Testing

By default, each run block executes with command = apply instructing Terraform to execute a complete apply operation against your configuration. You are testing Terraform’s core functionality by executing operations and validating the infrastructure Terraform creates.

Unit Testing

Replacing the command value with command = plan instructs Terraform to not create new infrastructure for this run block. This allows test authors to validate logical operations and custom conditions within their infrastructure in a process analogous to .

https://developer.hashicorp.com/terraform/language/tests


Composition of test

  • discover of test files are based on their file extension: .tftest.hcl or .tftest.json
  • Each test file contains the following root level attributes and blocks:
  • By default, Terraform executes run blocks sequentially.
  • Defining your variables and provider blocks first, at the beginning of the test file, is recommended

Terraform block - run: core unit of test execution Terraform block - test: test configuration Terraform block - variables: in testing file, it pas the variables to all run blocks (can be overridden by the local definition of variables in a run block) Terraform block - providers: set or override the required providers within the main configuration from your testing files


Modules

The module blocks inside run blocks are used to orchestrate which modules to test, and are not the same as traditional Terraform modules used for organizing infrastructure resources.


Folder structure:

.
├── main.tf                    # Main configuration that uploads files to S3
├── file_count.tftest.hcl     # Test file with multiple run blocks
├── testing/
│   ├── setup/
│   │   └── main.tf           # Setup module to create S3 bucket
│   └── loader/
│       └── main.tf           # Loader module to validate S3 objects
└── data/
    └── files/
        ├── file_one.txt      # Sample file 1
        └── file_two.txt      # Sample file 2

.tftest.hcl file is located in the root directory, terraform test command should also be run at the root directory

setup module mainly used for setting up the resources that used for testing loader module mainly used for retrieving the info of the resources using data block.


Variables

In standard work, the values of variables are declared by .tfvar file. However, during the test, Terraform retrieved from what defined in the .tftest.hcl files in the variables block with a specific value with highest precedence, and populate these values into the run block (could be further overridden) in the same file, down to the main script and the modules specified in the run block.


Key Differences Between check and test

Featurecheck Blocktest Framework
PurposeValidate live infrastructure state.Test Terraform configurations in isolation.
Defined In.tf configuration files..tftest.hcl test files.
Execution Commandterraform plan or terraform apply.terraform test.
ScopeRuntime validation of real infrastructure.Pre-deployment testing in a sandbox.
Failure BehaviorWarnings by default; can fail with error.Fails the test suite, no impact on infra.
Use CaseEnforce compliance or invariants.Validate modules or configurations.
EnvironmentRuns against real infrastructure.Runs in a temporary, isolated environment.
Introduced InTerraform 1.5 (enhanced in 1.8).Terraform 1.6.