用途:Terraform Test 是 Terraform 内置的测试框架,用于验证配置更新不会引入破坏性变更。测试针对临时资源运行,从而保护现有基础设施与状态文件。
主要能力:测试文件使用 .tftest.hcl 或 .tftest.json,包含 run 块(单个测试场景,可带变量、provider 和断言)、assert 块(必须为真的条件)、mock provider(模拟 provider 行为,Terraform 1.7.0+)以及 apply(默认,创建真实资源)和 plan(仅验证逻辑)两种测试模式。支持 expect_failures 验证校验规则拒绝错误输入、plan_options 的 refresh-only 与 target、state_key 状态隔离、parallel 并行执行、多别名 provider、模块引用(仅本地路径与 registry,不支持 git/HTTP)。
使用方式:在模块的 tests/ 目录放置测试文件,命名建议 _unit_test.tftest.hcl 用于 plan 模式、_integration_test.tftest.hcl 用于 apply 模式,便于在 CI 中分别过滤。常用命令:terraform test(全部测试)、terraform test tests/defaults.tftest.hcl(指定文件)、terraform test -filter=test_vpc_configuration(按 run 块名过滤)、terraform test -test-directory=integration-tests(自定义目录)、terraform test -verbose(详细输出)、terraform test -no-cleanup(跳过资源清理)。测试完成后资源按 run 块逆序销毁,依赖关系需注意(如先销毁 S3 对象再销毁桶)。
适用场景:验证输出、条件资源、资源数量、标签、数据源、校验规则、顺序依赖测试、并行模块、状态共享与清理顺序等。建议默认使用 plan 模式,外部依赖用 mock,错误信息写具体,用 expect_failures 做负向测试,覆盖不同变量组合,CI 中每个 PR 跑单元测试、合并时跑集成测试。
限制:mock provider 仅支持 Terraform 1.7.0+;测试文件仅支持本地路径和 registry 模块,不支持 git 或 HTTP 源;缺失凭据时可用 mock 做单元测试;测试相互干扰时用 state_key 或独立模块隔离。参考资料包含 MOCK_PROVIDERS.md、CI_CD.md、EXAMPLES.md,涉及 mocking、CI/CD 集成或完整示例时可查阅。