End-to-end Terratest-tests implementeren in Terraform-projecten

Terraform maakt de definitie, preview en implementatie van de cloudinfrastructuur mogelijk. Met Behulp van Terraform maakt u configuratiebestanden met behulp van de HCL-syntaxis. Met de HCL-syntaxis kunt u de cloudprovider opgeven, zoals Azure, en de elementen waaruit uw cloudinfrastructuur bestaat. Nadat u uw configuratiebestanden hebt gemaakt, maakt u een uitvoeringsplan waarmee u een voorbeeld van uw infrastructuurwijzigingen kunt bekijken voordat ze worden geïmplementeerd. Zodra u de wijzigingen hebt gecontroleerd, past u het uitvoeringsplan toe om de infrastructuur te implementeren.

End-to-end -tests (E2E) worden gebruikt om te valideren of een programma werkt voordat het in productie wordt geïmplementeerd. Een voorbeeldscenario is een Terraform-module die twee virtuele machines implementeert in een virtueel netwerk. Mogelijk wilt u voorkomen dat de twee computers elkaar pingen. In dit voorbeeld kunt u een test definiëren om het beoogde resultaat vóór de implementatie te controleren.

E2E-tests zijn doorgaans een proces met drie stappen.

  1. Er wordt een configuratie toegepast op een testomgeving.
  2. Code wordt uitgevoerd om de resultaten te controleren.
  3. De testomgeving wordt opnieuw geïnitialiseerd of verwijderd (zoals het toewijzen van een virtuele machine).

In dit artikel leert u het volgende:

  • Inzicht in de basisbeginselen van end-to-end testen met Terratest
  • Meer informatie over het schrijven van end-to-end-tests met Golang
  • Meer informatie over het gebruik van Azure DevOps om end-to-end-tests automatisch te activeren wanneer code wordt doorgevoerd in uw opslagplaats

1. Uw omgeving configureren

  • Azure-abonnement: als u nog geen abonnement op Azure hebt, maakt u een gratis Azure-account aan voordat u begint.
  • Go-programmeertaal: Installeer Go.

  • Voorbeeldcode en resources: Download met het hulpprogramma DownGit het end-to-end-testproject van GitHub en pak het uit in een nieuwe map om de voorbeeldcode te bevatten. Deze map wordt de voorbeeldmap genoemd.

2. End-to-end testen begrijpen

End-to-end tests valideren dat een systeem werkt als een geheel. Dit type testen is in tegenstelling tot het testen van specifieke modules. Voor Terraform-projecten is end-to-end testen de validatie mogelijk van wat er is geïmplementeerd. Dit type testen verschilt van veel andere typen die scenario's vóór de implementatie testen. End-to-endtests zijn essentieel voor het testen van complexe systemen die meerdere modules bevatten en reageren op meerdere resources. In dergelijke scenario's is end-to-end testen de enige manier om te bepalen of de verschillende modules correct communiceren.

Dit artikel is gericht op het gebruik van Terratest om end-to-end-tests te implementeren. Terratest biedt alle loodgieters die nodig zijn om de volgende taak uit te voeren:

  • Een Terraform-configuratie implementeren
  • Hiermee kunt u een test schrijven met behulp van de Go-taal om te valideren wat er is geïmplementeerd
  • De tests in fasen organiseren
  • De geïmplementeerde infrastructuur afbreken

3. Inzicht in het testvoorbeeld

Voor dit artikel gebruiken we een voorbeeld dat beschikbaar is in de azure-/terraform-voorbeeldopslagplaats.

In dit voorbeeld wordt een Terraform-configuratie gedefinieerd waarmee twee virtuele Linux-machines in hetzelfde virtuele netwerk worden geïmplementeerd. Eén VIRTUELE machine met de naam vm-linux-1 heeft een openbaar IP-adres. Alleen poort 22 wordt geopend om SSH-verbindingen toe te staan. De tweede VM - vm-linux-2 heeft geen gedefinieerd openbaar IP-adres.

De test valideert de volgende scenario's:

  • De infrastructuur is correct geïmplementeerd
  • Met poort 22 kunt u een SSH-sessie openen om vm-linux-1
  • Als u de SSH-sessie gebruikt vm-linux-1, is het mogelijk om te pingen vm-linux-2

Sample end-to-end test scenario

Als u het voorbeeld hebt gedownload, vindt u de Terraform-configuratie voor dit scenario in het src/main.tf bestand. Het main.tf bestand bevat alles wat nodig is om de Azure-infrastructuur te implementeren die in de vorige afbeelding wordt weergegeven.

Als u niet bekend bent met het maken van een virtuele machine, raadpleegt u Een virtuele Linux-machine maken met infrastructuur in Azure met behulp van Terraform.

Let op

Het voorbeeldscenario dat in dit artikel wordt weergegeven, is alleen bedoeld voor illustratiedoeleinden. We hebben het eenvoudig gehouden om ons te concentreren op de stappen van een end-to-end-test. Het is niet raadzaam om virtuele productiemachines te gebruiken die SSH-poorten beschikbaar maken via een openbaar IP-adres.

4. Bekijk het testvoorbeeld

De end-to-end-test wordt geschreven in de Go-taal en maakt gebruik van het Terratest-framework. Als u het voorbeeld hebt gedownload, wordt de test gedefinieerd in het src/test/end2end_test.go bestand.

De volgende broncode toont de standaardstructuur van een Golang-test met behulp van 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)
    })
}

Zoals u in het vorige codefragment kunt zien, bestaat de test uit drie fasen:

  • setup: Terraform wordt uitgevoerd om de configuratie te implementeren
  • valideren': Worden de validatiecontroles en asserties uitgevoerd
  • teardown: schoont de infrastructuur op nadat de test is uitgevoerd

De volgende lijst bevat enkele van de belangrijkste functies die worden geleverd door het Terratest-framework:

  • Terraform. InitAndApply: Hiermee schakelt u uitvoeren terraform init en terraform apply vanuit Go-code in
  • Terraform. Uitvoer: haalt de waarde van de uitvoervariabele voor de implementatie op.
  • Terraform. Vernietigen: voert de terraform destroy opdracht uit van Go-code.
  • test_structure. LoadTerraformOptions: Laadt Terraform-opties - zoals configuratie en variabelen - uit de status
  • test_structure. SaveTerraformOptions: Hiermee worden Terraform-opties , zoals configuratie en variabelen , opgeslagen in de status

5. Voer het testvoorbeeld uit

Met de volgende stappen wordt de test uitgevoerd op basis van de voorbeeldconfiguratie en -implementatie.

  1. Open een bash-/terminalvenster.

  2. Meld u aan bij uw Azure-account.

  3. Als u deze voorbeeldtest wilt uitvoeren, hebt u een SSH-naam id_rsa voor een persoonlijk/openbaar sleutelpaar en id_rsa.pub in uw basismap nodig. Vervang <your_user_name> door de naam van uw basismap.

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. Navigeer in de voorbeeldmap naar de src/test map.

  5. Voer de test uit.

    go test -v ./ -timeout 10m
    

6. Controleer de resultaten

Nadat de uitvoering is geslaagd go test, ziet u resultaten die vergelijkbaar zijn met de volgende uitvoer:

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

Problemen met Terraform in Azure oplossen

Veelvoorkomende problemen oplossen bij het gebruik van Terraform in Azure

Volgende stappen