共用方式為


在 Terraform 專案上實施端到端 Terratest 測試

Terraform 允許對雲端基礎結構進行定義、預覽和部署。 使用 Terraform,您可以使用 HCL 語法建立組態檔。 HCL 語法可讓您指定雲端提供者,例如 Azure,以及構成雲端基礎結構的專案。 建立組態檔之後,您會建立一個 執行計劃 ,讓您在部署基礎結構變更之前先預覽這些變更。 驗證變更之後,您會套用執行計劃來部署基礎結構。

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

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

  1. 將配置應用於測試環境。
  2. 運行代碼以驗證結果。
  3. 測試環境要麼重新初始化,要麼關閉(例如解除分配虛擬機)。

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

  • 瞭解使用 Terratest 進行端到端測試的基礎知識
  • 瞭解如何使用 Golang 編寫端到端測試
  • 瞭解如何在將代碼提交到存儲庫時使用 Azure DevOps 自動觸發端到端測試

1.設定您的環境

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

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

2. 瞭解端到端測試

端到端測試驗證系統作為一個整體工作。 這種類型的測試與測試特定模組相反。 對於 Terraform 專案,端到端測試允許驗證已部署的內容。 這種類型的測試不同於測試部署前方案的許多其他類型的測試。 端到端測試對於測試包含多個模組並作用於多個資源的複雜系統至關重要。 在這種情況下,端到端測試是確定各個模組是否正確交互的唯一方法。

本文重點介紹如何使用 Terratest 實現端到端測試。 Terratest 提供了執行以下任務所需的所有管道:

  • 部署 Terraform 配置
  • 使您能夠使用 Go 語言編寫測試來驗證已部署的內容
  • 將測試編排到各個階段
  • 拆除已部署的基礎設施

3. 了解測試範例

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

此示例定義了一個 Terraform 配置,該配置將兩個 Linux 虛擬機部署到同一個虛擬網路中。 一個名為 - 的 vm-linux-1 VM 具有公共 IP 位址。 僅打開埠 22 以允許 SSH 連接。 第二個 VM - vm-linux-2 - 沒有定義的公共 IP 位址。

該測試驗證以下場景:

  • 基礎架構部署正確
  • 使用埠 22,可以打開 SSH 工作階段以 vm-linux-1
  • 在 上使用 SSH 工作階段 vm-linux-1,可以 ping vm-linux-2

端到端測試場景範例

如果您 下載了範例,則可以在 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)
    })
}

如前面的代碼片段所示,測試由三個階段組成:

  • setup:運行 Terraform 以部署配置
  • validate』:執行驗證檢查和斷言
  • teardown:在測試運行后清理基礎設施

Terratest 框架提供的一些關鍵功能如下:

  • terraform 的InitAndApply:啟用運行 terraform init Go 代碼和 terraform apply 從 Go 代碼
  • terraform 的Output:檢索部署輸出變數的值。
  • terraform 的銷毀:從 Go 代碼運行 terraform destroy 命令。
  • test_structure。LoadTerraformOptions:從狀態載入 Terraform 選項(例如配置和變數)
  • test_structure。SaveTerraformOptions:將 Terraform 選項(例如配置和變數)保存到狀態

5. 執行測試範例

以下步驟針對範例配置和部署運行測試。

  1. 打開bash/terminal 視窗。

  2. 登錄到 Azure 帳戶。

  3. 要運行此範例測試,您需要 SSH 私有/公有金鑰對名稱 id_rsa ,並 id_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 時的常見問題進行疑難解答

後續步驟