大家好。 今天我们给大家分享的是文章的最后一部分。 ,其翻译是专门为课程学生准备的 .

部署测试
这种测试风格是一种强大的方法,允许我们执行白盒测试来测试基础设施代码的工作原理。 然而,它在一定程度上限制了我们可以测试的内容。 测试是根据 Pulumi 在实际部署之前创建的内存部署计划进行的,因此无法测试部署本身。 对于这种情况,Pulumi 有一个集成测试框架。 这两种方法配合得很好!
Pulumi 集成测试框架是用 Go 编写的,我们用它来测试大部分内部代码。 虽然前面讨论的单元测试方法更像是白盒测试,但集成测试是黑盒。 (还有严格内部测试的选项。)创建该框架是为了获取完整的 Pulumi 程序并对其执行各种生命周期操作,例如从头开始部署新堆栈、使用变化更新它以及删除它,可能会多次。 我们定期(例如在晚上)运行它们并作为压力测试。
(我们 ,以便在语言的原生 SDK 中提供类似的集成测试功能。 无论您的 Pulumi 程序使用何种语言编写,您都可以使用 Go 集成测试框架。
通过使用此框架运行程序,您可以检查以下内容:
- 您的项目代码语法正确并且运行没有错误。
- 堆栈和机密配置设置有效并被正确解释。
- 您的项目可以成功部署在您选择的云提供商中。
- 你的项目可以成功从初始状态升级到其他N个状态。
- 您的项目可以成功销毁并从您的云提供商中删除。
正如我们稍后将看到的,该框架还可用于执行运行时验证。
简单的集成测试
要查看其实际效果,我们将查看存储库 pulumi/examples,因为我们的团队和 Pulumi 社区使用它来测试我们自己的拉取请求、提交和夜间构建。
下面是我们的简化测试 :
示例_测试.go:
package test
import (
"os"
"path"
"testing"
"github.com/pulumi/pulumi/pkg/testing/integration"
)
func TestExamples(t *testing.T) {
awsRegion := os.Getenv("AWS_REGION")
if awsRegion == "" {
awsRegion = "us-west-1"
}
cwd, _ := os.Getwd()
integration.ProgramTest(t, &integration.ProgramTestOptions{
Quick: true,
SkipRefresh: true,
Dir: path.Join(cwd, "..", "..", "aws-js-s3-folder"),
Config: map[string]string{
"aws:region": awsRegion,
},
})
} 此测试经历了创建、修改和销毁文件夹堆栈的基本生命周期 aws-js-s3-folder。 报告通过的测试大约需要一分钟:
$ go test .
PASS
ok ... 43.993s 有许多选项可以自定义这些测试的行为。 查看完整的选项列表。 ProgramTestOptions。 例如,您可以配置 Jaeger 端点来跟踪(Tracing),表明如果测试结果为负(ExpectFailure),对程序应用一系列“编辑”以实现状态的连续转换(EditDirs) 以及更多。 让我们看看如何使用它们来测试您的应用程序部署。
检查资源属性
上面讨论的集成确保了我们的程序“正常运行”——不会崩溃。 但是如果我们想检查生成的堆栈的属性怎么办? 例如,某些类型的资源已经(或尚未)被供应并且它们具有某些属性。
参数 ExtraRuntimeValidation 为 ProgramTestOptions 允许我们查看 Pulumi 记录的部署后状态,以便我们可以进行其他检查。 这包括生成的堆栈状态的完整快照,包括配置、导出的输出值、所有资源及其属性值以及资源之间的所有依赖关系。
要查看一个基本示例,让我们检查一下我们的程序是否创建了一个 S3水桶:
integration.ProgramTest(t, &integration.ProgramTestOptions{
// as before...
ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
var foundBuckets int
for _, res := range stack.Deployment.Resources {
if res.Type == "aws:s3/bucket:Bucket" {
foundBuckets++
}
}
assert.Equal(t, 1, foundBuckets, "Expected to find a single AWS S3 Bucket")
},
})现在,当我们运行 go test 时,它不仅会经历一系列生命周期测试,而且在成功部署堆栈后,它还会对结果状态执行额外的检查。
运行时测试
到目前为止,所有测试都纯粹是关于部署行为和 Pulumi 资源模型。 如果您想验证您配置的基础设施是否确实有效该怎么办? 例如,虚拟机正在运行,S3存储桶包含我们期望的内容等等。
您可能已经猜到如何执行此操作:选项 ExtraRuntimeValidation 为 ProgramTestOptions ——这是一个很好的机会。 此时,您可以运行自定义 Go 测试,并可以访问程序资源的完整状态。 此状态包括虚拟机 IP 地址、URL 以及与生成的云应用程序和基础设施实际交互所需的所有信息等信息。
例如,我们的测试程序导出属性 webEndpoint 称为桶 websiteUrl,这是我们可以获取配置的完整 URL index document。 虽然我们可以深入研究状态文件来找到 bucket 并直接读取该属性,但在许多情况下,我们的堆栈会导出这样有用的属性,我们发现这些属性可以方便地用于检查:
integration.ProgramTest(t, &integration.ProgramTestOptions{
// as before ...
ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
url := "http://" + stack.Outputs["websiteUrl"].(string)
resp, err := http.Get(url)
if !assert.NoError(t, err) {
return
}
if !assert.Equal(t, 200, resp.StatusCode) {
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if !assert.NoError(t, err) {
return
}
assert.Contains(t, string(body), "Hello, Pulumi!")
},
}) 与我们之前的运行时检查一样,此检查将在引发堆栈后立即执行,所有这些都是为了响应简单的调用 go test。 这只是冰山一角——您可以用代码编写的每个 Go 测试功能都可用。
持续的基础设施集成
当进行大量基础设施更改以在提交代码审查之前进行测试时,能够在笔记本电脑上运行测试是件好事。 但我们和我们的许多客户在开发生命周期的各个阶段测试基础设施:
- 在合并之前的每个开放拉取请求中进行测试。
- 为了响应每次提交,仔细检查合并是否正确完成。
- 定期(例如晚上或每周)进行额外测试。
- 作为性能或压力测试的一部分,通常会运行很长一段时间并并行运行测试和/或多次部署同一程序。
对于其中的每一个,Pulumi 都支持与您最喜欢的持续集成系统集成。 通过持续集成,这可以为您的基础设施提供与应用程序软件相同的测试覆盖范围。
Pulumi 支持常见的 CI 系统。 这里是其中的一些:
有关更详细的信息,请参阅文档 .
短暂的环境
一个非常强大的机会是能够仅出于验收测试目的部署临时环境。 概念 Pulumi 旨在轻松部署和拆除完全隔离和独立的环境,所有这些都可以通过几个简单的 CLI 命令或使用集成测试框架来完成。
如果您使用 GitHub,那么 Pulumi 提供 ,这将帮助您将验收测试连接到 CI 管道中的拉取请求。 只需在 GitHub 存储库中安装该应用程序,Pulumi 就会向您的 CI 和池请求添加有关基础设施预览、更新和测试结果的信息:

当您使用 Pulumi 进行核心验收测试时,您将获得新的自动化功能,这将提高团队生产力并使您对变更的质量充满信心。
总
在本文中,我们看到,通过使用通用编程语言,我们可以使用许多在开发应用程序时有用的软件开发技术。 它们包括单元测试、集成测试以及它们如何协同工作来执行广泛的运行时测试。 测试很容易按需运行或在 CI 系统中运行。
普鲁米 - 开源软件,免费使用并与您最喜欢的编程语言和云配合使用 - !
→
来源: habr.com
