0Pricing
Terraform Infrastructure as Code · 课时

使用 Terratest 进行单元测试

学习使用用于测试基础设施代码的 Go 库 Terratest,为 Terraform 模块编写单元测试。

使用 Terratest 进行单元测试 是 CoddyKit 上的免费 Terraform Infrastructure as Code 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Terraform Infrastructure as Code 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Terraform Infrastructure as Code 课程共包含 4 节课。

为什么要测试基础设施即代码?

基础设施即代码(IaC)让您可以像管理软件一样管理基础设施。与软件一样,基础设施即代码配置也可能存在错误!

  • 可靠性:在部署前发现错误。
  • 一致性:确保资源按预期配置。
  • 信心:进行更改时,不必过度担心破坏现有基础设施。

测试 Terraform 代码对于构建健壮且易于维护的云环境至关重要。

单元测试与集成测试

测试基础设施即代码时,我们通常会讨论两种主要类型:

  • 单元测试:关注代码中小型且相互隔离的部分,例如单个 Terraform 模块。它们确保各个组件在独立运行时能够正常工作。
  • 集成测试:验证多个组件或模块作为一个系统能否协同工作,通常会将真实资源部署到云环境中。

在本课中,我们将重点介绍如何对 Terraform 模块进行单元测试。

认识 Terratest

Terratest 是由 HashiCorp(Terraform 的创建者)开发的 Go 库,专门用于测试基础设施代码。

  • 它可以帮助您为 Terraform、Packer、Kubernetes 以及其他基础设施即代码编写自动化测试。
  • 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))。
  • 测试使用 Go 内置的 testing 包。

这些文件通常与 Terraform 模块放在一起,或者放在专用的 test 目录中。

`terraform.Options` 详解

Terratest Terraform 测试的核心是 terraform.Options 结构体。这个对象会告诉 Terratest 如何运行 Terraform。

主要字段包括:

  • TerraformDir:Terraform 模块的路径。
  • Vars:传递给 Terraform 模块的输入变量。
  • EnvVars:为 Terraform 进程设置的环境变量。
  • BackendConfig:Terraform 后端的配置。

它是您在测试中执行 Terraform 命令时使用的蓝图。

基本测试流程

典型的 Terratest Terraform 单元测试会遵循以下步骤:

  1. 定义选项:创建一个指向模块并设置变量的 terraform.Options 结构体。
  2. 部署:使用 terraform.InitAndApply(t, options) 初始化并应用配置。
  3. 延迟销毁:立即添加 defer terraform.Destroy(t, options),确保测试运行结束后进行清理。
  4. 断言:使用 Go 的 testify/assert 或 Terratest 的 terraform.Output 检查资源属性或输出。

这样可以确保测试环境干净且相互隔离。

编写 `terraform.Options`

下面是一个演示如何设置 terraform.Options 的简单 Go 程序。这是进行任何 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"):获取列表输出。

然后,您可以使用 Go 的测试断言(例如 github.com/stretchr/testify/assert 中的断言)检查输出是否符合预期。

检查您的理解

Terratest 通过与真实云资源交互来帮助您测试 Terraform 代码。以下哪一项不是 Terratest 单元测试流程中的典型步骤?

回顾与后续步骤

您已经学习了使用 Terratest 对 Terraform 进行单元测试的基础知识!

  • Terratest 是用于测试 IaC 的 Go 库。
  • 它支持您部署真实的云基础设施、执行断言并进行清理。
  • 主要组成部分包括 _test.go 文件、func TestXxx(t *testing.T) 和 terraform.Options 结构体。
  • 流程包括定义选项、应用 Terraform、执行断言,以及使用 defer 确保清理。

接下来,探索如何编写更复杂的断言,并将 Terratest 集成到 CI/CD 流水线中,以实现自动化测试。

常见问题解答

「使用 Terratest 进行单元测试」课时是免费的吗?

是的 — 「使用 Terratest 进行单元测试」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Terraform Infrastructure as Code 课程的其余内容,请升级到 CoddyKit PRO。 Terraform Infrastructure as Code 课程共包含 4 节课。

「使用 Terratest 进行单元测试」这节课中我会学到什么?

学习使用用于测试基础设施代码的 Go 库 Terratest,为 Terraform 模块编写单元测试。 你通过在浏览器中直接运行的动手代码来练习 Terraform Infrastructure as Code,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Terraform Infrastructure as Code 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Terraform Infrastructure as Code 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「使用 Terratest 进行单元测试」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Terraform Infrastructure as Code 课中编写并运行代码吗?

能。每节 Terraform Infrastructure as Code 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Terraform `validate` 与 `fmt`
  2. 使用 Terratest 进行单元测试
  3. 云资源集成测试
  4. 策略即代码与合规检查
← 返回 Terraform Infrastructure as Code