练习 - 使用测试工具包创作和运行自定义测试

已完成

产品团队的成员知道必须能够实施一些团队规则或域特定的规则。 要实现此目的,一种方法是将规则作为测试来实施。 然后,可使用测试工具包运行这些测试。

创作和运行自定义测试

你将创作一个自定义测试,然后使用测试工具包工具来运行该测试。 此外,需要更正部署模板以确保测试通过。 自定义测试将寻求验证所有参数是否都遵循命名规则。 此规则是你正在工作的团队对产品的域专属要求。

建议为此练习打开两个文本编辑器:

  • 创作自定义测试。 找到测试工具包安装目录的子目录 arm-ttk/testcases/deploymentTemplate/ 的路径。 你将从此处运行 Visual Studio Code,在其中创建和编辑自定义测试。
  • 创作模板文件并运行测试。 选择要用于此路径的位置。 建议从此路径启动 Visual Studio Code 的实例,以便在系统询问你时,你可轻松编辑 azuredeploy.json 文件。 使用此 Visual Studio Code 实例启动集成终端,以便轻松运行测试。

创建模板文件

选择目录,然后创建一个名为 azuredeploy.json 的文件。

警告

确保所选目录为空,不包含任何子目录。

为该目录提供以下内容:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "resources": []
}

创建自定义测试

  1. 打开 Visual Studio Code,然后转到测试工具包的安装目录。 转到子目录 arm-ttk/testcases/deploymentTemplate 中。 运行以下命令:

    code .
    

    注意

    如果路径中没有 Visual Studio Code,则手动打开 Visual Studio Code 并打开目录。

  2. 创建一个名为 Custom-ParameterNaming.test.ps1 的自定义测试文件。 为文件提供以下内容:

    param(
    [Parameter(Mandatory=$false,Position=0)] #not mandatory for case of an empty resource array
    [PSObject]
    $MainTemplateResources
    )
    
    Write-Error "To be implemented"
    

    使文本编辑器保持打开状态。 稍后会编辑此文件。

运行自定义测试

