Exercício – Criar e executar testes personalizados com o toolkit de testes

Concluído

Como membro de uma equipa do produto, sabe que é importante conseguir implementar algumas regras específicas do domínio ou da equipa. Uma forma de o fazer é ao implementar as regras como testes. Em seguida, pode executar estes testes com o toolkit de testes.

Cria e executar um teste personalizado

Irá criar um teste personalizado e utilizar a ferramenta do toolkit de testes para o executar. Também irá corrigir o modelo de implementação para garantir que passa o teste. O teste personalizado irá procurar verificar se todos os parâmetros seguem uma regra de nomenclatura. Esta regra é um requisito específico do domínio no produto em que a equipa está a trabalhar.

Recomendamos que tenha dois editores de texto abertos para este exercício:

  • Crie um teste personalizado. Localize o caminho do subdiretório arm-ttk/testcases/deploymentTemplate/ do diretório de instalação do toolkit de testes. A partir daqui, irá executar o Visual Studio Code, onde irá criar e editar um teste personalizado.
  • Crie um ficheiro de modelo e execute testes. Selecione a localização desejada para este caminho. Recomendamos que inicie uma instância do Visual Studio Code a partir deste caminho, para que possa editar facilmente o ficheiro azuredeploy.json quando lhe for pedido. Inicie um terminal integrado com esta instância do Visual Studio Code para que seja mais fácil executar testes.

Criar o ficheiro de modelo

Escolha um diretório e crie um ficheiro chamado azuredeploy.json.

Aviso

Verifique se o diretório selecionado está vazio e não tem subdiretórios.

Adicione os seguintes conteúdos ao mesmo:

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

Crie o teste personalizado

  1. Abra o Visual Studio Code e aceda ao seu diretório de instalação do toolkit de testes. Aceda ao subdiretório arm-ttk/testcases/deploymentTemplate. Execute o seguinte comando:

    code .
    

    Nota

    Abra o Visual Studio Code manualmente e abra o diretório, se o Visual Studio Code não estiver no caminho.

  2. Crie um ficheiro de teste personalizado chamado Custom-ParameterNaming.test.ps1. Atribua o seguinte conteúdo ao ficheiro:

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

    Deixe o editor de texto aberto. Irá editar este ficheiro mais tarde.

Executar o teste personalizado

Execute o teste personalizado ao seguir estes passos:

  1. Abra uma nova janela do terminal ou reutilize uma antiga.

  2. Aceda ao diretório onde criou azuredeploy.json. Execute o seguinte comando para iniciar o Visual Studio Code:

    code .
    

    Nota

    Abra o Visual Studio Code manualmente e abra o diretório de modelo, se o Visual Studio Code não estiver no caminho.

  3. No Visual Studio Code, abra o terminal integrado ao selecionar Terminal>New Terminal (Terminal > Novo Terminal) no menu superior. Execute o seguinte comando no terminal para iniciar um shell do PowerShell:

    pwsh
    

    Vê um resultado semelhante a este:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    
  4. Execute Import-Module no terminal.

    Nota

    Antes de importar o módulo, substitua path/to/arm-ttk/arm-ttk.psd1 pelo caminho para o toolkit de testes transferido.

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

    Gorjeta

    Se você baixou ou clonou a ferramenta para o diretório de Downloads, o caminho ficaria assim: /Users/user>/Downloads/arm-ttk/arm-ttk/<arm-ttk.psd1.

    Agora, está pronto para utilizar a ferramenta. Desde que esteja na mesma sessão do PowerShell, não terá de voltar a executar o comando de importação.

  5. Execute Test-AzTemplate no terminal, para iniciar uma execução de testes:

    Test-AzTemplate -TemplatePath .
    

    Sua saída é semelhante à seguinte. Observe que as linhas destacadas mostram seu teste:

    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
    

    Agora que encontrou o teste, deixe esta janela do terminal aberta. Irá reutilizá-la mais tarde.

Refatorizar o teste personalizado

