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.
- Satu konfigurasi diterapkan ke lingkungan pengujian.
- Kode dijalankan untuk memverifikasi hasilnya.
- 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.
Konfigurasi Terraform: Jika Anda belum melakukannya, konfigurasikan Terraform menggunakan salah satu opsi berikut:
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 pingvm-linux-2
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
danterraform apply
dari kode Go - terraform. Output: Mengambil nilai variabel output penyebaran.
- terraform. Hancurkan: Menjalankan perintah
terraform destroy
dari 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.
Buka jendela bash/terminal.
Masuk ke akun Azure Anda.
Untuk menjalankan uji sampel ini, Anda memerlukan nama pasangan kunci privat/publik SSH
id_rsa
danid_rsa.pub
di direktori beranda Anda. Ganti<your_user_name>
dengan nama direktori beranda Anda.export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
Di dalam direktori contoh, buka direktori
src/test
.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