按照以下步骤运行自定义测试:

  1. 打开新的终端窗口或重用旧的终端窗口。

  2. 转到创建 azuredeploy.json 所在的目录。 运行以下命令来启动 Visual Studio Code:

    code .
    

    备注

    如果路径中没有 Visual Studio Code,则手动打开 Visual Studio Code 并打开模板目录。

  3. 在 Visual Studio Code 中,通过从顶部菜单中选择“终端”>“新终端”来打开集成终端。 在终端中运行以下命令,启动 PowerShell shell:

    pwsh
    

    应看到与以下内容类似的输出:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    
  4. 在终端中运行 Import-Module

    备注

    在导入模块之前,将 path/to/arm-ttk/arm-ttk.psd1 替换为已下载的测试工具包的路径。

    Import-Module path/to/arm-ttk/arm-ttk.psd1
    

    提示

    如果将工具下载或克隆到“下载”目录,则路径将类似于 /Users/<user>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1。

    现在可以使用该工具了。 只要处于同一 PowerShell 会话中,就无需再次运行导入命令。

  5. 在终端中运行 Test-AzTemplate,启动测试运行:

    Test-AzTemplate -TemplatePath .
    

    输出如下所示。 请注意,突出显示的行显示了测试:

    Validating custom\azuredeploy.json
      JSONFiles Should Be Valid
        [+] JSONFiles Should Be Valid (56 ms)
    Pass  : 1
    Fail  : 0
    Total : 1
    
    
    
      adminUsername Should Not Be A Literal
        [+] adminUsername Should Not Be A Literal (68 ms)
      apiVersions Should Be Recent In Reference Functions
        [+] apiVersions Should Be Recent In Reference Functions (203 ms)
      apiVersions Should Be Recent
        [+] apiVersions Should Be Recent (137 ms)
      artifacts parameter
        [+] artifacts parameter (145 ms)
      CommandToExecute Must Use ProtectedSettings For Secrets
        [+] CommandToExecute Must Use ProtectedSettings For Secrets (171 ms)
      deploymentTemplate
        [-] Custom ParameterNaming (354 ms)
            To be implemented
    
      DependsOn Best Practices
        [+] DependsOn Best Practices (152 ms)
      Deployment Resources Must Not Be Debug
        [+] Deployment Resources Must Not Be Debug (152 ms)
      DeploymentTemplate Must Not Contain Hardcoded Uri
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (185 ms)
      DeploymentTemplate Schema Is Correct
        [+] DeploymentTemplate Schema Is Correct (197 ms)
      Dynamic Variable References Should Not Use Concat
        [+] Dynamic Variable References Should Not Use Concat (157 ms)
      IDs Should Be Derived From ResourceIDs
        [+] IDs Should Be Derived From ResourceIDs (69 ms)
      Location Should Not Be Hardcoded
        [+] Location Should Not Be Hardcoded (260 ms)
      ManagedIdentityExtension must not be used
        [+] ManagedIdentityExtension must not be used (70 ms)
      Min And Max Value Are Numbers
        [+] Min And Max Value Are Numbers (213 ms)
      Outputs Must Not Contain Secrets
        [+] Outputs Must Not Contain Secrets (76 ms)
      Parameter Types Should Be Consistent
        [+] Parameter Types Should Be Consistent (68 ms)
      Parameters Must Be Referenced
        [+] Parameters Must Be Referenced (93 ms)
      Password params must be secure
        [+] Password params must be secure (111 ms)
      providers apiVersions Is Not Permitted
        [+] providers apiVersions Is Not Permitted (68 ms)
      ResourceIds should not contain
        [+] ResourceIds should not contain (210 ms)
      Resources Should Have Location
        [+] Resources Should Have Location (113 ms)
      Resources Should Not Be Ambiguous
        [+] Resources Should Not Be Ambiguous (147 ms)
      Secure Params In Nested Deployments
        [+] Secure Params In Nested Deployments (242 ms)
      Secure String Parameters Cannot Have Default
        [+] Secure String Parameters Cannot Have Default (129 ms)
      Template Should Not Contain Blanks
        [+] Template Should Not Contain Blanks (201 ms)
      URIs Should Be Properly Constructed
        [+] URIs Should Be Properly Constructed (180 ms)
      Variables Must Be Referenced
        [+] Variables Must Be Referenced (132 ms)
      Virtual Machines Should Not Be Preview
        [+] Virtual Machines Should Not Be Preview (91 ms)
      VM Images Should Use Latest Version
        [+] VM Images Should Use Latest Version (114 ms)
      VM Size Should Be A Parameter
        [+] VM Size Should Be A Parameter (130 ms)
    Pass  : 31
    Fail  : 1
    Total : 32
    

    现已找到测试,将此终端窗口保持打开状态。 稍后会重复使用该窗口。

重构自定义测试

现在,将为该自定义测试提供适当的实现。

  1. 返回到包含文件 Custom-ParameterNaming.test.ps1 的文本编辑器。

    备注

    如果不小心关闭了 Visual Studio Code,请转到子目录 arm-ttk/testcases/deploymentTemplate,然后打开 Custom-ParameterNaming.test.ps1。

  2. 将文件内容替换为以下代码:

    <#
    .Synopsis
     Ensures that all parameters adheres to a naming standard
    .Description
     All parameters should start with the company specific prefix 'tailwind'
    #>
    param(
       # The Template Object
       [Parameter(Mandatory = $true, Position = 0)]
       [PSObject]
       $TemplateObject,
    
       # The Template JSON Text
       [Parameter(Mandatory = $true, Position = 0)]
       [PSObject]
       $TemplateText
    )
    
    foreach ($parameter in $TemplateObject.parameters.psobject.properties) {
      # If the parameter name starts with tailwind, then the parameter is correctly named
      if ($parameter.Name -notmatch 'tailwind*') {
         Write-Error "Parameter '$($parameter.Name)' must start with prefix 'tailwind'" -TargetObject $parameter
      }
    }
    

    前面的代码将循环访问所有参数。 它将检查 name 属性,并检查该名称是否以前缀 tailwind 开头。 如果检查的参数与命名规则不匹配,则代码将调用 Write-Error cmdlet,并显示适当的错误消息。

