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.
- Eine Konfiguration wird auf eine Testumgebung angewendet.
- Code wird ausgeführt, um die Ergebnisse zu überprüfen.
- 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.
Konfigurieren von Terraform: Konfigurieren Sie Terraform mithilfe einer der folgenden Optionen, sofern noch nicht geschehen:
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 aufvm-linux-1
zu pingen?
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
undterraform 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.
Öffnen Sie ein Bash-/Terminalfenster.
Melden Sie sich beim Azure-Konto an.
Zum Ausführen dieses Beispieltests benötigen Sie den Namen eines privaten/öffentlichen Schlüsselpaars (
id_rsa
undid_rsa.pub
) in Ihrem Basisverzeichnis. Ersetzen Sie<your_user_name>
durch den Namen Ihres Basisverzeichnisses.export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
Navigieren Sie im Beispielverzeichnis zum Verzeichnis
src/test
.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