Menerapkan pengujian Terratest end-to-end pada proyek Terraform

Terraform memungkinkan definisi, pratinjau, dan penyebaran infrastruktur cloud. Menggunakan Terraform, Anda membuat file konfigurasi menggunakan sintaksis HCL. Sintaksis HCL memungkinkan Anda menentukan penyedia cloud - seperti Azure - dan elemen yang membentuk infrastruktur cloud Anda. Setelah membuat file konfigurasi, Anda membuat rencana eksekusi yang memungkinkan Anda untuk melihat pratinjau perubahan infrastruktur Anda sebelum disebarkan. Setelah memverifikasi perubahan, Anda menerapkan rencana eksekusi untuk menyebarkan infrastruktur.

Pengujian end-to-end (E2E) digunakan untuk memvalidasi program yang berfungsi sebelum menyebarkannya ke produksi. Contoh skenario mungkin adalah modul Terraform yang menyebarkan dua mesin virtual ke dalam jaringan virtual. Anda mungkin ingin mencegah kedua mesin saling ping. Dalam contoh ini, Anda dapat menentukan tes untuk memverifikasi hasil yang diinginkan sebelum penyebaran.

Pengujian E2E biasanya merupakan proses tiga langkah.

  1. Satu konfigurasi diterapkan ke lingkungan pengujian.
  2. Kode dijalankan untuk memverifikasi hasilnya.
  3. Lingkungan pengujian dapat dipulihkan atau diturunkan (seperti melepas satu mesin virtual).

Dalam artikel ini, Anda akan mempelajari cara:

  • Memahami dasar-dasar pengujian end-to-end dengan Terratest
  • Pelajari cara menulis tes end-to-end menggunakan Golang
  • Pelajari cara menggunakan Azure DevOps agar secara otomatis memicu pengujian end-to-end saat kode dikirimkan ke repo Anda

1. Mengonfigurasi lingkungan Anda

  • Langganan Azure: Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum memulai.
  • bahasa pemrograman Go: Install Go.

  • Contoh kode dan sumber daya: Dengan alat DownGit, unduh dari GitHub proyek pengujian end-to-end dan ekstrak ke direktori baru untuk menyimpan kode contoh. Direktori ini disebut sebagai direktori contoh.

2. Pahami pengujian end-to-end

Tes end-to-end memvalidasi sistem berfungsi secara kolektif keseluruhan. Jenis pengujian ini berlawanan dengan pengujian modul khusus. Untuk proyek Terraform, pengujian end-to-end memungkinkan validasi apa saja yang telah digunakan. Jenis pengujian ini berbeda dari berbagai jenis lain yang menguji skenario pra-penggunaan. Tes end-to-end sangat penting untuk menguji sistem kompleks yang mencakup beberapa modul dan bekerja pada berbagai sumber daya. Dalam skenario seperti itu, pengujian end-to-end adalah satu-satunya cara untuk menentukan apakah berbagai modul berinteraksi dengan benar.

Artikel ini berfokus pada penggunaan Terratest untuk menerapkan pengujian end-to-end. Terratest menyediakan semua saluran yang diperlukan untuk melakukan tugas berikut:

  • Menyebarkan konfigurasi Terraform
  • Memungkinkan Anda menulis tes menggunakan bahasa Go untuk memvalidasi apa yang telah disebarkan
  • Mengatur tes menjadi beberapa tahap
  • Melepaskan infrastruktur yang digunakan

3. Pahami contoh tes tersebut

Untuk artikel ini, kami menggunakan sampel yang tersedia di repo sampel Azure/terraform.

Sampel ini mendefinisikan konfigurasi Terraform yang menyebarkan dua mesin virtual Linux ke dalam jaringan virtual yang sama. Satu VM - bernama vm-linux-1 - memiliki satu alamat IP publik. Hanya port 22 yang dibuka untuk memungkinkan koneksi SSH. VM kedua - vm-linux-2 - tidak memiliki alamat IP publik yang ditentukan.

Pengujian memvalidasi skenario berikut:

  • Infrastruktur digunakan dengan benar
  • Dengan menggunakan port 22, Anda dapat membuka sesi SSH untuk vm-linux-1
  • Menggunakan sesi SSH pada vm-linux-1, dimungkinkan untuk melakukan ping vm-linux-2

Sample end-to-end test scenario

Jika Anda mengunduh sampel, konfigurasi Terraform untuk skenario ini dapat ditemukan dalam file src/main.tf. File main.tf berisi semua yang diperlukan untuk menyebarkan infrastruktur Azure yang diwakili pada gambar sebelumnya.

Jika Anda belum tahu cara membuat mesin virtual, lihat Membuat VM Linux dengan infrastruktur di Azure menggunakan Terraform.

Perhatian

Contoh skenario yang disajikan dalam artikel ini hanya untuk tujuan ilustrasi. Kami sengaja membuatnya sederhana agar fokus pada langkah-langkah tes end-to-end. Kami tidak menyarankan untuk menggunakan mesin virtual produksi yang memperlihatkan port SSH pada alamat IP publik.

4. Periksa contoh tes

Tes end-to-end ditulis dalam bahasa Go dan menggunakan kerangka kerja Terratest. Jika Anda mengunduh sampel, pengujian ditentukan dalam file src/test/end2end_test.go.

Kode sumber berikut menunjukkan struktur standar tes Golang menggunakan 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)
    })
}

Seperti yang Anda lihat di cuplikan kode sebelumnya, tes ini terdiri atas tiga tahap:

  • setup: Menjalankan Terraform untuk menyebarkan konfigurasi
  • validate': Melakukan pemeriksaan dan penegasan validasi
  • teardown: Membersihkan infrastruktur setelah tes berjalan

Daftar berikut menunjukkan beberapa fungsi utama yang disediakan oleh kerangka kerja Terratest:

  • terraform. InitAndApply: Memungkinkan menjalankan terraform init dan terraform apply dari kode Go
  • terraform. Output: Mengambil nilai variabel output penyebaran.
  • terraform. Hancurkan: Menjalankan perintah terraform destroydari kode Go.
  • test_structure. LoadTerraformOptions: Memuat opsi Terraform - seperti konfigurasi dan variabel - dari status tersebut
  • test_structure. SaveTerraformOptions: Menyimpan opsi Terraform - seperti konfigurasi dan variabel - ke status tersebut

5. Jalankan contoh test

Langkah-langkah berikut menjalankan pengujian terhadap konfigurasi dan penyebaran sampel.

  1. Buka jendela bash/terminal.

  2. Masuk ke akun Azure Anda.

  3. Untuk menjalankan uji sampel ini, Anda memerlukan nama pasangan kunci privat/publik SSH id_rsa dan id_rsa.pub di direktori beranda Anda. Ganti <your_user_name> dengan nama direktori beranda Anda.

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. Di dalam direktori contoh, buka direktori src/test.

  5. Jalankan tes.

    go test -v ./ -timeout 10m
    

6. Verifikasi hasilnya

Setelah berhasil menjalankan go test, Anda melihat hasil yang mirip dengan output berikut:

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

Memecahkan masalah Terraform pada Azure

Memecahkan masalah umum saat menggunakan Terraform di Azure

Langkah berikutnya