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
| Option | Défaut | Description |
|---|---|---|
-filter=FICHIER | tous les .tftest.hcl | N’exécuter qu’un fichier de test |
-var="key=value" | aucune | Variable inline |
-var-file=FICHIER | aucune | Fichier de variables |
-verbose | non | Afficher les détails de chaque assertion |
-json | non | Sortie 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 runsBonnes 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
- Qualité et code — Vue d’ensemble — hub qualité
- terraform validate — validation syntaxique avant les tests
- Blocs fondamentaux — syntaxe des ressources testées