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.
- Er wordt een configuratie toegepast op een testomgeving.
- Code wordt uitgevoerd om de resultaten te controleren.
- 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.
Terraform configureren: Als u dit nog niet hebt gedaan, configureert u Terraform met een van de volgende opties:
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 pingenvm-linux-2
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
enterraform 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.
Open een bash-/terminalvenster.
Meld u aan bij uw Azure-account.
Als u deze voorbeeldtest wilt uitvoeren, hebt u een SSH-naam
id_rsa
voor een persoonlijk/openbaar sleutelpaar enid_rsa.pub
in uw basismap nodig. Vervang<your_user_name>
door de naam van uw basismap.export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
Navigeer in de voorbeeldmap naar de
src/test
map.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