使用 Terratest 自动化测试 Azure Container Registry:terraform-azure-acr-example 实战指南
发布时间:2026/9/27 9:23:01来源:尧图网络
测试开发工具DevOps质量保障【免费下载链接】terratestTerratest is a Go library that makes it easier to write automated tests for your infrastructure code.项目地址https://gitcode.com/gh_mirrors/te/terratest点击查看免费下载本指南以 Terratest 仓库中的 terraform-azure-acr-example 示例模块为核心讲解如何用 Terraform 在 Azure 上部署 Azure Container RegistryACR并借助 Terratest 编写端到端自动化测试来独立校验 ACR 的真实状态。读完本文你将掌握 ACR 的 Terraform 资源配置方法、Terratest Azure 测试的完整写法以及 Terratest 底层通过 Azure SDK 独立断言资源属性的实现原理。示例模块概览examples/azure/terraform-azure-acr-example/目录是一个完整的 Terraform 模块其作用是在 Azure 上创建一个资源组Resource Group在该资源组中部署一个启用了管理员凭据的 Azure Container Registry通过 output.tf 暴露资源组名、ACR 名称、登录服务器地址以及管理员用户名/密码等输出值配合 test/azure/terraform_azure_acr_example_test.go 中的自动化测试验证资源真实创建且属性符合预期。费用警告该模块及其自动化测试会在你的 Azure 账户中部署真实资源可能产生费用。这些资源均属于 Azure 免费账户Azure Free Account覆盖范围如果你尚未用尽免费额度则通常免费但你需要自行承担所有 Azure 费用。手动运行模块如果你只想用 Terraform 手动部署这套 ACR 资源按以下步骤操作注册 Azure 账户使用 Azure CLI 支持的方法之一配置 Azure 凭据安装 Terraform 并确保其位于PATH中确保所需的 环境变量 已设置就绪在examples/azure/terraform-azure-acr-example/目录下运行terraform init运行terraform apply完成后运行terraform destroy清理资源。环境变量配置Terratest 的 Azure 模块与 Terraform 的azurermprovider 共享一套 ARM 凭据环境变量。在测试主机上需要预先导出以下变量参考 examples/azure/README.mdexport ARM_CLIENT_IDyour_app_id export ARM_CLIENT_SECRETyour_password export ARM_SUBSCRIPTION_IDyour_subscription_id export ARM_TENANT_IDyour_tenant_id # AZURE_ENVIRONMENT 为可选的 Azure 云环境名称取值如下 export AZURE_ENVIRONMENTAzureUSGovernmentCloud export AZURE_ENVIRONMENTAzureChinaCloud export AZURE_ENVIRONMENTAzureGermanCloud export AZURE_ENVIRONMENTAzurePublicCloud export AZURE_ENVIRONMENTAzureStackCloud其中AZURE_ENVIRONMENT对应非商用云环境部署场景它会被 modules/azure/client_factory.go 读取用于设置正确的 Azure 端点如 China 云的core.chinacloudapi.cn、US Government 云的core.usgovcloudapi.net等。在 Windows 环境中这些变量需要设置为系统环境变量可在管理员权限的 PowerShell 中使用[System.Environment]::SetEnvironmentVariable(...)完成设置。从源码实现看ARM_SUBSCRIPTION_ID是 Terratest 的 Azure 模块在调用方未显式传入订阅 ID 时的回退来源见 modules/azure/common.go 中的getTargetAzureSubscription同理AZURE_RES_GROUP_NAME可作为资源组名的回退值。此外client_factory.go中的getDefaultEnvironmentName在未设置AZURE_ENVIRONMENT时默认回退到AzurePublicCloud。Terraform 配置深度解析主配置 main.tfmain.tf 完整内容如下terraform { required_version 1.0 required_providers { azurerm { source hashicorp/azurerm version ~ 4.0 } } } provider azurerm { features {} } resource azurerm_resource_group rg { name terratest-acr-rg-${var.postfix} location var.location } resource azurerm_container_registry acr { name acr${var.postfix} location azurerm_resource_group.rg.location resource_group_name azurerm_resource_group.rg.name sku var.sku admin_enabled true tags { Environment Development } }关键点说明Terraform 版本约束模块声明required_version 1.0即至少需要 Terraform 1.0azurerm provider使用hashicorp/azurerm版本约束为~ 4.04.x 系列。features {}块是 azurerm provider 4.x 的必需配置资源组命名采用terratest-acr-rg-${var.postfix}模式postfix用于规避资源命名冲突ACR 资源azurerm_container_registry的关键属性包括location继承资源组位置、resource_group_name、sku服务层级、admin_enabled true启用管理员凭据便于测试断言以及tags标签资源组与 ACR 之间通过azurerm_resource_group.rg.location与azurerm_resource_group.rg.name建立隐式依赖保证 ACR 一定创建在资源组之后。变量定义 variables.tfvariables.tf 定义了三组可选参数均有合理默认值变量类型默认值说明skustringPremiumACR 的服务层级SKU。Azure 支持Basic、Standard、Premium三种层级Premium具备异地复制、私有端点等高级能力locationstringWest US2资源所在的 Azure 区域需为该区域支持的合法名称postfixstring1276追加到资源名末尾的后缀字符串用于集中缓解资源命名冲突这些变量不是必填项——你可以在terraform apply时通过-var或-var-file覆盖也可以直接使用默认值。输出定义 output.tfoutput.tf 暴露了 5 个输出值供自动化测试取用output resource_group_name { value azurerm_resource_group.rg.name } output container_registry_name { value azurerm_container_registry.acr.name } output login_server { value azurerm_container_registry.acr.login_server } output admin_username { value azurerm_container_registry.acr.admin_username sensitive true } output admin_password { value azurerm_container_registry.acr.admin_password sensitive true }其中admin_username与admin_password被标记为sensitive true避免在 Terraform 输出中明文泄露管理员凭据。编写 ACR 自动化测试在 test/azure/terraform_azure_acr_example_test.go 中Terratest 提供了一个针对该模块的端到端集成测试。测试文件顶部带有构建标签//go:build azure // build azure这意味着该测试仅在显式指定-tags azure时才会编译运行。测试核心流程生成唯一后缀strings.ToLower(random.UniqueID())生成随机小写后缀避免与既有资源冲突导入自modules/core/v2/random配置 Terraform Options通过terraform.Options指定 Terraform 代码目录../../examples/azure/terraform-azure-acr-example并用Vars传入postfix与sku注册清理defer terraform.DestroyContext(t, t.Context(), terraformOptions)保证测试结束后自动执行terraform destroy清理资源初始化并应用terraform.InitAndApplyContext(t, t.Context(), terraformOptions)依次执行terraform init与terraform apply任何错误都会导致测试失败读取输出terraform.OutputContext读取resource_group_name、container_registry_name、login_server三个输出值独立断言详细见下节。独立断言Terratest 的价值所在测试最后一段使用 Terratest 的 Azure 模块对真实云端资源进行独立验证而不只是信任 Terraform 的输出assert.True(t, azure.ContainerRegistryExistsContext(t, t.Context(), acrName, resourceGroupName, )) actualACR : azure.GetContainerRegistryContext(t, t.Context(), acrName, resourceGroupName, ) assert.Equal(t, loginServer, *actualACR.Properties.LoginServer) assert.True(t, *actualACR.Properties.AdminUserEnabled) assert.Equal(t, acrSKU, string(*actualACR.SKU.Name))三个断言分别验证ACR 资源确实存在于 Azure 上存在性校验Terraform 输出的login_server与 Azure 实际返回的Properties.LoginServer一致AdminUserEnabled为true即管理员凭据已启用实际 SKU 名称与测试中配置的Premium一致。这种用 Azure SDK 独立查询真实资源、再与 Terraform 输出对比的测试模式正是 Terratest 的核心设计——它通过 Go 调用azure-sdk-for-go独立确认 Azure 资源属性与 Terraform 输出变量提供的期望状态一致见 examples/azure/README.md。底层实现Azure SDK 调用链Terratest 的 Azure 容器相关 API 位于 modules/azure/containers.go关键函数如下ContainerRegistryExistsContext(t, ctx, registryName, resourceGroupName, subscriptionID) bool返回 ACR 是否存在出错即 fail 测试其 E 后缀版本返回(bool, error)GetContainerRegistryContext(t, ctx, registryName, resGroupName, subscriptionID) *armcontainerregistry.Registry返回 ACR 对象基于azure-sdk-for-go的armcontainerregistry.Registry类型GetContainerRegistryContextE先通过getTargetAzureResourceGroupName解析资源组名再调用CreateContainerRegistryClientContextE创建 SDK 客户端最后执行client.Get存在性判断基于ResourceNotFoundErrorExists若查询返回资源未找到错误则返回false资源不存在否则视为其他真实错误向上抛出。客户端创建逻辑位于 modules/azure/client_factory.go 的CreateContainerRegistryClientContextE它通过getArmContainerRegistryClientFactory使用DefaultAzureCredential读取前述 ARM 环境变量完成认证创建armcontainerregistry.RegistriesClient。整套链路可概括为测试代码 → terraform.Options → terraform init/apply → terraform output → azure.ContainerRegistryExistsContext / GetContainerRegistryContext → client_factory.CreateContainerRegistryClientContextEDefaultAzureCredential 认证 → armcontainerregistry.RegistriesClient.Get → 断言对比此外ContainerRegistryExistsContextE中资源不存在时返回false, nil而非错误这一行为与 modules/azure/resourcegroup.go 中ResourceGroupExistsContextE对ResourceGroupNotFound错误的处理逻辑一致属于 Terratest 统一的存在性查询设计约定。运行自动化测试按以下步骤运行该示例的自动化测试注册 Azure 账户并配置凭据同手动运行的前置条件安装 Terraform 并确保在PATH中配置好 Terratest 的 Go 测试环境安装 Go 并将代码检出到工作区切换到test/azure目录cd test/azure先编译验证go build terraform_azure_acr_example_test.go执行测试go test -v -timeout 60m -tags azure -run TestTerraformAzureACRExample要点说明-tags azure是必须的否则构建标签//go:build azure会让该测试被跳过-timeout 60m为测试预留了充足时间因为真实部署 ACR 可能需要数分钟-run TestTerraformAzureACRExample精确匹配目标测试函数测试使用t.Parallel()并行执行多个示例测试可同时运行测试结束后通过defer自动执行terraform destroy但若测试中途被强制终止仍需手动清理残留资源。从源码结构看test/azure/目录下还包含其他 Azure 示例的同类测试如terraform_azure_resourcegroup_example_test.go等它们共享同一套 Terratest Azure 模块与测试模式可相互参照。若修改了go.mod或测试文件应先通过go build确认可以正常编译参见 examples/azure/README.md。小结通过terraform-azure-acr-example你可以完整掌握一条Terraform 部署 ACR Terratest 独立验证的最佳实践链路用 main.tf 声明式定义资源组与容器注册表用 variables.tf 参数化命名与 SKU用 output.tf 暴露关键输出再以 terraform_azure_acr_example_test.go 作为模板把同样的init → apply → output → SDK 独立断言 → destroy模式复用到 Azure 上的其他基础设施资源测试中。赞分享测试开发工具DevOps质量保障【免费下载链接】terratestTerratest is a Go library that makes it easier to write automated tests for your infrastructure code.项目地址https://gitcode.com/gh_mirrors/te/terratest点击查看免费下载相关推荐Terratest 实战为 Azure Container InstancesACITerraform 模块编写自动化测试Terratest 实战为 Azure Container InstancesACITerraform 模块编写自动化测试 导读 本文以 Terrates测试开发工具DevOps质量保障PrimeNG TreeTable 组件完全指南层级数据表格的渲染、交互与无障碍实现PrimeNG TreeTable 组件完全指南层级数据表格的渲染、交互与无障碍实现 TreeTable 是 PrimeNG当前仓库中的完整 Angular测试开发工具DevOps质量保障使用 Terratest 自动化测试 Azure Recovery Services从 Terraform 模块到 Go 集成测试实战使用 Terratest 自动化测试 Azure Recovery Services从 Terraform 模块到 Go 集成测试实战 本篇指南以 Terra测试开发工具DevOps质量保障上一篇碧蓝航线Alas自动化脚本完整配置手册下一篇MediaPipe Python安装新手指南两分钟跑起来3个高频红色报错附解法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网