更新模板文件

现在,将向模板文件添加参数。

  1. 选择包含 azuredeploy.json 的文本编辑器,然后将文件内容更改为以下内容:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "location": {
          "type": "string",
          "metadata": {
            "description": "a deployment location"
          }
        }
      },
      "resources": []
    }
    

    上述模板内容定义了一个不符合命名规则的参数 location,因为其中缺少 tailwind 前缀。

重新运行测试工具包

现在你已编写了一个自定义测试。 但模板文件命名不符合要求。 因此,即将进行的测试运行预计会失败。 请执行以下步骤来确保这一点。

使用现有的 Visual Studio Code 集成终端窗口,其中已启动 PowerShell 且已导入测试工具包。

在 Visual Studio Code 中,在集成终端运行 Test-AzTemplate

Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming

上面的命令使用参数 -Test 运行,该参数以测试名称作为输入。 你已提供 Custom-ParameterNaming 作为参数,这意味着将仅运行新开发的测试。

提示

在开发测试时,一种很好的做法是使用 -Test 参数,因为它会限制运行的内容和终端输出的大小。

此命令会生成以下输出:

Validating custom\azuredeploy.json
 deploymentTemplate
   [-] Custom ParameterNaming (2ms)
       Parameter 'location' must start with prefix 'tailwind'

该结果表明你的测试工作正常。 通过更改部署文件来确保这一点。

更正模板文件

此时,你需要更改模板文件以遵守自定义测试列出的规则,从而验证自定义测试是否正确。

  1. 还是在显示 azuredeploy.json 文件的 Visual Studio Code 实例中,将文件内容更改为以下内容:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "tailwindLocation": {
          "type": "string",
          "metadata": {
            "description": "a deployment location"
          }
        }
      },
      "resources": []
    }
    

    名为 location 的参数已重命名为 tailwindLocation。 理论上,此参数现在应该会通过测试。 让我们验证一下。

  2. 继续使用相同的 Visual Studio Code 实例,并在集成终端中运行 Test-AzTemplate

    Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming
    

    输出现在如下所示:

    Validating custom\azuredeploy.json
      deploymentTemplate
        [+] Custom ParameterNaming (2 ms)
    

成功! 你已实现并运行了自定义测试。 你还更正了部署模板以匹配测试条件。

创作和运行自定义测试

你将创作一个自定义测试,然后使用测试工具包工具来运行该测试。 此外,需要更正部署模板以确保测试通过。 自定义测试将寻求验证所有参数是否都遵循命名规则。 此规则是你正在工作的团队对产品的域专属要求。

建议为此练习打开两个文本编辑器:

  • 创作自定义测试。 找到测试工具包安装目录的子目录 arm-ttk/testcases/deploymentTemplate/ 的路径。 你将从此处运行 Visual Studio Code,在其中创建和编辑自定义测试。
  • 创作模板文件并运行测试。 选择要用于此路径的位置。 建议从此路径启动 Visual Studio Code 的实例,以便在系统询问你时,你可轻松编辑 azuredeploy.json 文件。 使用此 Visual Studio Code 实例启动集成终端,以便轻松运行测试。

创建模板文件

选择目录,然后创建一个名为 azuredeploy.json 的文件。

警告

确保所选目录为空,不包含任何子目录。

为该目录提供以下内容:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "resources": []
}