Agora, irá dar ao teste personalizado uma implementação adequada.

  1. Volte ao editor de texto que tem o ficheiro Custom-ParameterNaming.test.ps1.

    Nota

    Se fechou acidentalmente o Visual Studio Code, aceda ao subdiretório arm-ttk/testcases/deploymentTemplate e abra Custom-ParameterNaming.test.ps1.

  2. Substitua os conteúdos do ficheiro pelo seguinte código:

    <#
    .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
      }
    }
    

    O código anterior itera através de todos os parâmetros. Ele inspeciona o atributo e verifica se o nome começa com o name prefixo tailwind. Se o parâmetro inspecionado não corresponder à regra de nomenclatura, o código invocará o Write-Error cmdlet com uma mensagem de erro adequada.

Atualizar o ficheiro de modelo

Agora, irá adicionar um parâmetro ao ficheiro de modelo.

  1. Selecione o editor de texto que contém azuredeploy.json e altere os conteúdos do ficheiro para o seguinte:

    {
      "$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": []
    }
    

    O conteúdo do modelo anterior define um parâmetro nomeado location que não cumpre a regra de nomenclatura, porque não tem o prefixo tailwind .

Executar novamente o toolkit de testes

Neste momento, tem um teste personalizado escrito. No entanto, a nomenclatura do seu ficheiro de modelo não cumpre o requisito. Sendo assim, está à espera que a próxima execução de teste falhe. Certifique-se de que é esse o caso ao seguir o passo seguinte.

Utilize a janela do terminal integrado do Visual Studio Code existente em que o PowerShell foi iniciado e para a qual o toolkit de testes foi importado.

No Visual Studio Code, execute Test-AzTemplate a partir do terminal integrado:

Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming

O comando anterior é executado com o parâmetro -Test, que usa um nome de teste como entrada. Você forneceu Custom-ParameterNaming como parâmetro, o que significa que apenas seu teste recém-desenvolvido será executado.

Gorjeta

Usar o parâmetro é uma boa prática quando você está desenvolvendo um teste, pois ele limita o que está sendo executado e o -Test tamanho da saída do terminal.

Este comando dá o seguinte resultado:

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

O resultado indica que o seu teste funciona. Vamos garantir que é esse o caso ao alterar o ficheiro de implementação.

Corrigir o ficheiro de modelo

Neste momento, irá querer verificar se o seu teste personalizado está correto, ao alterar o ficheiro de modelo para que esteja em conformidade com as regras estabelecidas pelo teste personalizado.

  1. Na mesma instância do Visual Studio Code que mostra o ficheiro azuredeploy.json, altere os conteúdos do ficheiro para o seguinte:

    {
      "$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": []
    }
    

    O parâmetro nomeado location foi renomeado para tailwindLocation. Teoricamente, este parâmetro deverá agora passar o teste. Vamos verificar.

  2. Continue com a mesma instância do Visual Studio Code e execute Test-AzTemplate no terminal integrado:

    Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming
    

    O seu resultado agora tem o seguinte aspeto:

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

Êxito! Implementou e executou um teste personalizado. Também corrigiu um modelo de implementação para corresponder à condição do teste.

Cria e executar um teste personalizado

Irá criar um teste personalizado e utilizar a ferramenta do toolkit de testes para o executar. Também irá corrigir o modelo de implementação para garantir que passa o teste. O teste personalizado irá procurar verificar se todos os parâmetros seguem uma regra de nomenclatura. Esta regra é um requisito específico do domínio no produto em que a equipa está a trabalhar.

Recomendamos que tenha dois editores de texto abertos para este exercício:

  • Crie um teste personalizado. Localize o caminho do subdiretório arm-ttk/testcases/deploymentTemplate/ do diretório de instalação do toolkit de testes. A partir daqui, irá executar o Visual Studio Code, onde irá criar e editar um teste personalizado.
  • Crie um ficheiro de modelo e execute testes. Selecione a localização desejada para este caminho. Recomendamos que inicie uma instância do Visual Studio Code a partir deste caminho, para que possa editar facilmente o ficheiro azuredeploy.json quando lhe for pedido. Inicie um terminal integrado com esta instância do Visual Studio Code para que seja mais fácil executar testes.

Criar o ficheiro de modelo

