Implementace end-to-end testování Terratestu v projektech Terraformu

K ověření, že program funguje před nasazením do produkčního prostředí, se používá testování E2E (end-to-end). Příkladem scénáře může být modul Terraformu, který nasazovat dva virtuální počítače do virtuální sítě. Možná budete chtít oběma počítačům zabránit v tom, aby se vzájemně testují příkazem ping. V tomto příkladu můžete definovat test, který před nasazením ověří zamýšlený výsledek.

Testování E2E je obvykle proces se třemi kroky.

  1. Konfigurace se použije v testovacím prostředí.
  2. Spustí se kód, který ověří výsledky.
  3. Testovací prostředí je buď znovu inicializováno, nebo odstraněno (například zrušení přidělení virtuálního počítače).

V tomto článku získáte informace o těchto tématech:

  • Základní informace o testování typu end-to-end pomocí Terratestu
  • Zjistěte, jak psát test od konce pomocí jazyka Go.
  • Zjistěte, jak pomocí Azure DevOps automaticky aktivovat testy typu end-to-end, když je kód potvrzený do vašeho repo.

1. Konfigurace prostředí

  • Předplatné Azure: Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.
  • Programovací jazyk Go:Nainstalujte jazyk Go.

  • Příklad kódu a prostředků: Pomocí nástroje DownGit si stáhněte GitHub projektu end-to-end-testing a rozbalte ho do nového adresáře, který bude obsahovat příklad kódu. Tento adresář se označuje jako příklad adresáře.

2. Principy testování od konce

Testy typu end-to-end ověřují, že systém funguje jako celek. Tento typ testování není na rozdíl od testování konkrétních modulů. U projektů Terraformu umožňuje testování od konce až do konce ověření toho, co bylo nasazeno. Tento typ testování se liší od mnoha jiných typů, které testují scénáře před nasazením. Komplexní testy jsou důležité pro testování složitých systémů, které zahrnují více modulů a působí na více prostředků. V takových scénářích je jediným způsobem, jak určit, jestli různé moduly správně komunikují, koncové testování.

Tento článek se zaměřuje na implementaci end-to-end testování pomocí Terratestu. Terratest poskytuje veškeré základní informace potřebné k následujícímu úkolu:

  • Nasazení konfigurace Terraformu
  • Umožňuje napsat test pomocí jazyka Go a ověřit, co bylo nasazeno.
  • Orchestrace testů do fází
  • Roztržení nasazené infrastruktury

3. Pochopení příkladu testu

Pro tento článek používáme ukázku dostupnou v ukázkovém úložiště Azure/terraform.

Tato ukázka definuje konfiguraci Terraformu, která nasadí dva virtuální počítače s Linuxem do stejné virtuální sítě. Jeden virtuální počítač s názvem vm-linux-1 má veřejnou IP adresu. Otevře se pouze port 22, který umožňuje připojení SSH. Druhý virtuální počítač nemá vm-linux-2 definovanou veřejnou IP adresu.

Test ověří následující scénáře:

  • Infrastruktura je správně nasazená.
  • Pomocí portu 22 je možné otevřít relaci SSH pro vm-linux-1
  • Pomocí relace SSH na vm-linux-1 můžete příkazem ping vm-linux-2

Ukázkový scénář testu od konce

Pokud jste si stáhli ukázku, konfiguraci Terraformu pro tento scénář najdete v souboru . Soubor main.tf obsahuje vše potřebné k nasazení infrastruktury Azure znázorněné na předchozím obrázku.

Pokud nevíte, jak vytvořit virtuální počítač, podívejte se na stránku Vytvoření virtuálního počítače s Linuxem s infrastrukturou v Azure pomocí Terraformu.

Upozornění

Ukázkový scénář představený v tomto článku je pouze pro ilustraci. Záměrně jsme vše udržovat jednoduché, abychom se mohli zaměřit na kroky end-to-end testu. Nedoporučujeme mít produkční virtuální počítače, které zpřístupňuje porty SSH přes veřejnou IP adresu.

4. Prozkoumání testovacího příkladu

Test od konce je napsaný v jazyce Go a používá rozhraní Terratest. Pokud jste si stáhli ukázku, test se definuje v souboru .

Následující zdrojový kód ukazuje standardní strukturu testu jazyka Go pomocí Terratestu:

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 vidíte v předchozím fragmentu kódu, test se skládá ze tří fází:

  • setup: Spustí Terraform a nasadí konfiguraci.
  • validate': Kontroluje ověřování a kontrolní výrazy
  • odtržení:Po spuštění testu vyčistí infrastrukturu.

Následující seznam ukazuje některé klíčové funkce poskytované architekturou Terratest:

  • Terraform. InitAndApply:Povolí spuštění a terraform apply z kódu Go.
  • Terraform. Výstup:Načte hodnotu výstupní proměnné nasazení.
  • Terraform. Destroy (Zničení): Spustí příkaz z kódu Go.
  • test_structure. Load Když načtete parametryTerraformu ze stavu, načte se možnosti Terraformu, jako je konfigurace a proměnné.
  • test_structure. Save Když chcete uložitparametry Formuláře: Uloží možnosti Terraformu , jako je konfigurace a proměnné, do stavu .

5. Spuštění testovacího příkladu

Následující kroky spustí test proti ukázkové konfiguraci a nasazení.

  1. Otevřete okno bash nebo terminálu.

  2. Přihlaste se ke svému účtu Azure.

  3. Ke spuštění tohoto ukázkového testu potřebujete název páru privátního a veřejného klíče SSH a id_rsaid_rsa.pub v domovském adresáři. Nahraďte <your_user_name> názvem vašeho domovského adresáře.

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. V adresáři příkladu přejděte do src/test adresáře .

  5. Spusťte test.

    go test -v ./ -timeout 10m
    

6. Ověření výsledků

Po go test úspěšném spuštění se zobrazí výsledky podobné následujícímu výstupu:

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

Řešení potíží s Terraformem v Azure

Řešení běžných problémů při používání Terraformu v Azure

Další kroky