Framework de tests intégré à Terraform (depuis la version 1.6). Permet d’écrire des tests automatisés pour valider que l’infrastructure se comporte comme prévu.


Options principales

OptionDéfautDescription
-filter=FICHIERtous les .tftest.hclN’exécuter qu’un fichier de test
-var="key=value"aucuneVariable inline
-var-file=FICHIERaucuneFichier de variables
-verbosenonAfficher les détails de chaque assertion
-jsonnonSortie JSON (pour CI)

Structure d’un fichier de test

Les fichiers de test ont l’extension .tftest.hcl.

mon-module/
├── main.tf
├── variables.tf
├── outputs.tf
└── tests/
    ├── basic.tftest.hcl
    └── advanced.tftest.hcl

Syntaxe d’un test

# tests/basic.tftest.hcl
 
# Variables pour tous les tests de ce fichier
variables {
  env          = "test"
  instance_type = "t3.micro"
}
 
# Un bloc run = un test
run "create_instance" {
  command = apply   # apply (défaut) ou plan
 
  # Assertions sur le résultat
  assert {
    condition     = aws_instance.web.instance_type == "t3.micro"
    error_message = "Le type d'instance est incorrect."
  }
 
  assert {
    condition     = aws_instance.web.tags["Environment"] == "test"
    error_message = "Le tag Environment est manquant ou incorrect."
  }
}
 
run "verify_outputs" {
  command = plan   # test sans créer de ressources (plus rapide)
 
  assert {
    condition     = output.instance_ip != ""
    error_message = "L'output instance_ip ne doit pas être vide."
  }
}

Exemples de cas d’usage

# tests/vpc.tftest.hcl
 
variables {
  vpc_cidr = "10.0.0.0/16"
  env      = "test"
}
 
# Test 1 : vérifier la configuration réseau
run "vpc_cidr_is_correct" {
  command = plan
 
  assert {
    condition     = aws_vpc.this.cidr_block == "10.0.0.0/16"
    error_message = "CIDR du VPC incorrect."
  }
}
 
# Test 2 : vérifier le nombre de subnets créés
run "correct_number_of_subnets" {
  variables {
    availability_zones = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
  }
 
  assert {
    condition     = length(aws_subnet.private) == 3
    error_message = "Doit créer 3 subnets privés."
  }
}
 
# Test 3 : vérifier qu'une validation de variable fonctionne
run "invalid_env_fails" {
  variables {
    env = "invalid"   # doit déclencher la validation
  }
 
  # On s'attend à ce que la commande échoue
  expect_failures = [var.env]
}

Lancer les tests

# Tous les tests (dossier tests/ ou *.tftest.hcl)
terraform test
 
# Un fichier spécifique
terraform test -filter=tests/vpc.tftest.hcl
 
# Avec variables
terraform test -var-file=test.tfvars
 
# Mode verbeux
terraform test -verbose
 
# Sortie JSON pour CI
terraform test -json | jq .
 
# ⚠️ terraform test CRÉE et DÉTRUIT les ressources réelles
# Pour éviter ça, utiliser command = plan dans les runs

Bonnes pratiques

# 1. Utiliser command = plan par défaut pour les tests rapides
# 2. Réserver command = apply pour les tests d'intégration critiques
# 3. Nommer les tests de manière descriptive
# 4. Tester les cas d'erreur avec expect_failures
# 5. Utiliser des variables de test dédiées (jamais les vraies credentials prod)
 
# Exécuter en CI après validate et fmt
terraform fmt -check
terraform validate
terraform test -json | jq '.success'

En relation avec