Escolha um diretório e crie um ficheiro chamado azuredeploy.json.

Aviso

Verifique se o diretório selecionado está vazio e não tem subdiretórios.

Adicione os seguintes conteúdos ao mesmo:

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

Crie o teste personalizado

  1. Abra um terminal. Aceda ao seu diretório de instalação do toolkit de testes. Aceda ao subdiretório arm-ttk/testcases/deploymentTemplate. Execute o seguinte comando:

    code .
    

    Nota

    Abra o Visual Studio Code manualmente e abra o diretório, se o Visual Studio Code não estiver no caminho.

  2. Crie um ficheiro personalizado chamado Custom-ParameterNaming.test.ps1. Atribua o seguinte conteúdo ao ficheiro:

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

    Deixe o editor de texto aberto. Irá editar este ficheiro mais tarde.

Executar o teste personalizado

Execute o teste personalizado ao seguir estes passos:

  1. Abra uma nova janela do terminal ou reutilize uma antiga.

  2. Aceda ao diretório onde criou azuredeploy.json. Execute o seguinte comando para iniciar o Visual Studio Code:

    code .
    

    Nota

    Abra o Visual Studio Code manualmente e abra o diretório de modelo, se o Visual Studio Code não estiver no caminho.

  3. No Visual Code, abra o terminal integrado ao selecionar Terminal>New Terminal (Terminal > Novo Terminal) no menu superior. Execute o seguinte comando no terminal para iniciar um shell do PowerShell:

    pwsh
    

    Vê um resultado semelhante a este:

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    
  4. Execute Import-Module no terminal.

    Nota

    Antes de importar o módulo, substitua path/to/arm-ttk/arm-ttk.psd1 pelo caminho para o toolkit de testes transferido.

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

    Gorjeta

    Se você baixou ou clonou a ferramenta para o diretório de Downloads, o caminho ficaria assim: /Users/user>/Downloads/arm-ttk/arm-ttk/<arm-ttk.psd1.

    Agora, está pronto para utilizar a ferramenta. Desde que esteja na mesma sessão do PowerShell, não terá de voltar a executar o comando de importação.

  5. Execute Test-AzTemplate no terminal:

    Test-AzTemplate -TemplatePath .
    

    Sua saída é semelhante à seguinte. Observe que as linhas destacadas mostram seu teste:

    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
    

    Agora que encontrou o teste, deixe esta janela do terminal aberta. Irá reutilizá-la mais tarde.

Refatorizar o teste personalizado

Agora, irá dar ao teste personalizado uma implementação adequada.

  1. Volte ao editor de texto que tem o ficheiro Custom-ParameterNaming.test.ps1.

    Nota

    Se fechou acidentalmente o Visual Studio Code, aceda ao subdiretório arm-ttk/testcases/deploymentTemplate e abra Custom-ParameterNaming.test.ps1.

  2. Substitua os conteúdos do ficheiro pelo seguinte código:

    <#
    .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
      }
    }
    

    O código anterior itera através de todos os parâmetros. Ele inspeciona o atributo e verifica se o nome começa com o name prefixo tailwind. Se o parâmetro inspecionado não corresponder à regra de nomenclatura, o código invocará o Write-Error cmdlet com uma mensagem de erro adequada.

Atualizar o ficheiro de modelo

Agora, irá adicionar um parâmetro ao ficheiro de modelo.

  1. Selecione o editor de texto que contém azuredeploy.json e altere os conteúdos do ficheiro para o seguinte:

    {
      "$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": []
    }
    

    O conteúdo do modelo anterior define um parâmetro nomeado location que não cumpre a regra de nomenclatura, porque não tem o prefixo tailwind .

Executar novamente o toolkit de testes

Neste momento, tem um teste personalizado escrito. No entanto, a nomenclatura do seu ficheiro de modelo não cumpre o requisito. Sendo assim, está à espera que a próxima execução de teste falhe. Certifique-se de que é esse o caso ao seguir o passo seguinte.

Nota

Utilize a janela do terminal integrado do Visual Studio Code existente em que o PowerShell foi iniciado e para a qual o toolkit de testes foi importado.

