通过创作自定义测试来实施域特定的规则

已完成

到目前为止,你了解了如何在模板上运行一些测试。 但是,你可能是在具有自己的一组规则的公司或团队中操作。 这些规则可能意味着你需要自定义测试体验。 你可能会遇到以下情况:

  • 运行特定测试套件。 安装测试工具包后,你会拥有一组将要运行的测试。 这些测试位于 <install directory>/arm-ttk/testcases/deploymentTemplate 目录中。

    可自定义这种测试运行体验。 正如我们在上个单元中看到的那样,一种自定义方法是使用参数 -Test。 你也可通过删除目录中的文件来编辑正在运行的测试。 可使用 -Skip 参数跳过特定测试。

  • 创作并运行域特定的测试。 可创作测试文件来强制实施域特定的规则。 本单元将重点介绍此方案。

创作和运行自己的测试

你已决定自行创作域特定的测试。 创作和运行此类测试的流程如下:

  1. 在 <install directory>/arm-ttk/testcases/deploymentTemplate 目录中创建文件。
  2. 在 PowerShell 中创作文件。
  3. 运行文件并检查结果。

创建自定义测试

需要将自定义测试置于正确的目录:<install directory>/arm-ttk/testcases/deploymentTemplate。 还需要遵循命名标准:即带有短划线和后缀 .test,并以 .ps1 结尾。 典型的测试文件如下所示:

Domain-Specific.test.ps1

创作

若要创建测试文件名,需要在 PowerShell 中编写它。 测试文件的三个部分为:

  • 文档 此部分可选,但添加它将非常有用。 它位于文件的顶部,通常包含一组描述测试、用途和调用方式的注释。 注释可能与以下示例类似:

    <#
    .Synopsis
         Ensures that all IDs use the resourceID() function.
    .Description
         Ensures that all IDs use the resourceID() function, or resolve to parameters or variables that use the ResourceID() function.
    .Example
         Test-AzTemplate -TemplatePath .\100-marketplace-sample\ -Test IDs-Should-Be-Derived-From-ResourceIDs
    #>
    

    上述示例在一个名为 .Synopsis 的节中通过简短说明描述了测试的用途。 在名为 .Description 的节中提供了更详细的说明。 最后,有一个名为 .Example 的节,它显示了运行测试的不同方法。

  • 输入参数。 测试文件可具有一组输入参数。 本节由关键字 param 和括号定义。 它通常如下所示:

    param(
       [Parameter(Mandatory=$true)]
       [PSObject]$TemplateObject,
    
       [Parameter(Mandatory=$true)]
       [string]$TemplateFileName,
    
       [string]$SampleName = "$ENV:SAMPLE_NAME"
    )
    

    上述示例显示了三个参数:$TemplateObject$TemplateFileName$SampleName。 如 Parameter[(Mandatory = $true)] 装饰所示,前两个参数是必需参数。 参数根据其含义进行命名。 $TemplateObject 包含模板文件的对象表示形式,而 TemplateFileName 包含要测试的文件的名称。

    提示

    有关参数的详细信息,请参阅 ARM 模板测试工具包

  • 测试逻辑。 测试的最后一个部分是测试逻辑。 大多数测试通常需要执行以下步骤:

    1. 循环访问模板。
    2. 验证一个或多个条件。
    3. 如有错误,请提出错误。

代码帮助程序

存在大量帮助程序,它们将帮助你找到所需内容和报告任何错误。 下面是代码帮助程序的两个示例:

  • Find-JsonContent。 可帮助查找具有特定值的特定元素。 下面是一个示例:

    Find-JsonContent -Key apiVersion -Value * -Like
    

    上面的代码可帮助查找名称为 apiVersion 且值为 * 的 JSON 属性,这实际上是指所有名为 apiVersion 的属性。 它将匹配 JSON 对象,如下所示:

    {
       "apiVersion": "2021-01-01"
    }
    
  • Write-Error。 可帮助你与测试运行程序通信,使后者知道模板中存在错误。 可用它来表示错误消息,并将所需的任何变量插入字符串表达式。 下述示例介绍了如何使用该帮助程序:

      Write-Error "Resource $($resource.Name) Location must be located in westeurope'" -TargetObject $resource
    

运行测试

现在你已创作测试。 该文件将与同一目录中的其他所有文件一起运行。

与上面的示例一样,可选择仅使用 -Test 参数运行特定的测试文件。 作为参数,可为其指定不含文件扩展名的测试文件名。 Custom-Test.test.ps1 随后将通过 Test-AzTemplate -TemplatePath /path/to/template -Test Custom-Test 自行运行。