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.

  1. Konfiguracja jest stosowana do środowiska testowego.
  2. Kod jest uruchamiany, aby zweryfikować wyniki.
  3. Ś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.
  • 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-1można wysłać polecenie ping vm-linux-2

Sample end-to-end test scenario

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 i terraform 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.

  1. Otwórz okno powłoki bash/terminalu.

  2. Zaloguj się do konta platformy Azure.

  3. Aby uruchomić ten przykładowy test, potrzebujesz nazwy id_rsa pary kluczy prywatnych/publicznych SSH i id_rsa.pub katalogu macierzystego. Zastąp <your_user_name> ciąg nazwą katalogu macierzystego.

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. W przykładowym katalogu przejdź do src/test katalogu.

  5. Uruchom test.

    go test -v ./ -timeout 10m
    

6. Sprawdź wyniki

Po pomyślnym uruchomieniu go testpolecenia 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

Następne kroki