Série Terraform-Terratest - Implémentation des tests fonctionnels (3/4)

Développement des tests en lien avec le cahier des charges

L’enveloppe de notre module étant complète, nous pouvons maintenant rentrer dans la partie fonctionnelle. Pour cela, nous allons réaliser l’implémentation des tests fonctionnels qui nous permettrons de valider que les développements répondent au cahier des charges.

Nous allons tout d’abord modifier notre exemple pour spécifier les interfaces attendues. Pour rappel, le cahier des charges définit les interfaces suivantes :

  • En entrée :
    • Une variable your_name_here de type chaîne de caractère.
  • En sortie :
    • Une variable hello_world.

Modifions donc notre exemple pour ajouter le paramètre d’entrée :

1
2
3
4
5
6
# examples/simple_example/main.tf
module "simple_example" {
  source = "../.."

  your_name_here = "test-1" # ajout du paramètre your_name_here
}

Spécifions désormais la sortie attendue. Pour cela, créons un fichier examples/simple_example/outputs.tf à notre exemple dont le contenu est le suivant :

1
2
3
4
5
# examples/simple_example/outputs.tf
output "test_output" {
  value       = module.simple_example.hello_world
  description = "Contenu de l'output hello_world du module"
}
Astuce
Le code produit à cette étape peut être retrouvé ici.

Après les premiers tests basiques d’interfaces, procédons au contrôle des valeurs retournées. Pour cela, retournons sur notre code Terratest en Go et ajoutons les lignes suivantes :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package test

import (
 "testing"

 "github.com/gruntwork-io/terratest/modules/terraform"
 "github.com/stretchr/testify/assert" // nouvelle ligne
)

func TestSimpleExample(t *testing.T) {
 t.Parallel()

 terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
  TerraformDir: "../examples/simple_example",
 })

 defer terraform.Destroy(t, terraformOptions)

 terraform.InitAndApply(t, terraformOptions)

 output := terraform.Output(t, terraformOptions, "test_output") // nouvelle ligne
 assert.Equal(t, "Hello test-1", output) // nouvelle ligne
}

Une nouvelle fois, rentrons un peu dans le code produit :

  • "github.com/stretchr/testify/assert": import d’une nouvelle librairie Go dédiée au test.
  • output := terraform.Output(t, terraformOptions, "test_output") : Récupération de l’output de notre exemple
  • assert.Equal(t, "Hello test-1", output) : Comparaison de l’output de notre exemple avec la valeur attendue Hello test-1.
Astuce
Le code produit à cette étape peut être retrouvé ici.

Relançons maintenant le test pour constater le résultat. Pour rappel, la commande est la suivante :

1
2
cd test
go test -v -timeout 30m

Le retour est alors :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[...]
TestSimpleExample 2024-05-21T21:42:53+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.10s)
FAIL
exit status 1
FAIL    tf-module-demo-terratest        0.133s

Comme attendu, le test échoue. Ici, l’erreur nous spécifie qu’un paramètre your_name_here a été spécifié dans notre exemple alors que celui-ci n’est pas (pas encore) attendu par notre module.

Rendez-vous dans le quatrième et dernier article de cette série pour le détail de l’implémentation dans notre module.