No Visual Studio Code, execute Test-AzTemplate a partir do terminal integrado:

Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming

O comando anterior é executado com o parâmetro chamado -Test, que usa um nome de teste como entrada. Você forneceu Custom-ParameterNaming como parâmetro, o que significa que apenas seu teste recém-desenvolvido será executado.

Gorjeta

Utilizar este parâmetro é uma boa prática ao desenvolver um teste, uma vez que limita o que está a ser executado e o tamanho do resultado do terminal.

Este comando dá o seguinte resultado:

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

O resultado indica que o seu teste funciona. Vamos garantir que é esse o caso ao alterar o ficheiro de implementação.

Corrigir o ficheiro de modelo

Neste momento, irá querer verificar se o seu teste personalizado está correto, ao alterar o ficheiro de modelo para que esteja em conformidade com as regras estabelecidas pelo teste personalizado.

  1. Na mesma instância do Visual Studio Code que mostra o ficheiro azuredeploy.json, altere os conteúdos do ficheiro para o seguinte:

    {
      "$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": []
    }
    

    O parâmetro nomeado location foi renomeado para tailwindLocation. Teoricamente, este parâmetro deverá agora passar o teste. Vamos verificar.

  2. Continue com a mesma instância do Visual Studio Code e execute Test-AzTemplate no terminal integrado:

    Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming
    

    O seu resultado agora tem o seguinte aspeto:

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

Êxito! Implementou e executou um teste personalizado. Também corrigiu um modelo de implementação para corresponder à condição do teste.

Cria e executar um teste personalizado

Irá criar um teste personalizado e utilizar a ferramenta do toolkit de testes para o executar. Também irá corrigir o modelo de implementação para garantir que passa o teste. O teste personalizado irá procurar verificar se todos os parâmetros seguem uma regra de nomenclatura. Esta regra é um requisito específico do domínio no produto em que a equipa está a trabalhar.

Recomendamos que tenha dois editores de texto abertos para este exercício:

  • Crie um teste personalizado. Localize o caminho do subdiretório arm-ttk\testcases\deploymentTemplate\ do diretório de instalação do kit de ferramentas de teste. A partir daqui, irá executar o Visual Studio Code, onde irá criar e editar um teste personalizado.
  • Crie um ficheiro de modelo e execute testes. Selecione a localização desejada para este caminho. Recomendamos que inicie uma instância do Visual Studio Code a partir deste caminho, para que possa editar facilmente o ficheiro azuredeploy.json quando lhe for pedido. Inicie um terminal integrado com esta instância do Visual Studio Code para que seja mais fácil executar testes.

Criar o ficheiro de modelo

Escolha um diretório e crie um ficheiro chamado azuredeploy.json.

Aviso

Verifique se o diretório selecionado está vazio e não tem subdiretórios.

Adicione os seguintes conteúdos ao mesmo:

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

Crie o teste personalizado

  1. Abra um terminal.

  2. Aceda ao seu diretório de instalação do toolkit de testes.

  3. Coloque-se no subdiretório arm-ttk\testcases\deploymentTemplate.

  4. Execute o seguinte comando:

    code .
    

    Nota

    Abra o Visual Studio Code manualmente e abra o diretório, se o Visual Studio Code não estiver no caminho.

  5. Crie um ficheiro chamado Custom-ParameterNaming.test.ps1 e atribua-lhe o seguinte conteúdo:

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

    Deixe o editor de texto aberto. Irá editar este ficheiro mais tarde.

Executar o teste personalizado