创建自定义测试

  1. 打开终端。 转到测试工具包的安装目录。 转到子目录 arm-ttk/testcases/deploymentTemplate 中。 运行以下命令:

    code .
    

    注意

    如果路径中没有 Visual Studio Code,则手动打开 Visual Studio Code 并打开目录。

  2. 创建一个名为 Custom-ParameterNaming.test.ps1 的自定义文件。 为文件提供以下内容:

    param(
    [Parameter(Mandatory=$false,Position=0)] #not mandatory for case of an empty resource array
    [PSObject]
    $MainTemplateResources
    )
    
    Write-Error "To be implemented"
    

    使文本编辑器保持打开状态。 稍后会编辑此文件。

运行自定义测试

按照以下步骤运行自定义测试:

  1. 打开新的终端窗口或重用旧的终端窗口。

  2. 转到创建 azuredeploy.json 所在的目录。 运行以下命令来启动 Visual Studio Code:

    code .
    

    备注

    如果路径中没有 Visual Studio Code,则手动打开 Visual Studio Code 并打开模板目录。

  3. 在 Visual Code 中,通过从顶部菜单中选择“终端”>“新终端”来打开集成终端。 在终端中运行以下命令,启动 PowerShell shell:

    pwsh
    

    应看到与以下内容类似的输出:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    
  4. 在终端中运行 Import-Module

    备注

    在导入模块之前,将 path/to/arm-ttk/arm-ttk.psd1 替换为已下载的测试工具包的路径。

    Import-Module path/to/arm-ttk/arm-ttk.psd1
    

    提示

    如果将工具下载或克隆到“下载”目录,则路径将类似于 /Users/<user>/Downloads/arm-ttk/arm-ttk/arm-ttk.psd1。

    现在可以使用该工具了。 只要处于同一 PowerShell 会话中,就无需再次运行导入命令。

  5. 在终端中运行 Test-AzTemplate

    Test-AzTemplate -TemplatePath .
    

    输出如下所示。 请注意,突出显示的行显示了测试:

    Validating custom\azuredeploy.json
      JSONFiles Should Be Valid
        [+] JSONFiles Should Be Valid (56 ms)
    Pass  : 1
    Fail  : 0
    Total : 1
    
    
    
      adminUsername Should Not Be A Literal
        [+] adminUsername Should Not Be A Literal (68 ms)
      apiVersions Should Be Recent In Reference Functions
        [+] apiVersions Should Be Recent In Reference Functions (203 ms)
      apiVersions Should Be Recent
        [+] apiVersions Should Be Recent (137 ms)
      artifacts parameter
        [+] artifacts parameter (145 ms)
      CommandToExecute Must Use ProtectedSettings For Secrets
        [+] CommandToExecute Must Use ProtectedSettings For Secrets (171 ms)
      deploymentTemplate
        [-] Custom ParameterNaming (354 ms)
            To be implemented
    
      DependsOn Best Practices
        [+] DependsOn Best Practices (152 ms)
      Deployment Resources Must Not Be Debug
        [+] Deployment Resources Must Not Be Debug (152 ms)
      DeploymentTemplate Must Not Contain Hardcoded Uri
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (185 ms)
      DeploymentTemplate Schema Is Correct
        [+] DeploymentTemplate Schema Is Correct (197 ms)
      Dynamic Variable References Should Not Use Concat
        [+] Dynamic Variable References Should Not Use Concat (157 ms)
      IDs Should Be Derived From ResourceIDs
        [+] IDs Should Be Derived From ResourceIDs (69 ms)
      Location Should Not Be Hardcoded
        [+] Location Should Not Be Hardcoded (260 ms)
      ManagedIdentityExtension must not be used
        [+] ManagedIdentityExtension must not be used (70 ms)
      Min And Max Value Are Numbers
        [+] Min And Max Value Are Numbers (213 ms)
      Outputs Must Not Contain Secrets
        [+] Outputs Must Not Contain Secrets (76 ms)
      Parameter Types Should Be Consistent
        [+] Parameter Types Should Be Consistent (68 ms)
      Parameters Must Be Referenced
        [+] Parameters Must Be Referenced (93 ms)
      Password params must be secure
        [+] Password params must be secure (111 ms)
      providers apiVersions Is Not Permitted
        [+] providers apiVersions Is Not Permitted (68 ms)
      ResourceIds should not contain
        [+] ResourceIds should not contain (210 ms)
      Resources Should Have Location
        [+] Resources Should Have Location (113 ms)
      Resources Should Not Be Ambiguous
        [+] Resources Should Not Be Ambiguous (147 ms)
      Secure Params In Nested Deployments
        [+] Secure Params In Nested Deployments (242 ms)
      Secure String Parameters Cannot Have Default
        [+] Secure String Parameters Cannot Have Default (129 ms)
      Template Should Not Contain Blanks
        [+] Template Should Not Contain Blanks (201 ms)
      URIs Should Be Properly Constructed
        [+] URIs Should Be Properly Constructed (180 ms)
      Variables Must Be Referenced
        [+] Variables Must Be Referenced (132 ms)
      Virtual Machines Should Not Be Preview
        [+] Virtual Machines Should Not Be Preview (91 ms)
      VM Images Should Use Latest Version
        [+] VM Images Should Use Latest Version (114 ms)
      VM Size Should Be A Parameter
        [+] VM Size Should Be A Parameter (130 ms)
    Pass  : 31
    Fail  : 1
    Total : 32
    

    现已找到测试,将此终端窗口保持打开状态。 稍后会重复使用该窗口。

