Azure CLI自动化测试编写指南
azure-cli Azure Command-Line Interface 项目地址: https://gitcode.com/gh_mirrors/az/azure-cli
概述
在Azure CLI项目中,自动化测试是确保命令行工具质量和稳定性的重要手段。本文将深入讲解如何为Azure CLI编写有效的自动化测试,包括单元测试和集成测试两种类型。
测试类型
单元测试
单元测试用于验证单个函数或方法的正确性,Azure CLI支持使用Python标准库中的unittest框架编写单元测试。
集成测试
集成测试则验证多个组件协同工作的情况,Azure CLI提供了两种集成测试类:
ScenarioTest
- 支持通过VCR.py录制和回放的测试LiveScenarioTest
- 仅用于实时测试的基类
可回放测试原理
Azure CLI将用户输入转换为对Azure Python SDK的调用,这些调用最终会与Azure REST API进行HTTP通信。测试框架会捕获并记录这些HTTP交互,使得测试可以在自动化环境中回放而无需实际发起HTTP请求。
这种机制既保证了命令在实际服务中的可用性(录制时验证),又提供了防止回归或破坏性变更的保护(回放时验证)。
测试策略与最佳实践
核心测试策略
- 禁止使用硬编码资源:所有测试资源应在测试过程中动态创建和销毁
- 测试覆盖率要求:
- 新模块必须包含测试
- 现有模块的新命令必须包含测试
- 命名规范:测试方法名格式应为
test_<模块>_<功能>
- 实时测试维护:测试必须能够在实时模式下重复运行
测试覆盖率目标
- 命令覆盖率100%:除
wait
命令外,模块中所有命令都必须有测试覆盖 - 示例覆盖率100%:命令的所有使用示例都必须有测试覆盖
- 参数覆盖率100%:命令的所有参数都应该有测试覆盖
- 边界值覆盖:特别关注空字符串、null、0和False等边界值
测试编写实战
基础测试示例
from azure.cli.testsdk import ScenarioTest
class StorageAccountTests(ScenarioTest):
def test_list_storage_account(self):
self.cmd('az storage account list')
关键点:
- 使用
self.cmd
执行命令并自动验证退出码 - 所有测试工具类都在
azure.cli.testsdk
命名空间中
验证JSON输出
class StorageAccountTests(ScenarioTest):
def test_list_storage_account(self):
accounts_list = self.cmd('az storage account list').get_output_in_json()
assert len(accounts_list) > 0
使用JMESPath验证输出
class StorageAccountTests(ScenarioTest):
def test_list_storage_account(self):
self.cmd('az account list-locations', checks=[
self.check("[?name=='westus'].displayName | [0]", 'West US')
])
资源组准备器
from azure.cli.testsdk import ScenarioTest, ResourceGroupPreparer
class StorageAccountTests(ScenarioTest):
@ResourceGroupPreparer()
def test_create_storage_account(self, resource_group):
self.cmd('az group show -n {rg}', checks=[
self.check('name', '{rg}'),
self.check('properties.provisioningState', 'Succeeded')
])
特点:
- 资源组会在测试完成后自动清理
- 资源组名称自动注册到
self.kwargs
中,可通过{rg}
引用
随机名称生成
class StorageAccountTests(ScenarioTest):
def test_create_storage_account(self):
self.kwargs.update({
'name': self.create_random_name(prefix='cli', length=24)
})
self.cmd('az storage account create -n {name}')
重要说明:
create_random_name
确保测试在录制和回放时名称一致- 在实时测试中生成真正的随机名称避免冲突
高级测试技巧
多资源准备器
from azure.cli.testsdk import ResourceGroupPreparer, StorageAccountPreparer
class StorageAccountTests(ScenarioTest):
@ResourceGroupPreparer()
@StorageAccountPreparer(parameter_name='account1')
@StorageAccountPreparer(parameter_name='account2')
def test_list_storage_accounts(self, account1, account2):
accounts = self.cmd('az storage account list').get_output_in_json()
assert len([a for a in accounts if a['name'] in (account1, account2)]) == 2
错误断言
class StorageAccountTests(ScenarioTest):
def test_invalid_sku(self):
with self.assertRaises(Exception):
self.cmd('az storage account create -n invalid --sku InvalidSKU')
测试录制与执行
首次录制测试
- 设置开发环境并登录Azure
- 选择要测试的API配置文件和云环境
- 运行测试,录制文件会自动生成在
recording/
目录下 - 提交测试代码和录制文件
测试执行模式
- 回放模式:默认模式,使用录制的HTTP交互
- 实时模式:设置
AZURE_TEST_RUN_LIVE
环境变量或使用--live
参数
常见问题排查
- 非确定性结果:检查并发操作和参数别名
- 路径问题:参数中的路径值应使用双引号包裹
- 默认值干扰:运行测试前清除所有
az configure
设置的默认值
总结
编写高质量的Azure CLI测试需要遵循项目规范并理解测试框架的工作原理。通过合理使用准备器、随机名称生成和输出验证等技术,可以创建既可靠又易于维护的自动化测试。记住保持测试的独立性和可重复性,确保它们能够在各种环境中稳定运行。
azure-cli Azure Command-Line Interface 项目地址: https://gitcode.com/gh_mirrors/az/azure-cli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考