1.5.1. 测试
在日常开发中,我们习惯了写完代码就跑测试,确保功能正常。但当我们进入 Terraform 的世界,事情就没那么简单了。Terraform 是用来管理基础设施的工具,它的“代码”直接影响到云上的资源,比如服务器、数据库、网络等。一旦执行 terraform apply
,就可能会产生实际费用,甚至影响到生产环境。
因此,Terraform 的测试策略需要特别小心。我们不能像测试普通程序那样,对每一个参数组合都进行全面测试,因为这不仅耗时,还可能带来高昂的成本。此外,Terraform 还有一个独特的挑战:状态管理。如果在没有任何配置更改的情况下,terraform plan
仍然显示有变更,那就说明出现了“配置漂移”,这是我们必须避免的。
更复杂的是,Terraform 对版本升级特别敏感。如果我们发布了一个非主版本更新(比如从 1.2.3 升级到 1.3.0),但这个更新却引入了破坏性变更,那就可能导致用户的基础设施出现问题。因此,我们需要确保每一次更新都不会对现有用户造成影响。
在本章中,我们将一起探索如何在 Terraform 中进行有效的测试。无论你是 Terraform 的新手,还是有经验的开发者,都能从中找到实用的建议和技巧。
本章将主要介绍如何设计测试框架,测试的策略,不涉及具体的测试工具。我们将在随后的工具章节中详细讲述不同种类的测试工具。
1.5.1.1. Terraform 模块测试的类型
在维护和治理大规模的 Terraform 模块(如 Azure Verified Module)时,构建一套系统化的测试策略至关重要。本章将介绍 AVM 中五种常见的 Terraform 测试类型,帮助您确保模块的稳定性、合规性和可维护性。
1.5.1.2. 单元测试(Unit Testing)
单元测试聚焦于验证模块中最小的功能单元是否按预期工作,通常在不部署实际资源的情况下进行。通过模拟输入变量和使用 terraform plan
命令,可以检查资源的配置是否符合预期。例如,您可以验证某个变量的值是否正确地影响了资源的属性。Terraform v1.6 引入了原生的测试框架,允许使用 .tftest.hcl
文件编写测试用例,进一步简化了单元测试的编写和执行。
有时通过符号链接(Symbolic Link)和重载文件(Override File),我们还可以绕过笨重的 Provider 和云 API 调用,对 Terraform 代码中可能存在的复杂逻辑进行轻量级的验证。
1.5.1.3. 端到端测试(End-to-End Testing)
端到端测试模拟实际的部署流程,验证整个部署基础设施的行为是否符合预期。这类测试通常在隔离的测试环境中进行,部署完整的资源栈,还可以通过实际操作(如网络连接测试、API 调用等)验证系统的功能。工具如 Terratest(基于 Go 语言)或是 Terraform 原生的测试功能可以帮助您编写和执行这类测试,确保在生产环境部署前发现潜在问题。
1.5.1.3.1. 漂移检测(Drift Detection)
漂移检测用于识别实际部署的基础设施与 Terraform 状态之间的差异,确保配置的一致性。通过运行 terraform plan
命令,可以检测到未通过 Terraform 管理的更改。该测试往往与端到端测试结合运行,以确保技术设施在部署后不会因为自身原因触发配置漂移。
1.5.1.3.2. 破坏性变更测试
破坏性变更测试旨在防止在非主版本更新(即次版本或修订版本)中引入会破坏现有模块调用者的更改。根据语义化版本控制的原则,只有在主版本更新时才允许引入不兼容的更改。
我们可以添加一种破坏性变更测试,用以验证当前 PR 中的更改是否会对现有模块调用者造成破坏性影响。如果在 terraform plan
阶段检测到错误或意外的更改,说明该 PR 引入了不兼容的更改,应推迟合并或升级为主版本更新。
这种测试策略有助于在持续集成(CI)流程中自动检测潜在的破坏性变更,确保模块的稳定性和向后兼容性。在后续章节中,我们将详细介绍如何实现这一测试流程,并将其集成到我们的 DevOps 流程中。
1.5.1.4. 代码风格检查(Linting)
代码风格检查旨在确保 Terraform 配置文件的语法正确、结构清晰,并遵循最佳实践。工具如 TFLint、terraform validate
和 terraform fmt
可以自动检测语法错误、不一致的命名或潜在的配置问题。通过在持续集成(CI)流程中集成这些工具,可以在代码合并前捕获并修复问题,提高代码质量和可维护性。
1.5.1.5. 合规测试(Compliance Testing)
合规测试用于确保基础设施配置符合组织的政策和法规要求。例如,验证所有资源是否包含必要的标签,或是否启用了加密等安全设置。工具如 Checkov、Conftest 和 Sentinel(适用于 Terraform Enterprise)可以帮助我们定义和执行合规策略,自动检测配置中的违规项。