Condividi tramite


Eseguire test end-to-end con Terratest sui progetti Terraform

Terraform consente di definire, visualizzare in anteprima e distribuire l'infrastruttura cloud. Con Terraform è possibile creare file di configurazione usando la sintassi HCL. La sintassi HCL consente di specificare il provider di servizi cloud, ad esempio Azure, e gli elementi che costituiscono l'infrastruttura cloud. Dopo aver creato i file di configurazione, si crea un piano di esecuzione che consente di visualizzare in anteprima le modifiche dell'infrastruttura prima della distribuzione. Dopo aver verificato le modifiche, è possibile applicare il piano di esecuzione per distribuire l'infrastruttura.

I test end-to-end (E2E) vengono usati per convalidare il funzionamento di un programma prima di distribuirlo nell'ambiente di produzione. Uno scenario di esempio potrebbe essere un modulo Terraform che distribuisce due macchine virtuali in una rete virtuale. È possibile impedire che i due computer eseseguono il ping tra loro. In questo esempio è possibile definire un test per verificare il risultato previsto prima della distribuzione.

I test E2E sono in genere un processo in tre passaggi.

  1. Una configurazione viene applicata a un ambiente di test.
  2. Il codice viene eseguito per verificare i risultati.
  3. L'ambiente di test viene reinizializzato o disattivato, come ad esempio la deallocazione di una macchina virtuale.

In questo articolo vengono illustrate le operazioni seguenti:

  • Comprendere le nozioni di base dei test end-to-end con Terratest
  • Informazioni su come scrivere test end-to-end con Golang
  • Informazioni su come usare Azure DevOps per attivare automaticamente test end-to-end quando viene eseguito il commit del codice nel repository

1. Configurare l'ambiente

  • Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
  • Linguaggio di programmazione Go: installare Go.

  • Codice e risorse di esempio: Usando lo strumento DownGit, scaricare da GitHub il progetto end-to-end-testing e decomprimere in una nuova directory per contenere il codice di esempio. Questa directory viene definita directory di esempio.

2. Comprendere i test end-to-end

I test end-to-end convalidano il funzionamento di un sistema come intero collettivo. Questo tipo di test è contrapposto al testare moduli specifici. Per i progetti Terraform, i test end-to-end consentono la convalida di ciò che è stato distribuito. Questo tipo di test differisce da molti altri tipi che testano scenari di pre-distribuzione. I test end-to-end sono fondamentali per testare sistemi complessi che includono più moduli e agiscono su più risorse. In questi scenari, il test end-to-end è l'unico modo per determinare se i vari moduli interagiscono correttamente.

Questo articolo è incentrato sull'uso di Terratest per implementare test end-to-end. Terratest fornisce tutte le tubature necessarie per eseguire l'attività seguente:

  • Distribuire una configurazione Terraform
  • Consente di scrivere un test usando il linguaggio Go per convalidare ciò che è stato distribuito
  • Orchestrare i test in fasi
  • Rimuovere l'infrastruttura distribuita

3. Comprendere l'esempio di test

Per questo articolo viene usato un esempio disponibile nel repository di esempio Azure/terraform.

Questo esempio definisce una configurazione terraform che distribuisce due macchine virtuali Linux nella stessa rete virtuale. Una macchina virtuale denominata vm-linux-1 ha un indirizzo IP pubblico. Viene aperta solo la porta 22 per consentire le connessioni SSH. La seconda macchina virtuale- vm-linux-2 non ha un indirizzo IP pubblico definito.

Il test convalida gli scenari seguenti:

  • L'infrastruttura viene distribuita correttamente
  • Usando la porta 22, è possibile aprire una sessione SSH per vm-linux-1
  • Usando la sessione SSH in vm-linux-1, è possibile effettuare il ping vm-linux-2

Scenario di test end-to-end di esempio

Se è stato scaricato l'esempio, la configurazione di Terraform per questo scenario è disponibile nel src/main.tf file . Il main.tf file contiene tutti gli elementi necessari per distribuire l'infrastruttura di Azure rappresentata nella figura precedente.

Se non si ha familiarità con la creazione di una macchina virtuale, vedere Creare una macchina virtuale Linux con l'infrastruttura in Azure usando Terraform.

Attenzione

Lo scenario di esempio presentato in questo articolo è solo a scopo illustrativo. Abbiamo volutamente mantenuto le cose semplici per concentrarci sui passaggi di un test end-to-end. Non è consigliabile avere macchine virtuali di produzione che espongono porte SSH su un indirizzo IP pubblico.

4. Esaminare l'esempio di test

Il test end-to-end viene scritto nel linguaggio Go e usa il framework Terratest. Se è stato scaricato l'esempio, il test viene definito nel src/test/end2end_test.go file .

Il codice sorgente seguente mostra la struttura standard di un test Golang usando 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)
    })
}

Come si può notare nel frammento di codice precedente, il test è composto da tre fasi:

  • setup: esegue Terraform per distribuire la configurazione
  • validate': esegue i controlli di convalida e le asserzioni
  • teardown: ripulisce l'infrastruttura dopo l'esecuzione del test

L'elenco seguente mostra alcune delle funzioni chiave fornite dal framework Terratest:

  • terraform. InitAndApply: abilita l'esecuzione terraform init e terraform apply dal codice Go
  • terraform. Output: recupera il valore della variabile di output della distribuzione.
  • terraform.Destroy: esegue il comando terraform destroy dal codice Go.
  • test_structure.LoadTerraformOptions: carica le opzioni Terraform - come configurazione e variabili - dallo stato
  • test_structure. SaveTerraformOptions: salva le opzioni di Terraform, ad esempio la configurazione e le variabili, nello stato

5. Eseguire l'esempio di test

I passaggi seguenti eseguono il test sulla configurazione e sulla distribuzione di esempio.

  1. Aprire una finestra bash/terminale.

  2. Accedi al tuo account Azure.

  3. Per eseguire questo test di esempio, è necessario un nome id_rsa di coppia di chiavi SSH privata/pubblica e id_rsa.pub nella home directory. Sostituire <your_user_name> con il nome della home directory.

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. All'interno della directory di esempio, naviga alla directory src/test.

  5. Eseguire il test.

    go test -v ./ -timeout 10m
    

6. Verificare i risultati

Dopo aver eseguito go testcorrettamente , vengono visualizzati risultati simili all'output seguente:

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

Risolvere i problemi di Terraform in Azure

Risolvere i problemi comuni relativi all'uso di Terraform in Azure

Passaggi successivi