重构自定义测试

现在,将为该自定义测试提供适当的实现。

  1. 返回到包含文件 Custom-ParameterNaming.test.ps1 的文本编辑器。

    备注

    如果不小心关闭了 Visual Studio Code,请转到子目录 arm-ttk/testcases/deploymentTemplate,然后打开 Custom-ParameterNaming.test.ps1。

  2. 将文件内容替换为以下代码:

    <#
    .Synopsis
     Ensures that all parameters adheres to a naming standard
    .Description
     All parameters should start with the company specific prefix 'tailwind'
    #>
    param(
       # The Template Object
       [Parameter(Mandatory = $true, Position = 0)]
       [PSObject]
       $TemplateObject,
    
       # The Template JSON Text
       [Parameter(Mandatory = $true, Position = 0)]
       [PSObject]
       $TemplateText
    )
    
    foreach ($parameter in $TemplateObject.parameters.psobject.properties) {
      # If the parameter name starts with tailwind, then the parameter is correctly named
      if ($parameter.Name -notmatch 'tailwind*') {
         Write-Error "Parameter '$($parameter.Name)' must start with prefix 'tailwind'" -TargetObject $parameter
      }
    }
    

    前面的代码将循环访问所有参数。 它将检查 name 属性,并检查该名称是否以前缀 tailwind 开头。 如果检查的参数与命名规则不匹配,则代码将调用 Write-Error cmdlet,并显示适当的错误消息。

更新模板文件

现在,将向模板文件添加参数。

  1. 选择包含 azuredeploy.json 的文本编辑器,然后将文件内容更改为以下内容:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "location": {
          "type": "string",
          "metadata": {
            "description": "a deployment location"
          }
        }
      },
      "resources": []
    }
    

    上述模板内容定义了一个不符合命名规则的参数 location,因为其中缺少 tailwind 前缀。

重新运行测试工具包

现在你已编写了一个自定义测试。 但模板文件命名不符合要求。 因此,即将进行的测试运行预计会失败。 请执行以下步骤来确保这一点。

备注

使用现有的 Visual Studio Code 集成终端窗口,其中已启动 PowerShell 且已导入测试工具包。

在 Visual Studio Code 中,在集成终端运行 Test-AzTemplate

Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming

上面的命令使用参数 -Test 运行,该参数以测试名称作为输入。 你已提供 Custom-ParameterNaming 作为参数,这意味着将仅运行新开发的测试。

