Série Terraform-Terratest - Implémentation des exigences fonctionnelles (4/4)

Finalisation du développement de notre module

Séries - Développement d'un module Terraform avec Terratest

Entamons la phase finale de notre module (et donc de notre série), à savoir l’implémentation des exigences fonctionnelles.

Dans les trois premiers articles, nous avons défini le cahier des charges, initialisé un module vierge, définit les tests fonctionnels en lien avec le cahier des charges. Dans ce dernier article, nous passons (enfin) à l’implémentation de ces exigences permettant de passer et valider les tests fonctionnels développés précédemment.

Pour réaliser l’implémentation, je vous propose de nous laisser guider par les résultats du test Terratest.

Exécutons Terratest :

1
go test -v -timeout 30m

Le résultat est le suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
TestSimpleExample 2024-05-21T22:00:48+02:00 retry.go:99: Returning due to fatal error: FatalError{Underlying: error while running command: exit status 1; ╷
│ Error: Unsupported argument
│   on main.tf line 5, in module "simple_example":
│    5:   your_name_here = "test-1"
│ An argument named "your_name_here" is not expected here.
╵}
[...]
--- FAIL: TestSimpleExample (0.09s)
FAIL
exit status 1
FAIL    tf-module-demo-terratest        0.125s

Ici, Terratest nous spécifie que la variable your_name_here est manquante dans notre module. Ajoutons donc dans un premier temps cette variable your_name_here :

1
2
3
4
5
# variables.tf
variable "your_name_here" {
  type        = string
  description = "Your name"
}

Re-jouons le test :

1
go test -v -timeout 30m

Le résultat est le suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
TestSimpleExample 2024-05-21T22:03:03+02:00 retry.go:99: Returning due to fatal error: FatalError{Underlying: error while running command: exit status 1; ╷
│ Error: Unsupported attribute
│   on outputs.tf line 3, in output "test_output":
│    3:   value       = module.simple_example.hello_world
│     ├────────────────
│     │ module.simple_example is a object
│ This object does not have an attribute named "hello_world".
╵}
[...]
--- FAIL: TestSimpleExample (0.09s)
FAIL
exit status 1
FAIL    tf-module-demo-terratest        0.125s

L’erreur This object does not have an attribute named "hello_world" nous spécifie que le module ne renvoie pas d’output hello_world. Ajoutons-le :

1
2
3
4
# outputs.tf
output "hello_world" {
  value = ""
}

Re-jouons le test :

1
go test -v -timeout 30m

Le résultat est le suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
TestSimpleExample 2024-05-21T22:05:40+02:00 logger.go:66: ""
    simple_example_test.go:22:
                Error Trace:    /home/puddi-pc/tf-module-demo-terratest/test/simple_example_test.go:22
                Error:          Not equal:
                                expected: "Hello test-1"
                                actual  : ""

                                Diff:
                                --- Expected
                                +++ Actual
                                @@ -1 +1 @@
                                -Hello test-1
                                +
                Test:           TestSimpleExample
[...]
--- FAIL: TestSimpleExample (0.13s)
FAIL
exit status 1
FAIL    tf-module-demo-terratest        0.167s

L’erreur ici nous spécifie que le contenu de la variable hello_world ne correspond pas à l’attendu. Spécifions-le :

1
2
3
4
# outputs.tf
output "hello_world" {
  value = "Hello ${var.your_name_here}"
}

Re-jouons le test :

1
go test -v -timeout 30m
1
2
3
--- PASS: TestSimpleExample (0.14s)
PASS
ok      tf-module-demo-terratest        0.169s

Cette fois, c’est bon 🎉 ! Notre module correspond maintenant aux spécifications fonctionnelles définit dans le cahier des charges.

Astuce
Le code produit à cette étape peut être retrouvé ici.

Cette implémentation clôture la série d’articles sur les tests de module Terraform avec Terratest.

Je reconnais que l’intérêt des tests Terratest dans le cadre de cas d’usage n’est pas évident de prime abord. Cependant, rappelons que l’exemple choisit était volontairement simpliste.

Dans le cas d’un module plus complexe, l’intérêt des tests est beaucoup plus évident. En effet, ils permettent de détecter rapidement des différences de comportement lors du développement de nouvelles features ou bien simplement lors de l’upgrade des versions de providers (dans le cas de breaking changes notamement).

Enfin, le dernier intérêt de ces tests Terratest est que nous disposons ici d’un exemple testé qui peut être exposé directement aux utilisateurs dans le README.md grace à des outils comme terraform-docs (cf. ce commit)

J’espère vous avoir convaincu de l’intérêt des tests avec Terratest ainsi que la simplicité de mise en place de ceux-ci.