Implementieren von End-to-End-Terratest-Tests für Terraform-Projekte

Mit Terraform können Sie eine Cloudinfrastruktur definieren, eine Vorschau der Cloudinfrastruktur anzeigen und die Cloudinfrastruktur bereitstellen. Terraform ermöglicht das Erstellen von Konfigurationsdateien mit HCL-Syntax. Mit der HCL-Syntax können Sie den Cloudanbieter (beispielsweise Azure) und die Elemente angeben, aus denen sich Ihre Cloudinfrastruktur zusammensetzt. Nach der Erstellung Ihrer Konfigurationsdateien erstellen Sie einen Ausführungsplan, mit dem Sie eine Vorschau Ihrer Infrastrukturänderungen anzeigen können, bevor diese bereitgestellt werden. Nach der Überprüfung der Änderungen wenden Sie den Ausführungsplan an, um die Infrastruktur bereitzustellen.

Mithilfe von End-to-End-Tests (E2E) wird überprüft, ob ein Programm funktioniert, bevor es in der Produktion bereitgestellt wird. Ein Beispielszenario ist ein Terraform-Modul, das zwei VMs in einem virtuellen Netzwerk bereitstellt. Wenn Sie in diesem Beispiel verhindern möchten, dass die beiden VMs einander pingen, können Sie einen Test definieren, um das gewünschte Ergebnis vor der Bereitstellung zu überprüfen.

Ein E2E-Test besteht in der Regel aus drei Schritten.

  1. Eine Konfiguration wird auf eine Testumgebung angewendet.
  2. Code wird ausgeführt, um die Ergebnisse zu überprüfen.
  3. Die Testumgebung wird entweder erneut initialisiert oder entfernt (z. B. durch Aufheben der Zuordnung einer VM).

In diesem Artikel werden folgende Vorgehensweisen behandelt:

  • Grundlegendes zu End-to-End-Tests mit Terratest
  • Schreiben eines End-to-End-Tests mit Golang
  • Verwenden von Azure DevOps zum automatischen Auslösen von End-to-End-Tests, wenn Code in Ihr Repository committet wird

1. Konfigurieren Ihrer Umgebung

  • Azure-Abonnement: Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
  • Programmiersprache Go: Installieren Sie Go.

  • Beispielcode und Ressourcen: Laden Sie mithilfe des DownGit-Tools das Projekt „end-to-end-testing“ von GitHub herunter, und entpacken Sie es in einem neuen Verzeichnis, das den Beispielcode enthalten soll. Dieses Verzeichnis wird als Beispielverzeichnis bezeichnet.

2. Grundlegendes zu End-to-End-Tests

Mit End-to-End-Tests wird überprüft, ob ein System als Ganzes funktioniert. Im Gegensatz zu diesem Testtyp steht das Testen einzelner Module. Bei Terraform-Projekten ermöglichen End-to-End-Tests die Validierung des bereitgestellten Codes. Diese Tests unterscheiden sich von vielen anderen Testtypen, mit denen Szenarien vor der Bereitstellung getestet werden. End-to-End-Tests sind wichtig für das Testen komplexer Systeme, die mehrere Module enthalten und Aktionen für mehrere Ressourcen ausführen. In solchen Szenarien sind End-to-End-Tests die einzige Möglichkeit, um festzustellen, ob die verschiedenen Module korrekt miteinander interagieren.

Den Schwerpunkt dieses Artikels bildet die Verwendung von Terratest zum Implementieren von End-to-End-Tests. Terratest bietet alle Basisfunktionen, die Sie zum Ausführen der folgenden Aufgaben benötigen:

  • Bereitstellen einer Terraform-Konfiguration
  • Schreiben eines Tests mit der Sprache Go, um den bereitgestellten Code zu überprüfen
  • Orchestrieren der Tests in Phasen
  • Entfernen der bereitgestellten Infrastruktur

3. Grundlegendes zum Testbeispiel

In diesem Artikel verwenden Sie ein Beispiel, das im Azure/Terraform-Beispielrepository verfügbar ist.

Dieses Beispiel definiert eine Terraform-Konfiguration, die zwei Linux-VMs im gleichen virtuellen Netzwerk bereitstellt. Die VM vm-linux-1 verfügt über eine öffentliche IP-Adresse. Nur Port 22 wird geöffnet, um SSH-Verbindungen zuzulassen. Die zweite VM vm-linux-2 hat keine definierte öffentliche IP-Adresse.

Mit dem Test werden die folgenden Szenarien überprüft:

  • Wurde die Infrastruktur korrekt bereitgestellt?
  • Ist es möglich, über Port 22 eine SSH-Sitzung mit vm-linux-1 zu öffnen?
  • Ist es möglich, vm-linux-2 unter Verwendung der SSH-Sitzung auf vm-linux-1 zu pingen?

