Hallo an alle. Heute teilen wir Ihnen den letzten Teil des Artikels
„Testen der Infrastruktur als Code mit Pulumi“ mit , dessen Übersetzung speziell für Studenten des Kurses
„DevOps Practices and Tools“ erstellt wurde .

Bereitstellungstests
Der getestete Teststil ist ein leistungsstarker Ansatz, mit dem wir eine weiße Box testen können, um die Innenseiten unseres Infrastrukturcodes zu überprüfen. Es schränkt jedoch etwas ein, was wir überprüfen können. Tests werden auf der Grundlage eines von Pulumi vor der direkten Bereitstellung erstellten In-Memory-Bereitstellungsplans durchgeführt. Daher kann die Bereitstellung selbst nicht getestet werden. Für solche Fälle verfügt Pulumi über ein Integrationstest-Framework. Und diese beiden Ansätze arbeiten hervorragend zusammen!
Das Pulumi-Integrationstest-Framework ist in Go geschrieben und mit seiner Hilfe testen wir den größten Teil unseres internen Codes. Wenn der zuvor diskutierte Unit-Test-Ansatz eher dem White-Box-Test ähnelte, ist der Integrationstest eine Black-Box. (Es gibt auch Optionen für gründliche interne Tests.) Dieses Framework wurde erstellt, um das gesamte Pulumi-Programm zu übernehmen und verschiedene Lebenszyklusvorgänge auszuführen, z. B. das Bereitstellen eines neuen Stacks von Grund auf, das Aktualisieren mit Variationen und das Löschen, möglicherweise mehrmals. Wir führen sie regelmäßig (zum Beispiel nachts) und als Stresstest durch.
(Wir
arbeiten daran, sicherzustellen, dass ähnliche Integrationstestfunktionen im SDK der Muttersprache verfügbar sind. Sie können das Go-Integrationstest-Framework unabhängig von der Sprache verwenden, in der Ihr Pulumi-Programm geschrieben ist.)
Wenn Sie das Programm mit diesem Framework ausführen, können Sie Folgendes überprüfen:
- Ihr Projektcode ist syntaktisch korrekt und funktioniert fehlerfrei.
- Die Konfigurationseinstellungen für Stapel und Geheimnisse funktionieren und werden korrekt interpretiert.
- Ihr Projekt kann erfolgreich bei Ihrem ausgewählten Cloud-Anbieter bereitgestellt werden.
- Ihr Projekt kann erfolgreich vom Ausgangszustand auf N andere Zustände aktualisiert werden.
- Ihr Projekt kann erfolgreich zerstört und von Ihrem Cloud-Anbieter gelöscht werden.
Wie wir bald sehen werden, kann dieses Framework auch zur Durchführung der Laufzeitvalidierung verwendet werden.
Einfacher Integrationstest
Um dies in Aktion zu sehen, werden wir uns das
pulumi/examples
Repository
pulumi/examples
, da unser Team und die Pulumi-Community es verwenden, um ihren eigenen Pool von Anfragen, Commits und nächtlichen Builds zu testen.
Im Folgenden finden Sie einen vereinfachten Test unseres
Beispiels, in dem der S3-Bucket und einige andere Objekte bereitgestellt werden :
example_test.go:
package test import ( "os" "path" "testing" "github.com/pulumi/pulumi/pkg/testing/integration" ) func TestExamples(t *testing.T) { awsRegion := os.Getenv("AWS_REGION") if awsRegion == "" { awsRegion = "us-west-1" } cwd, _ := os.Getwd() integration.ProgramTest(t, &integration.ProgramTestOptions{ Quick: true, SkipRefresh: true, Dir: path.Join(cwd, "..", "..", "aws-js-s3-folder"), Config: map[string]string{ "aws:region": awsRegion, }, }) }
Dieser Test durchläuft den grundlegenden Lebenszyklus des Erstellens,
aws-js-s3-folder
und Zerstörens des Stapels für den
aws-js-s3-folder
. Es dauert ungefähr eine Minute, um den bestandenen Test zu melden:
$ go test . PASS ok ... 43.993s
Es gibt viele Möglichkeiten, das Verhalten dieser Tests anzupassen.
Eine vollständige Liste der Optionen finden Sie in der
ProgramTestOptions
Struktur . Sie können beispielsweise den Jaeger-Endpunkt für die Ablaufverfolgung (Ablaufverfolgung) konfigurieren, angeben, dass der Test während eines negativen Tests
ExpectFailure
(
ExpectFailure
), eine Reihe von „Änderungen“ auf das Programm für aufeinanderfolgende
EditDirs
(
EditDirs
)
EditDirs
und vieles mehr. Lassen Sie uns sehen, wie Sie sie zum Überprüfen der Anwendungsbereitstellung verwenden.
Überprüfen der Ressourceneigenschaften
Die oben erwähnte Integration stellt sicher, dass unser Programm "funktioniert" - es stürzt nicht ab. Was aber, wenn wir die Eigenschaften des resultierenden Stapels überprüfen möchten? Zum Beispiel, dass bestimmte Arten von Ressourcen vorbereitet wurden (oder nicht) und dass sie bestimmte Attribute haben.
Mit
ExtraRuntimeValidation
Parameter
ExtraRuntimeValidation
für
ProgramTestOptions
können wir den von Pulumi nach der Bereitstellung aufgezeichneten Status (Status nach der Bereitstellung) anzeigen, um zusätzliche Überprüfungen durchführen zu können. Dies umfasst eine vollständige Momentaufnahme des Status des resultierenden Stapels, einschließlich Konfiguration, exportierter Ausgabewerte, aller Ressourcen und ihrer Eigenschaftswerte sowie aller Abhängigkeiten zwischen Ressourcen.
Um ein grundlegendes Beispiel dafür zu sehen, überprüfen wir, ob unser Programm einen
S3-Bucket erstellt :
integration.ProgramTest(t, &integration.ProgramTestOptions{
Wenn wir jetzt den Go-Test ausführen, werden nicht nur die zahlreichen Lebenszyklus-Tests durchlaufen, sondern nach erfolgreicher Bereitstellung des Stacks wird auch eine zusätzliche Überprüfung des resultierenden Status durchgeführt.
Laufzeit-Tests
Bisher befassten sich alle Tests ausschließlich mit dem Bereitstellungsverhalten und dem Pulumi-Ressourcenmodell. Was ist, wenn Sie überprüfen möchten, ob Ihre vorbereitete Infrastruktur wirklich funktioniert? Wenn beispielsweise die virtuelle Maschine ausgeführt wird, enthält der S3-Bucket das, was wir erwarten, und so weiter.
Möglicherweise haben Sie bereits herausgefunden, wie das geht: Die Option
ProgramTestOptions
für
ProgramTestOptions
ist hierfür eine großartige Gelegenheit. Zu diesem Zeitpunkt führen Sie einen beliebigen Go-Test mit Zugriff auf den vollständigen Status der Ressourcen Ihres Programms durch. Dieser Status enthält Informationen wie IP-Adressen von virtuellen Maschinen, URLs und alles, was für die reale Interaktion mit den empfangenen Cloud-Anwendungen und der empfangenen Infrastruktur erforderlich ist.
Unser Testprogramm exportiert beispielsweise eine
webEndpoint
Bucket-Eigenschaft namens
websiteUrl
.
websiteUrl
ist die vollständige URL, unter der wir das angepasste
webEndpoint
websiteUrl
können. Obwohl wir in die Statusdatei eintauchen könnten, um den
bucket
zu finden und diese Eigenschaft direkt zu lesen, exportieren unsere Stapel in vielen Fällen nützliche Eigenschaften wie diese, die wir bequem überprüfen können:
integration.ProgramTest(t, &integration.ProgramTestOptions{
Wie bei unseren vorherigen Laufzeitprüfungen wird diese Prüfung unmittelbar nach dem Anheben des Stapels durchgeführt, und dies alles als Reaktion auf einen einfachen Aufruf zum
go test
. Und dies ist nur die Spitze des Eisbergs - alle Go-Testfunktionen, die Sie in Code schreiben können, sind verfügbar.
Kontinuierliche Infrastrukturintegration
Es ist gut, Tests auf einem Laptop ausführen zu können, wenn viele Änderungen an der Infrastruktur vorgenommen werden, um sie zu testen, bevor sie an Codeüberprüfungen gesendet werden. Wir und viele unserer Kunden testen die Infrastruktur jedoch in verschiedenen Phasen des Entwicklungslebenszyklus:
- In jedem offenen Pool die Anforderung für den Test vor der Fusion.
- Überprüfen Sie als Antwort auf jedes Commit, ob die Zusammenführung korrekt durchgeführt wurde.
- In regelmäßigen Abständen, zum Beispiel nachts oder wöchentlich für zusätzliche Tests.
- Im Rahmen von Leistungstests oder Stresstests, die normalerweise über einen langen Zeitraum durchgeführt werden und Tests parallel ausführen und / oder dasselbe Programm mehrmals bereitstellen.
Für jeden von ihnen unterstützt Pulumi die Integration in Ihr bevorzugtes kontinuierliches Integrationssystem. Durch die kontinuierliche Integration erhalten Sie für Ihre Infrastruktur dieselbe Testabdeckung wie für Anwendungssoftware.
Pulumi unterstützt gängige CI-Systeme. Hier sind einige davon:
Weitere Informationen finden Sie in der Dokumentation zur
kontinuierlichen Lieferung .
Vergängliche Umgebungen
Eine sehr leistungsstarke Funktion, die sich öffnet, ist die Möglichkeit, kurzlebige Umgebungen ausschließlich zum Zweck von Abnahmetests bereitzustellen. Das Pulumi-
Projekt- und Stack- Konzept ist so konzipiert, dass vollständig isolierte und unabhängige Umgebungen in wenigen einfachen CLI-Befehlen oder über ein Integrationstest-Framework problemlos bereitgestellt und zerstört werden können.
Wenn Sie GitHub verwenden, bietet Pulumi die
GitHub-App an , mit der Sie Akzeptanztests mit dem Anforderungspool in Ihrer CI-Pipeline verbinden können. Installieren Sie einfach die Anwendung im GitHub-Repository, und Pulumi fügt Ihrem CI und dem Pool von Anforderungen Informationen zur Infrastrukturvorschau, zu Aktualisierungen und Testergebnissen hinzu:

Wenn Sie Pulumi für Ihre grundlegenden Abnahmetests verwenden, verfügen Sie über neue Automatisierungsfunktionen, die die Teamleistung verbessern und Vertrauen in die Qualität der Änderungen geben.
Zusammenfassung
In diesem Artikel haben wir gesehen, dass uns bei der Verwendung allgemeiner Programmiersprachen viele Softwareentwicklungsmethoden zur Verfügung stehen, die bei der Entwicklung unserer Anwendungen hilfreich waren. Dazu gehören Unit-Tests, Integrationstests und deren Interaktion zur Durchführung umfangreicher Laufzeit-Tests. Tests können einfach bei Bedarf oder in Ihrem CI-System ausgeführt werden.
Pulumi ist Open Source Software, kostenlos zu verwenden und funktioniert mit Ihren bevorzugten Programmiersprachen und Clouds -
probieren Sie es noch heute aus !
→
Der erste Teil