提示

在开发测试时,一种很好的做法是使用此参数,因为它会限制正在运行的内容和终端输出的大小。

此命令会生成以下输出:

Validating custom\azuredeploy.json
 deploymentTemplate
   [-] Custom ParameterNaming (2ms)
       Parameter 'location' must start with prefix 'tailwind'

该结果表明你的测试工作正常。 通过更改部署文件来确保这一点。

更正模板文件

此时,你需要更改模板文件以遵守自定义测试列出的规则,从而验证自定义测试是否正确。

  1. 还是在显示 azuredeploy.json 文件的 Visual Studio Code 实例中,将文件内容更改为以下内容:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "tailwindLocation": {
          "type": "string",
          "metadata": {
            "description": "a deployment location"
          }
        }
      },
      "resources": []
    }
    

    名为 location 的参数已重命名为 tailwindLocation。 理论上,此参数现在应该会通过测试。 让我们验证一下。

  2. 继续使用相同的 Visual Studio Code 实例,并在集成终端中运行 Test-AzTemplate

    Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming
    

    输出现在如下所示:

    Validating custom\azuredeploy.json
      deploymentTemplate
        [+] Custom ParameterNaming (2 ms)
    

成功! 你已实现并运行了自定义测试。 你还更正了部署模板以匹配测试条件。

创作和运行自定义测试

你将创作一个自定义测试,然后使用测试工具包工具来运行该测试。 此外,需要更正部署模板以确保测试通过。 自定义测试将寻求验证所有参数是否都遵循命名规则。 此规则是你正在工作的团队对产品的域专属要求。

建议为此练习打开两个文本编辑器:

  • 创作自定义测试。 找到测试工具包安装目录的子目录 arm-ttk\testcases\deploymentTemplate\ 的路径。 你将从此处运行 Visual Studio Code,在其中创建和编辑自定义测试。
  • 创作模板文件并运行测试。 选择要用于此路径的位置。 建议从此路径启动 Visual Studio Code 的实例,以便在系统询问你时,你可轻松编辑 azuredeploy.json 文件。 使用此 Visual Studio Code 实例启动集成终端,以便轻松运行测试。

创建模板文件

选择目录,然后创建一个名为 azuredeploy.json 的文件。

警告

确保所选目录为空,不包含任何子目录。

为该目录提供以下内容:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "resources": []
}

创建自定义测试

  1. 打开终端。

  2. 转到测试工具包的安装目录。

  3. 转到子目录 arm-ttk\testcases\deploymentTemplate 中。

  4. 运行以下命令:

    code .
    

    注意

    如果路径中没有 Visual Studio Code,则手动打开 Visual Studio Code 并打开目录。

  5. 创建一个名为 Custom-ParameterNaming.test.ps1 的文件,并为文件提供以下内容:

    param(
    [Parameter(Mandatory=$false,Position=0)] #not mandatory for case of an empty resource array
    [PSObject]
    $MainTemplateResources
    )
    
    Write-Error "To be implemented"
    

    使文本编辑器保持打开状态。 稍后会编辑此文件。

运行自定义测试

