在 Terraform 專案上實作端對端 Terratest 測試

Terraform 可讓您定義、預覽和部署雲端基礎結構。 使用 Terraform 時,您可以使用 HCL 語法來建立設定檔。 HCL 語法可讓您指定雲端提供者 (例如 Azure) 和構成雲端基礎結構的元素。 建立設定檔之後,您可以建立執行計畫,讓您先預覽基礎結構變更,之後再部署。 驗證變更之後,您可以套用執行計畫來部署基礎結構。

端對端 (E2E) 測試可用來驗證程式在部署到生產環境之前可運作。 範例案例可能是將兩部虛擬機部署到虛擬網路的 Terraform 模組。 您可能想要防止這兩部計算機互相 Ping。 在此範例中,您可以定義測試,以在部署之前驗證預期的結果。

E2E 測試通常是三個步驟的程式。

  1. 設定會套用至測試環境。
  2. 執行程式代碼以驗證結果。
  3. 測試環境會重新初始化或關閉(例如解除分配虛擬機)。

在本文中,您將學會如何:

1.設定您的環境

  • Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶
  • Go 程式設計語言安裝 Go

  • 範例程式代碼和資源: 使用 DownGit 工具,從 GitHub 下載端對端測試專案 ,然後解壓縮到新的目錄,以包含範例程式代碼。 此目錄稱為 範例目錄

2.瞭解端對端測試

端對端測試會驗證系統作為整體運作。 這種類型的測試與測試特定模組相反。 針對 Terraform 專案,端對端測試允許驗證已部署的專案。 這種類型的測試與許多測試預先部署案例的其他類型不同。 端對端測試對於測試包含多個模組並處理多個資源的複雜系統而言非常重要。 在這種情況下,端對端測試是判斷各種模組是否正確互動的唯一方式。

本文著重於使用 Terratest 來實作端對端測試。 Terratest 提供執行下列工作所需的所有管道:

  • 部署 Terraform 設定
  • 可讓您使用 Go 語言撰寫測試,以驗證已部署的專案
  • 將測試協調成階段
  • 卸除已部署的基礎結構

3.了解測試範例

在本文中,我們會使用 Azure/terraform 範例存放庫中提供的範例。

此範例會定義將兩部 Linux 虛擬機部署到相同虛擬網路的 Terraform 組態。 一個名為 vm-linux-1 的 VM 具有公用 IP 位址。 僅開啟埠 22 以允許 SSH 連線。 第二個 VM - vm-linux-2 沒有定義的公用 IP 位址。

測試會驗證下列案例:

  • 基礎結構已正確部署
  • 使用埠 22,可以開啟 SSH 會話給 vm-linux-1
  • 在上使用 vm-linux-1SSH 工作階段,就有可能進行 Ping vm-linux-2

Sample end-to-end test scenario

如果您 下載範例,您可以在 檔案中找到此案例的 src/main.tf Terraform 組態。 此 main.tf 檔案包含部署上圖中所表示之 Azure 基礎結構所需的所有專案。

如果您不熟悉如何建立虛擬機,請參閱 使用 Terraform 在 Azure 中使用基礎結構建立 Linux VM。

警告

本文中提供的範例案例僅供說明之用。 我們故意讓事情保持簡單,以便專注於端對端測試的步驟。 不建議讓生產虛擬機透過公用IP位址公開SSH埠。

4.檢查測試範例

端對端測試是以 Go 語言撰寫,並使用 Terratest 架構。 如果您 下載範例,則會在 src/test/end2end_test.go 檔案中定義測試。

下列原始碼顯示使用 Terratest 的 Golang 測試標準結構:

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)
    })
}

如您在先前的代碼段中所見,測試是由三個階段所組成:

  • 安裝程式:執行 Terraform 以部署組態
  • validate『:驗證檢查和判斷提示
  • 卸除:在測試執行之後清除基礎結構

下列清單顯示 Terratest 架構所提供的一些重要函式:

  • terraform。InitAndApply:啟用執行和terraform apply從 Go 程式代碼執行terraform init
  • terraform。輸出:擷取部署輸出變數的值。
  • terraform。終結:從 Go 程式代碼執行 terraform destroy 命令。
  • test_structure。LoadTerraformOptions:從狀態載入 Terraform 選項 ,例如組態和變數
  • test_structure。SaveTerraformOptions:將 Terraform 選項 -- 例如組態和變數 - 儲存至狀態

5.執行測試範例

下列步驟會針對範例組態和部署執行測試。

  1. 開啟 bash/終端機視窗。

  2. 登入您的 Azure 帳戶。

  3. 若要執行此範例測試,您需要 SSH 私鑰組名稱和id_rsaid_rsa.pub主目錄中。 以主目錄名稱取代 <your_user_name>

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. 在範例目錄中,流覽至 src/test 目錄。

  5. 執行測試。

    go test -v ./ -timeout 10m
    

6.驗證結果

成功執行 go test之後,您會看到類似下列輸出的結果:

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

對 Azure 上的 Terraform 進行疑難排解

針對在 Azure 上使用 Terraform 時的常見問題進行疑難排解

下一步