Sample end-to-end test scenario

Wenn Sie das Beispiel heruntergeladen haben, finden Sie die Terraform-Konfiguration für dieses Szenario in der Datei src/main.tf. Die Datei main.tf enthält alles, was Sie zur Bereitstellung der oben dargestellten Azure-Infrastruktur benötigen.

Falls Sie nicht mit dem Erstellen eines virtuellen Computers vertraut sind, lesen Sie Erstellen einer Linux-VM mit Infrastruktur in Azure mit Terraform.

Achtung

Das in diesem Artikel verwendete Beispielszenario dient nur zur Veranschaulichung. Das Szenario wurde bewusst einfach gehalten, damit wir uns auf die Schritte eines End-to-End-Tests konzentrieren können. Wir raten davon ab, Produktions-VMs zu verwenden, die SSH-Ports über eine öffentliche IP-Adresse verfügbar machen.

4. Untersuchen des Testbeispiels

Der End-to-End-Test ist in der Sprache Go geschrieben und verwendet das Terratest-Framework. Wenn Sie das Beispiel heruntergeladen haben, ist der Test in der Datei src/test/end2end_test.go definiert.

Der folgende Quellcode zeigt die Standardstruktur eines Golang-Tests mit Terratest:

package test

import (
    "testing"

    "github.com/gruntwork-io/terratest/modules/terraform"
    test_structure "github.com/gruntwork-io/terratest/modules/test-structure"
)

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

    fixtureFolder := "../"

    // Use Terratest to deploy the infrastructure
    test_structure.RunTestStage(t, "setup", func() {
        terraformOptions := &terraform.Options{
            // Indicate the directory that contains the Terraform configuration to deploy
            TerraformDir: fixtureFolder,
        }

        // Save options for later test stages
        test_structure.SaveTerraformOptions(t, fixtureFolder, terraformOptions)

        // Triggers the terraform init and terraform apply command
        terraform.InitAndApply(t, terraformOptions)
    })

    test_structure.RunTestStage(t, "validate", func() {
        // run validation checks here
        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
		    publicIpAddress := terraform.Output(t, terraformOptions, "public_ip_address")
    })

    // When the test is completed, teardown the infrastructure by calling terraform destroy
    test_structure.RunTestStage(t, "teardown", func() {
        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
        terraform.Destroy(t, terraformOptions)
    })
}

Wie Sie im obigen Codeausschnitt sehen können, besteht der Test aus drei Phasen:

  • setup: Führt Terraform aus, um die Konfiguration bereitzustellen
  • validate': Führt die Überprüfungen und Assertionen durch.
  • Teardown: Bereinigt die Infrastruktur, nachdem der Test ausgeführt wurde

In der folgenden Liste sind einige der wichtigsten Funktionen des Terratest-Frameworks aufgeführt:

  • terraform. InitAndApply: Aktiviert das Ausführen terraform init und terraform apply von Go-Code
  • terraform. Ausgabe: Ruft den Wert der Bereitstellungsausgabevariable ab.
  • terraform. Destroy: Führt den terraform destroy Befehl im Go-Code aus.
  • test_structure. LoadTerraformOptions: Lädt Terraform-Optionen - z. B. Konfiguration und Variablen - aus dem Zustand
  • test_structure. SaveTerraformOptions: Speichert Terraform-Optionen – z. B. Konfiguration und Variablen – im Zustand

5. Ausführen des Testbeispiels

In den folgenden Schritten wird der Test für die Beispielkonfiguration und -bereitstellung ausgeführt.

  1. Öffnen Sie ein Bash-/Terminalfenster.

  2. Melden Sie sich beim Azure-Konto an.

  3. Zum Ausführen dieses Beispieltests benötigen Sie den Namen eines privaten/öffentlichen Schlüsselpaars (id_rsa und id_rsa.pub) in Ihrem Basisverzeichnis. Ersetzen Sie <your_user_name> durch den Namen Ihres Basisverzeichnisses.

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. Navigieren Sie im Beispielverzeichnis zum Verzeichnis src/test.

  5. Führen Sie den Test aus.

    go test -v ./ -timeout 10m
    

6. Überprüfen der Ergebnisse

Nach der erfolgreichen Ausführung von go test wird in etwa die folgende Ausgabe angezeigt:

--- PASS: TestEndToEndDeploymentScenario (390.99s)
PASS
ok      test    391.052s

Problembehandlung für Terraform in Azure

Behandeln allgemeiner Probleme bei der Verwendung von Terraform in Azure

Nächste Schritte