按照以下步骤运行自定义测试:

  1. 打开新的终端窗口或重用旧的终端窗口。

  2. 转到创建 azuredeploy.json 所在的目录。

  3. 运行以下命令来启动 Visual Studio Code:

    code .
    

    备注

    如果路径中没有 Visual Studio Code,则手动打开 Visual Studio Code 并打开模板目录。

  4. 在 Visual Studio Code 中打开集成终端。 打开命令面板,键入 PowerShell,然后选择“显示集成终端”。

  5. 在终端中运行以下命令:

    备注

    在导入模块之前,将 path\to\arm-ttk\arm-ttk.psd1 替换为已下载的测试工具包的路径。

    Import-Module path\to\arm-ttk\arm-ttk.psd1
    

    提示

    如果将工具下载或克隆到“下载”目录,则路径将类似于 C:\Users\<user>\Downloads\arm-ttk\arm-ttk\arm-ttk.psd1。

    现在可以使用该工具了。 只要处于同一 PowerShell 会话中,就无需再次运行导入命令。

  6. 在终端中运行 Test-AzTemplate

    Test-AzTemplate -TemplatePath .
    

    输出如下所示。 请注意,突出显示的行显示了测试:

    Validating custom\azuredeploy.json
      JSONFiles Should Be Valid
        [+] JSONFiles Should Be Valid (56 ms)
    Pass  : 1
    Fail  : 0
    Total : 1
    
    
    
      adminUsername Should Not Be A Literal
        [+] adminUsername Should Not Be A Literal (68 ms)
      apiVersions Should Be Recent In Reference Functions
        [+] apiVersions Should Be Recent In Reference Functions (203 ms)
      apiVersions Should Be Recent
        [+] apiVersions Should Be Recent (137 ms)
      artifacts parameter
        [+] artifacts parameter (145 ms)
      CommandToExecute Must Use ProtectedSettings For Secrets
        [+] CommandToExecute Must Use ProtectedSettings For Secrets (171 ms)
      deploymentTemplate
        [-] Custom ParameterNaming (354 ms)
            To be implemented
    
      DependsOn Best Practices
        [+] DependsOn Best Practices (152 ms)
      Deployment Resources Must Not Be Debug
        [+] Deployment Resources Must Not Be Debug (152 ms)
      DeploymentTemplate Must Not Contain Hardcoded Uri
        [+] DeploymentTemplate Must Not Contain Hardcoded Uri (185 ms)
      DeploymentTemplate Schema Is Correct
        [+] DeploymentTemplate Schema Is Correct (197 ms)
      Dynamic Variable References Should Not Use Concat
        [+] Dynamic Variable References Should Not Use Concat (157 ms)
      IDs Should Be Derived From ResourceIDs
        [+] IDs Should Be Derived From ResourceIDs (69 ms)
      Location Should Not Be Hardcoded
        [+] Location Should Not Be Hardcoded (260 ms)
      ManagedIdentityExtension must not be used
        [+] ManagedIdentityExtension must not be used (70 ms)
      Min And Max Value Are Numbers
        [+] Min And Max Value Are Numbers (213 ms)
      Outputs Must Not Contain Secrets
        [+] Outputs Must Not Contain Secrets (76 ms)
      Parameter Types Should Be Consistent
        [+] Parameter Types Should Be Consistent (68 ms)
      Parameters Must Be Referenced
        [+] Parameters Must Be Referenced (93 ms)
      Password params must be secure
        [+] Password params must be secure (111 ms)
      providers apiVersions Is Not Permitted
        [+] providers apiVersions Is Not Permitted (68 ms)
      ResourceIds should not contain
        [+] ResourceIds should not contain (210 ms)
      Resources Should Have Location
        [+] Resources Should Have Location (113 ms)
      Resources Should Not Be Ambiguous
        [+] Resources Should Not Be Ambiguous (147 ms)
      Secure Params In Nested Deployments
        [+] Secure Params In Nested Deployments (242 ms)
      Secure String Parameters Cannot Have Default
        [+] Secure String Parameters Cannot Have Default (129 ms)
      Template Should Not Contain Blanks
        [+] Template Should Not Contain Blanks (201 ms)
      URIs Should Be Properly Constructed
        [+] URIs Should Be Properly Constructed (180 ms)
      Variables Must Be Referenced
        [+] Variables Must Be Referenced (132 ms)
      Virtual Machines Should Not Be Preview
        [+] Virtual Machines Should Not Be Preview (91 ms)
      VM Images Should Use Latest Version
        [+] VM Images Should Use Latest Version (114 ms)
      VM Size Should Be A Parameter
        [+] VM Size Should Be A Parameter (130 ms)
    Pass  : 31
    Fail  : 1
    Total : 32
    

    现已找到测试,将此终端窗口保持打开状态。 稍后会重复使用该窗口。

