Implementowanie kompleksowego testowania narzędzia Terratest w projektach programu Terraform
Narzędzie Terraform umożliwia definiowanie, wyświetlanie wersji zapoznawczej i wdrażanie infrastruktury chmury. Za pomocą narzędzia Terraform tworzysz pliki konfiguracji przy użyciu składni HCL. Składnia listy HCL umożliwia określenie dostawcy chmury — takiego jak platforma Azure — oraz elementów tworzących infrastrukturę chmury. Po utworzeniu plików konfiguracji utworzysz plan wykonywania, który umożliwia wyświetlenie podglądu zmian infrastruktury przed ich wdrożeniem. Po zweryfikowaniu zmian należy zastosować plan wykonywania w celu wdrożenia infrastruktury.
Kompleksowe testowanie (E2E) służy do weryfikowania działania programu przed wdrożeniem go w środowisku produkcyjnym. Przykładowy scenariusz może być modułem Terraform wdrażającym dwie maszyny wirtualne w sieci wirtualnej. Możesz uniemożliwić tym dwóm maszynom wykonanie polecenia ping nawzajem. W tym przykładzie można zdefiniować test w celu zweryfikowania zamierzonego wyniku przed wdrożeniem.
Testowanie E2E jest zwykle procesem trzyetapowym.
- Konfiguracja jest stosowana do środowiska testowego.
- Kod jest uruchamiany, aby zweryfikować wyniki.
- Środowisko testowe zostało ponownie zainicjowane lub zdjęte (na przykład cofnięcie przydziału maszyny wirtualnej).
W tym artykule omówiono sposób wykonywania następujących zadań:
- Poznaj podstawy kompleksowego testowania za pomocą narzędzia Terratest
- Dowiedz się, jak napisać kompleksowe testy przy użyciu języka Golang
- Dowiedz się, jak używać usługi Azure DevOps do automatycznego wyzwalania testów end-to-end, gdy kod jest zatwierdzany w repozytorium
1. Konfigurowanie środowiska
- Subskrypcja platformy Azure: jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.
Skonfiguruj narzędzie Terraform: jeśli jeszcze tego nie zrobiono, skonfiguruj program Terraform przy użyciu jednej z następujących opcji:
- Konfigurowanie narzędzia Terraform w usłudze Azure Cloud Shell przy użyciu powłoki Bash
- Konfigurowanie programu Terraform w usłudze Azure Cloud Shell przy użyciu programu PowerShell
- Konfigurowanie programu Terraform w systemie Windows przy użyciu powłoki Bash
- Konfigurowanie programu Terraform w systemie Windows przy użyciu programu PowerShell
Język programowania Go: Zainstaluj język Go.
Przykładowy kod i zasoby: za pomocą narzędzia DownGit pobierz z usługi GitHub projekt kompleksowego testowania i rozpakuj go do nowego katalogu, aby zawierał przykładowy kod. Ten katalog jest określany jako przykładowy katalog.
2. Omówienie kompleksowego testowania
Kompleksowe testy weryfikują, czy system działa jako całość zbiorcza. Ten typ testowania jest w przeciwieństwie do testowania określonych modułów. W przypadku projektów Programu Terraform kompleksowe testowanie umożliwia sprawdzenie, co zostało wdrożone. Ten typ testowania różni się od wielu innych typów, które testuje scenariusze przed wdrożeniem. Kompleksowe testy mają kluczowe znaczenie dla testowania złożonych systemów, które obejmują wiele modułów i działają na wielu zasobach. W takich scenariuszach kompleksowe testowanie jest jedynym sposobem określenia, czy różne moduły działają poprawnie.
W tym artykule skupiono się na korzystaniu z narzędzia Terratest w celu zaimplementowania kompleksowego testowania. Narzędzie Terratest udostępnia całą instalację wodną, która jest wymagana do wykonania następującego zadania:
- Wdrażanie konfiguracji narzędzia Terraform
- Umożliwia napisanie testu przy użyciu języka Go w celu sprawdzenia, co zostało wdrożone
- Organizowanie testów na etapy
- Odręć wdrożonej infrastruktury
3. Omówienie przykładu testu
W tym artykule używamy przykładu dostępnego w repozytorium przykładowym platformy Azure/terraform.
W tym przykładzie zdefiniowano konfigurację programu Terraform, która wdraża dwie maszyny wirtualne z systemem Linux w tej samej sieci wirtualnej. Jedna maszyna wirtualna o nazwie vm-linux-1
ma publiczny adres IP. Tylko port 22 jest otwarty, aby zezwolić na połączenia SSH. Druga maszyna wirtualna — vm-linux-2
nie ma zdefiniowanego publicznego adresu IP.
Test sprawdza poprawność następujących scenariuszy:
- Infrastruktura jest wdrażana prawidłowo
- Przy użyciu portu 22 można otworzyć sesję SSH w celu
vm-linux-1
- Za pomocą sesji SSH w systemie
vm-linux-1
można wysłać polecenie pingvm-linux-2
Jeśli pobrano przykład, w pliku można znaleźć konfigurację narzędzia Terraform dla tego scenariusza src/main.tf
. Plik main.tf
zawiera wszystkie elementy niezbędne do wdrożenia infrastruktury platformy Azure przedstawionej na poprzedniej ilustracji.
Jeśli nie znasz sposobu tworzenia maszyny wirtualnej, zobacz Tworzenie maszyny wirtualnej z systemem Linux z infrastrukturą na platformie Azure przy użyciu narzędzia Terraform.
Uwaga
Przykładowy scenariusz przedstawiony w tym artykule służy tylko do celów ilustracyjnych. Celowo zachowaliśmy proste rzeczy, aby skupić się na krokach kompleksowego testu. Nie zalecamy posiadania produkcyjnych maszyn wirtualnych, które uwidacznia porty SSH za pośrednictwem publicznego adresu IP.
4. Badanie przykładu testu
Test end-to-end jest napisany w języku Go i używa struktury Terratest. Jeśli pobrano przykład, test jest zdefiniowany w src/test/end2end_test.go
pliku .
Poniższy kod źródłowy przedstawia standardową strukturę testu Golang przy użyciu narzędzia 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)
})
}
Jak widać w poprzednim fragmencie kodu, test składa się z trzech etapów:
- setup: Uruchamia narzędzie Terraform w celu wdrożenia konfiguracji
- validate": Czy sprawdzanie poprawności i asercji
- zerwanie: czyści infrastrukturę po uruchomieniu testu
Na poniższej liście przedstawiono niektóre kluczowe funkcje udostępniane przez platformę Terratest:
- Terraform. InitAndApply: włącza uruchamianie
terraform init
iterraform apply
z poziomu kodu języka Go - Terraform. Dane wyjściowe: pobiera wartość zmiennej wyjściowej wdrożenia.
- Terraform. Destroy: uruchamia
terraform destroy
polecenie z poziomu kodu Języka Go. - test_structure. LoadTerraformOptions: ładuje opcje narzędzia Terraform — takie jak konfiguracja i zmienne — ze stanu
- test_structure. SaveTerraformOptions: zapisuje opcje programu Terraform — takie jak konfiguracja i zmienne — do stanu
5. Uruchom przykład testu
W poniższych krokach uruchom test dla przykładowej konfiguracji i wdrożenia.
Otwórz okno powłoki bash/terminalu.
Zaloguj się do konta platformy Azure.
Aby uruchomić ten przykładowy test, potrzebujesz nazwy
id_rsa
pary kluczy prywatnych/publicznych SSH iid_rsa.pub
katalogu macierzystego. Zastąp<your_user_name>
ciąg nazwą katalogu macierzystego.export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
W przykładowym katalogu przejdź do
src/test
katalogu.Uruchom test.
go test -v ./ -timeout 10m
6. Sprawdź wyniki
Po pomyślnym uruchomieniu go test
polecenia zobaczysz wyniki podobne do następujących danych wyjściowych:
--- PASS: TestEndToEndDeploymentScenario (390.99s)
PASS
ok test 391.052s
Rozwiązywanie problemów z programem Terraform na platformie Azure
Rozwiązywanie typowych problemów podczas korzystania z narzędzia Terraform na platformie Azure