terraform-test
作者 hashicorpterraform-test 是一份实用指南,教你如何使用 `.tftest.hcl` 文件、`run` 块、断言、mock,以及适合 CI 的工作流来编写和运行 Terraform 测试。可用于在合并前验证 module 输出、资源参数、条件逻辑以及 plan 或 apply 行为。
该 skill 评分为 83/100,因为它为 Terraform 测试提供了清晰、可复用的工作流,并配有具体触发场景、示例和 CI 指南。对目录用户来说,如果你需要帮助编写 `.tftest.hcl` 文件、运行 plan/apply 测试,或搭建 mock 和 CI 流水线,它很值得安装;但它仍然比较专门,并且对版本较敏感。
- 触发场景明确:说明中直接覆盖了 `.tftest.hcl` 文件、`run` 块、断言、provider/data source 的 mock,以及排错。
- 操作性强:skill 正文包含核心概念,并附有关于 mock、CI/CD 和完整示例的链接参考。
- 对 agent 很友好:示例和流水线片段能减少编写单元测试、集成测试和基于 mock 的 Terraform 测试工作流时的试错成本。
- 部分指导与版本相关,尤其是 mock provider 需要 Terraform 1.7.0+,使用前需确认兼容性。
- 该 skill 主要面向测试,超出 Terraform 测试工作流,或涉及更广泛的基础设施设计问题时,帮助可能有限。
terraform-test 技能概览
terraform-test 是一个用于编写 .tftest.hcl 场景、检查模块行为、以及在不靠猜测语法或流程的情况下验证基础设施逻辑的 Terraform 测试技能。它最适合想要一份实用的 terraform-test 指南、覆盖 test files、run blocks、assertions 和 mocks 的工程师,尤其适合在合并前把 Terraform 变更做得更安全。
terraform-test 适合做什么
当你需要验证 outputs、resource arguments、条件逻辑,或依赖环境的行为时,就该使用 terraform-test 技能。它特别适合模块作者、平台团队和审查者,他们更需要可重复的检查,而不是手动看 plan 结果。
terraform-test 在 Terraform 工作流中的位置
这个技能适合放在 terraform init 和 terraform validate 之后,也可以在 CI 执行时同步使用或紧接着使用。它能把粗略的配置意图转成明确的测试用例,并根据你要证明的内容,运行在 plan 模式或 apply 模式。
terraform-test 的核心差异
terraform-test 的主要价值在于,它聚焦的是 Terraform 原生测试,而不是泛泛的提示词建议。它覆盖测试结构、断言模式、Terraform 1.7+ 的 mock provider 用法,以及适合 CI 的执行方式,让用户能更快从“我觉得这样应该能行”走到一份可落地的测试文件。
如何使用 terraform-test 技能
安装并打开正确的文件
使用 npx skills add hashicorp/agent-skills --skill terraform-test 安装。然后先阅读 SKILL.md,再看 references/EXAMPLES.md 了解完整的测试套件模式;如果需要 mock 的单元测试,再看 references/MOCK_PROVIDERS.md;如果需要在流水线里执行,则查看 references/CI_CD.md。
给技能一个可测试的目标
高质量的提示会明确写出模块、行为和预期结果。例如:“为一个 VPC module 编写 .tftest.hcl 文件,检查 public subnet 数量、private subnet 路由,以及 plan 模式下的输出值。”这比只说“加测试”更好,因为技能能立即把请求映射成 run blocks 和 assertions。
使用合适的输入形状
当你提供 Terraform 版本、provider 约束、module inputs,以及需要证明的内容时,这个技能效果最好。如果你希望使用 mock provider,请明确说明,并确认 Terraform 1.7+;如果你想要真实的集成覆盖,请补充目标云环境,以及任何凭证或 CI 假设。
从工作流开始,而不是从空文件开始
一个实用的 terraform-test 使用流程是:先识别行为,再选择 plan 或 apply,然后决定是否允许 mocks,最后为每个场景编写一个 run block。先看 references/EXAMPLES.md 了解整体测试布局,再按你的仓库约定调整变量、断言和文件名。
terraform-test 技能常见问题
terraform-test 只适合模块测试吗?
不是。它对 modules 最强,但同样适用于 root configurations、输出验证、provider 行为检查,以及 CI 测试执行。如果你需要 Terraform 原生验证,这个技能很合适。
什么时候不该用 terraform-test?
如果你只需要一次性的 terraform plan 解释,或者你的技术栈无法在 CI 中运行 Terraform tests,就可以跳过它。另一个需要避开的场景是 Terraform 低于 1.7 时使用 mock-provider 模式,因为那部分工作流不适用。
terraform-test 比手写提示词更容易吗?
通常是的,因为它把任务收敛到 Terraform 的实际测试语法和文件结构。泛泛的提示词往往只会给出宽泛建议;terraform-test 技能则是面向可用的测试用例生成,尤其适合 run blocks 和 assertions。
terraform-test 适用于 Code Generation 任务吗?
适用。terraform-test 用于 Code Generation 时,适合你生成与 module 接口和预期行为一致的测试文件。关键边界在于:生成出来的测试仍然需要真实输入、合理的断言,以及对 plan 覆盖还是 apply 覆盖的明确选择。
如何改进 terraform-test 技能
提供具体的模块事实
输入越具体,测试质量通常越高。请包含变量名、必需输出、resource 名称、provider aliases,以及你关心的任何不变量,比如“public subnets 必须是 2 个”或“instance type 必须默认是 t3.micro”。
明确哪些内容可以 mock
最常见的质量提升来自于把 provider 调用是 mock 还是走真实请求讲清楚。对于 terraform-test 的安装决策来说,这一点很重要,因为 mocks 可以减少对凭证的依赖、加快单元测试,但它们只在 plan 模式下生效,并且可能掩盖 provider 相关的特定行为。
把单元、集成和回归场景分开
当行为不同的时候,不要把所有内容塞进一个大文件,而是要分别请求独立的测试场景。一份清晰的 terraform-test 指南,通常会把快速的 plan 模式检查与较慢的集成检查分开,这样 CI 更简单,失败信号也更容易读懂。
从失败中迭代,而不是从假设出发
第一次运行后,要继续收紧那些太弱、太宽泛,或者绑定在不稳定值上的断言。如果测试因为 computed attributes 失败,就改成更稳定的检查;如果某个模块改动是有意的,就更新预期条件,而不是把测试放宽到失去意义。