重构自定义测试

现在,将为该自定义测试提供适当的实现。

  1. 返回到包含文件 Custom-ParameterNaming.test.ps1 的文本编辑器。

    备注

    如果不小心关闭了 Visual Studio Code,请转到子目录 testcases/deploymentTemplate,然后打开文件 Custom-ParameterNaming.test.ps1。

  2. 将文件内容替换为以下代码:

    <#
    .Synopsis
     Ensures that all parameters adheres to a naming standard
    .Description
     All parameters should start with the company specific prefix 'tailwind'
    #>
    param(
       # The Template Object
       [Parameter(Mandatory = $true, Position = 0)]
       [PSObject]
       $TemplateObject,
    
       # The Template JSON Text
       [Parameter(Mandatory = $true, Position = 0)]
       [PSObject]
       $TemplateText
    )
    
    foreach ($parameter in $TemplateObject.parameters.psobject.properties) {
      # If the parameter name starts with tailwind, then the parameter is correctly named
      if ($parameter.Name -notmatch 'tailwind*') {
         Write-Error "Parameter '$($parameter.Name)' must start with prefix 'tailwind'" -TargetObject $parameter
      }
    }
    

    前面的代码将循环访问所有参数。 它将检查 name 属性,并检查该名称是否以前缀 tailwind 开头。 如果检查的参数与命名规则不匹配,则代码将调用 Write-Error cmdlet,并显示适当的错误消息。

更新模板文件

现在,将向模板文件添加参数。

  1. 选择包含 azuredeploy.json 的文本编辑器,然后将文件内容更改为以下内容:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "location": {
          "type": "string",
          "metadata": {
            "description": "a deployment location"
          }
        }
      },
      "resources": []
    }
    

    上述模板内容定义了一个不符合命名规则的参数 location,因为其中缺少 tailwind 前缀。

重新运行测试工具包

现在你已编写了一个自定义测试。 但模板文件命名不符合要求。 因此,即将进行的测试运行预计会失败。 请执行以下步骤来确保这一点。

使用现有的 Visual Studio Code 集成终端窗口,其中已启动 PowerShell 且已导入测试工具包。

在 Visual Studio Code 中,在集成终端运行 Test-AzTemplate

Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming

上面的命令使用参数 -Test 运行,该参数以测试名称作为输入。 你已提供 Custom-ParameterNaming 作为参数,这意味着将仅运行新开发的测试。

提示

在开发测试时,一种很好的做法是使用此参数,因为它会限制正在运行的内容和终端输出的大小。

此命令会生成以下输出:

Validating custom\azuredeploy.json
 deploymentTemplate
   [-] Custom ParameterNaming (2ms)
       Parameter 'location' must start with prefix 'tailwind'

该结果表明你的测试工作正常。 通过更改部署文件来确保这一点。

更正模板文件

此时,你需要更改模板文件以遵守自定义测试列出的规则,从而验证自定义测试是否正确。

  1. 还是在显示 azuredeploy.json 文件的 Visual Studio Code 实例中,将文件内容更改为以下内容:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "tailwindLocation": {
          "type": "string",
          "metadata": {
            "description": "a deployment location"
          }
        }
      },
      "resources": []
    }
    

    名为 location 的参数已重命名为 tailwindLocation。 理论上,此参数现在应该会通过测试。 让我们验证一下。

  2. 继续使用相同的 Visual Studio Code 实例,并在集成终端中运行 Test-AzTemplate

    Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming
    

    输出现在如下所示:

    Validating custom\azuredeploy.json
      Custom ParameterNaming
        [+] Custom ParameterNaming (9 ms)
    

成功! 你已实现并运行了自定义测试。 你还更正了部署模板以匹配测试条件。