Execute o teste personalizado ao seguir estes passos:

  1. Abra uma nova janela do terminal ou reutilize uma antiga.

  2. Aceda ao diretório onde criou azuredeploy.json.

  3. Execute o seguinte comando para iniciar o Visual Studio Code:

    code .
    

    Nota

    Abra o Visual Studio Code manualmente e abra o diretório de modelo, se o Visual Studio Code não estiver no caminho.

  4. No Visual Studio Code, abra o terminal integrado. Abra a paleta de comandos, escreva PowerShell e selecione Show integrated terminal (Mostrar terminal integrado).

  5. Execute o seguinte comando no terminal:

    Nota

    Antes de importar o módulo, substitua path\to\arm-ttk\arm-ttk.psd1 pelo caminho para o toolkit de testes transferido.

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

    Gorjeta

    Se você baixou ou clonou a ferramenta para o diretório Downloads, o caminho seria parecido com este: C:\Users\user>\Downloads\arm-ttk\arm-ttk\<arm-ttk.psd1.

    Agora, está pronto para utilizar a ferramenta. Desde que esteja na mesma sessão do PowerShell, não terá de voltar a executar o comando de importação.

  6. Execute Test-AzTemplate no terminal:

    Test-AzTemplate -TemplatePath .
    

    Sua saída é semelhante à seguinte. Observe que as linhas destacadas mostram seu teste:

    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
    

    Agora que encontrou o teste, deixe esta janela do terminal aberta. Irá reutilizá-la mais tarde.

Refatorizar o teste personalizado

Agora, irá dar ao teste personalizado uma implementação adequada.

  1. Volte ao editor de texto que tem o ficheiro Custom-ParameterNaming.test.ps1.

    Nota

    Se fechou acidentalmente o Visual Studio Code, aceda ao subdiretório testcases/deploymentTemplate e abra o ficheiro Custom-ParameterNaming.test.ps1.

  2. Substitua os conteúdos do ficheiro pelo seguinte código:

    <#
    .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
      }
    }
    

    O código anterior itera através de todos os parâmetros. Ele inspeciona o atributo e verifica se o nome começa com o name prefixo tailwind. Se o parâmetro inspecionado não corresponder à regra de nomenclatura, o código invocará o Write-Error cmdlet com uma mensagem de erro adequada.

Atualizar o ficheiro de modelo

Agora, irá adicionar um parâmetro ao ficheiro de modelo.

  1. Selecione o editor de texto que contém azuredeploy.json e altere os conteúdos do ficheiro para o seguinte:

    {
      "$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": []
    }
    

    O conteúdo do modelo anterior define um parâmetro nomeado location que não cumpre a regra de nomenclatura, porque não tem o prefixo tailwind .

Executar novamente o toolkit de testes

Neste momento, tem um teste personalizado escrito. No entanto, a nomenclatura do seu ficheiro de modelo não cumpre o requisito. Sendo assim, está à espera que a próxima execução de teste falhe. Certifique-se de que é esse o caso ao seguir o passo seguinte.

Utilize a janela do terminal integrado do Visual Studio Code existente em que o PowerShell foi iniciado e para a qual o toolkit de testes foi importado.

No Visual Studio Code, execute Test-AzTemplate a partir do terminal integrado:

Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming

O comando anterior é executado com o parâmetro -Test, que usa um nome de teste como entrada. Você forneceu Custom-ParameterNaming como parâmetro, o que significa que apenas seu teste recém-desenvolvido será executado.

Gorjeta

Utilizar este parâmetro é uma boa prática ao desenvolver um teste, uma vez que limita o que está a ser executado e o tamanho do resultado do terminal.

Este comando dá o seguinte resultado:

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

O resultado indica que o seu teste funciona. Vamos garantir que é esse o caso ao alterar o ficheiro de implementação.

Corrigir o ficheiro de modelo

Neste momento, irá querer verificar se o seu teste personalizado está correto, ao alterar o ficheiro de modelo para que esteja em conformidade com as regras estabelecidas pelo teste personalizado.

  1. Na mesma instância do Visual Studio Code que mostra o ficheiro azuredeploy.json, altere os conteúdos do ficheiro para o seguinte:

    {
      "$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": []
    }
    

    O parâmetro nomeado location foi renomeado para tailwindLocation. Teoricamente, este parâmetro deverá agora passar o teste. Vamos verificar.

  2. Continue com a mesma instância do Visual Studio Code e execute Test-AzTemplate no terminal integrado:

    Test-AzTemplate -TemplatePath . -Test Custom-ParameterNaming
    

    O seu resultado agora tem o seguinte aspeto:

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

Êxito! Implementou e executou um teste personalizado. Também corrigiu um modelo de implementação para corresponder à condição do teste.