การทดสอบหน่วยด้วย Terratest
เรียนรู้การเขียนการทดสอบหน่วยสำหรับโมดูล Terraform ด้วย Terratest ซึ่งเป็นไลบรารี Go สำหรับทดสอบโค้ดโครงสร้างพื้นฐาน
การทดสอบหน่วยด้วย Terratest เป็นบทเรียน DevOps Bootcamp ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน DevOps Bootcamp และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส DevOps Bootcamp มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องทดสอบ IaC
โครงสร้างพื้นฐานในรูปแบบโค้ด (IaC) ช่วยให้คุณจัดการโครงสร้างพื้นฐานได้เหมือนซอฟต์แวร์ เช่นเดียวกับซอฟต์แวร์ การกำหนดค่า IaC ก็อาจมีข้อบกพร่องได้
- ความน่าเชื่อถือ: ตรวจจับข้อผิดพลาดก่อนนำไปใช้งาน
- ความสอดคล้อง: มั่นใจว่าทรัพยากรถูกจัดเตรียมตามที่คาดไว้
- ความมั่นใจ: เปลี่ยนแปลงระบบได้โดยกังวลน้อยลงว่าจะทำให้โครงสร้างพื้นฐานเดิมเสียหาย
การทดสอบโค้ด Terraform มีความสำคัญอย่างยิ่งต่อการสร้างสภาพแวดล้อมระบบคลาวด์ที่แข็งแกร่งและดูแลรักษาได้
การทดสอบหน่วยเทียบกับการทดสอบการผสานรวม
เมื่อทดสอบ IaC เรามักพูดถึงสองประเภทหลัก:
- การทดสอบหน่วย: มุ่งเน้นส่วนเล็ก ๆ ที่แยกอิสระของโค้ด เช่น โมดูล Terraform เดียว การทดสอบนี้ช่วยให้มั่นใจว่าส่วนประกอบแต่ละส่วนทำงานได้อย่างถูกต้องเมื่อแยกออกจากส่วนอื่น
- การทดสอบการผสานรวม: ตรวจสอบว่าส่วนประกอบหรือโมดูลหลายส่วนทำงานร่วมกันเป็นระบบได้หรือไม่ โดยมักนำทรัพยากรจริงไปใช้งานในสภาพแวดล้อมระบบคลาวด์
ในบทเรียนนี้ เราจะมุ่งเน้นการ ทดสอบหน่วย ของโมดูล Terraform
แนะนำ Terratest
Terratest เป็นไลบรารี Go ที่พัฒนาโดย HashiCorp (ผู้สร้าง Terraform) โดยออกแบบมาเฉพาะสำหรับการทดสอบโค้ดโครงสร้างพื้นฐาน
- ช่วยให้คุณเขียนการทดสอบอัตโนมัติสำหรับ Terraform, Packer, Kubernetes และโค้ด IaC อื่น ๆ
- Terratest สามารถนำโครงสร้างพื้นฐานจริงไปใช้งานกับผู้ให้บริการระบบคลาวด์ของคุณ เรียกใช้การตรวจสอบยืนยันกับโครงสร้างพื้นฐานนั้น แล้วล้างทรัพยากรออกได้
- มีประสิทธิภาพสำหรับทั้งการทดสอบหน่วยและการทดสอบการผสานรวม
ข้อกำหนดเบื้องต้นของ Terratest
ในการเริ่มต้นใช้งาน Terratest คุณจะต้องมีสิ่งต่อไปนี้:
- Go: Terratest เป็นไลบรารีของ Go ดังนั้นคุณต้องติดตั้ง Go ไว้แล้ว (แนะนำเวอร์ชัน 1.13 ขึ้นไป)
- Terraform CLI: ต้องติดตั้งอินเทอร์เฟซบรรทัดคำสั่งของ Terraform และสามารถเรียกใช้งานได้
- ข้อมูลรับรองผู้ให้บริการคลาวด์: หากคุณกำลังปรับใช้ทรัพยากรจริง (แม้แต่การทดสอบหน่วยที่เรียกใช้ API ของคลาวด์) คุณจะต้องเข้าถึงผู้ให้บริการคลาวด์ด้วยการยืนยันตัวตนแล้ว (เช่น กำหนดค่า AWS CLI ไว้แล้ว)
นอกจากนี้ คุณควรมีความคุ้นเคยพื้นฐานกับแนวคิดการเขียนโปรแกรมด้วย Go
โครงสร้างไฟล์การทดสอบของ Go
การทดสอบของ Terratest เขียนด้วย Go และปฏิบัติตามรูปแบบการทดสอบมาตรฐานของ Go:
- ไฟล์การทดสอบลงท้ายด้วย
_test.go(เช่นmain_test.go) - ฟังก์ชันการทดสอบขึ้นต้นด้วย
Test(เช่นTestMyModule(t *testing.T)) - ใช้แพ็กเกจ
testingในตัวของ Go
โดยทั่วไปไฟล์เหล่านี้จะอยู่ถัดจากมอดูล Terraform หรืออยู่ในไดเรกทอรี test โดยเฉพาะ
ทำความเข้าใจ `terraform.Options`
หัวใจสำคัญของการทดสอบ Terraform ด้วย Terratest คือโครงสร้าง terraform.Options ออบเจ็กต์นี้จะบอก Terratest ว่าต้องเรียกใช้ Terraform อย่างไร
ฟิลด์สำคัญมีดังนี้:
TerraformDir: เส้นทางไปยังมอดูล Terraform ของคุณVars: ตัวแปรนำเข้าสำหรับมอดูล Terraform ของคุณEnvVars: ตัวแปรสภาพแวดล้อมที่จะกำหนดให้กระบวนการ TerraformBackendConfig: การกำหนดค่าสำหรับแบ็กเอนด์ Terraform ของคุณ
สิ่งนี้เปรียบเสมือนแบบแปลนสำหรับการเรียกใช้คำสั่ง Terraform ภายในการทดสอบ
กระบวนการทดสอบพื้นฐาน
การทดสอบหน่วย Terraform ด้วย Terratest โดยทั่วไปมีขั้นตอนดังนี้:
- กำหนดตัวเลือก: สร้างโครงสร้าง
terraform.Optionsที่ชี้ไปยังมอดูลของคุณและกำหนดตัวแปร - ปรับใช้: ใช้
terraform.InitAndApply(t, options)เพื่อเริ่มต้นและนำการกำหนดค่าไปใช้ - เลื่อนการทำลายทรัพยากร: เพิ่ม
defer terraform.Destroy(t, options)ทันที เพื่อให้แน่ใจว่ามีการล้างทรัพยากรหลังการทดสอบทำงานเสร็จ - ตรวจสอบเงื่อนไข: ใช้
testify/assertของ Go หรือterraform.Outputของ Terratest เพื่อตรวจสอบคุณสมบัติหรือผลลัพธ์ของทรัพยากร
วิธีนี้ช่วยให้ได้สภาพแวดล้อมการทดสอบที่สะอาดและแยกเป็นอิสระ
การเขียนโค้ด `terraform.Options`
ต่อไปนี้คือตัวอย่างโปรแกรม Go อย่างง่ายที่สาธิตการตั้งค่า terraform.Options ซึ่งเป็นขั้นตอนพื้นฐานสำหรับการโต้ตอบกับ Terratest ทุกประเภท
package main
import (
"fmt"
"path/filepath"
"github.com/gruntwork-io/terratest/modules/terraform"
)
func main() {
// Define the path to your Terraform configuration directory.
// In a real test, this would point to your module under test.
terraformConfigDir := filepath.Join(".", "my-example-module")
// Create a terraform.Options object.
// This struct holds all the configuration for running Terraform via Terratest.
options := &terraform.Options{
TerraformDir: terraformConfigDir,
// You would add input variables here, e.g.:
// Vars: map[string]interface{}{"instance_type": "t2.micro"},
// And environment variables, e.g.:
// EnvVars: map[string]string{"AWS_REGION": "us-east-1"},
}
fmt.Println("--- Terratest Options Configuration Demo ---")
fmt.Printf("Configured Terraform Directory: %s\n", options.TerraformDir)
fmt.Println("This shows how to initialize Terratest options.")
fmt.Println("Actual Terratest unit tests are run using 'go test' command.")
}การตรวจสอบผลลัพธ์
หลังจากนำการกำหนดค่า Terraform ไปใช้แล้ว คุณจะต้องตรวจสอบผลลัพธ์ Terratest มีฟังก์ชันสำหรับดึงค่าเหล่านี้ได้อย่างสะดวก
terraform.Output(t, options, "output_name"): ดึงผลลัพธ์ชนิดสตริงหนึ่งค่าterraform.OutputMap(t, options, "output_name"): ดึงผลลัพธ์ชนิดแผนผังterraform.OutputList(t, options, "output_name"): ดึงผลลัพธ์ชนิดรายการ
จากนั้นใช้การตรวจสอบของแพ็กเกจ testing ใน Go (เช่น จาก github.com/stretchr/testify/assert) เพื่อตรวจสอบว่าผลลัพธ์ตรงตามที่คาดไว้หรือไม่
ตรวจสอบความเข้าใจของคุณ
Terratest ช่วยให้คุณทดสอบโค้ด Terraform โดยโต้ตอบกับทรัพยากรคลาวด์จริง ข้อใดต่อไปนี้ไม่ใช่ขั้นตอนทั่วไปในกระบวนการทดสอบหน่วยด้วย Terratest
สรุปและขั้นตอนถัดไป
คุณได้เรียนรู้พื้นฐานของการทดสอบหน่วย Terraform ด้วย Terratest แล้ว!
- Terratest เป็นไลบรารีของ Go สำหรับการทดสอบ IaC
- ช่วยให้คุณปรับใช้ ตรวจสอบ และล้างโครงสร้างพื้นฐานคลาวด์จริงได้
- องค์ประกอบสำคัญ ได้แก่ ไฟล์
_test.go,func TestXxx(t *testing.T)และโครงสร้างterraform.Options - กระบวนการประกอบด้วยการกำหนดตัวเลือก การนำ Terraform ไปใช้ การตรวจสอบ และการรับรองว่ามีการล้างทรัพยากรด้วย
defer
ถัดไป ลองศึกษาวิธีเขียนการตรวจสอบที่ซับซ้อนยิ่งขึ้น และผสาน Terratest เข้ากับกระบวนการ CI/CD เพื่อการทดสอบอัตโนมัติ
คำถามที่พบบ่อย
บทเรียน “การทดสอบหน่วยด้วย Terratest” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การทดสอบหน่วยด้วย Terratest” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส DevOps Bootcamp ให้อัปเกรดเป็น CoddyKit PRO คอร์ส DevOps Bootcamp มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การทดสอบหน่วยด้วย Terratest”
เรียนรู้การเขียนการทดสอบหน่วยสำหรับโมดูล Terraform ด้วย Terratest ซึ่งเป็นไลบรารี Go สำหรับทดสอบโค้ดโครงสร้างพื้นฐาน คุณปฏิบัติ DevOps Bootcamp ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน DevOps Bootcamp หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน DevOps Bootcamp บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การทดสอบหน่วยด้วย Terratest” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน DevOps Bootcamp นี้ได้ไหม
ได้ บทเรียน DevOps Bootcamp ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- `validate` และ `fmt` ของ Terraform
- การทดสอบหน่วยด้วย Terratest
- การทดสอบการผสานรวมทรัพยากรคลาวด์
- นโยบายในรูปโค้ดและการตรวจสอบการปฏิบัติตามข้อกำหนด