Terratest:一个用于自动化基础设施测试的开源 Go 库

  • Hrishikesh Barua
  • 谢丽

2018 年 5 月 16 日

话题:测试DevOps语言 & 开发

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

Gruntwork开源了他们的 Go 框架Terratest。该框架可以用于编写测试基础设施的自动化测试。该库内置了对TerraformPacker的支持。

Terratest 是由 Gruntwork 公司内部开发的,其目的是为了维护他们的基础设施即代码(IAC)库,这是一个基于 Terraform、Python、Go 和 bash 的工具库,用于管理 AWS 上的基础设施。IAC 供 Gruntwork 付费用户使用

使用 Terratest 编写测试涉及Go 内置的包测试机制。测试会创建真实的基础设施组件,如服务器,并在上面部署应用程序,然后使用 Terratest 工具验证预期行为。在测试结束时,Terratest 会取消应用部署,使用 Go 语言的 defer 机制清理资源,类似 JUnit 的 teardown 方法。

Terratest 可以测试已有的基础设施部署而不是每次从头开始创建吗?该工具的维基百科不建议这样做,因为它可能对环境做不必要的修改。不过,有些团队的基础设施拓扑结构复杂,他们不希望为了执行测试而创建一个全新的设置,对他们而言,这条建议很难接受。一个名为命名空间的特性可以使用唯一标识符隔离资源。注意,这里的命名空间并不是我们通常所理解的通过标签来隔离组件,而是保证资源有唯一标识符,测试时只使用那些由测试框架生成了标识符的资源。

Gruntwork 的联合创始人Yevgeniy Brikman解释了使用 Go 编写 Terratest 的原因:

Go 正成为 DevOps 世界的通用语言,因此,那似乎是个合理的选择。对于 DevOps 领域里的这样一个库,在其他语言中,我们只会考虑 Python,但是,在 Gruntwork,我们在其他地方广泛地使用了 Go,所以,继续用它就很容易理解了。

在回应 Terratest 与InSpecServerSpec等其他工具相比怎么样时,Brikman表示

大多数规范工具都侧重于检查单个服务器或资源的属性。例如,httpd 是否已经安装并运行?Terratest 在很大程度上是用于端到端的验收风格的测试,在真实的环境中(如 AWS)部署真实的基础设施,并测试该基础设施是否真得符合预期。

Terratest提供了工具,可以执行类似检查 URL 的响应是否符合预期或者获取 Git 中当前分支的名称这样的任务。面向ConsulVaultNomad的 Terraform 模块都有 Terratest 测试示例。Terratest 的其他特性包括针对 CI 系统的变通方案,这类系统需要短期运行的测试,对于需要长期运行的基础设施测试可能无效。Terratest 还提供了像测试预期错误这样的典型测试抽象。为了加速开发过程中的测试,Terratest 可以把测试分解成“阶段”,而阶段可以使用环境变量跳过

查看英文原文Terratest - an Open Source Go Library for Automated Infrastructure Testing

测试DevOps语言 & 开发