演習 - テスト ツールキットを使用して、カスタム テストを作成して実行する

完了

製品チームのメンバーは、あるチームまたはドメイン固有の規則を実装できることの重要性を理解しています。 これを行うには、規則をテストとして実装します。 その後、テスト ツールキットを使用してこれらのテストを実行できます。

カスタム テストを作成して実行する

カスタム テストを作成し、テスト ツールキット ツールを使用して実行します。 また、テストに成功するように、デプロイ テンプレートを修正します。 カスタム テストによって、すべてのパラメーターが名前付け規則に従っていることを確認します。 この規則は、作業中のチームの製品に対するドメイン固有の要件です。

この演習では、2 つのテキスト エディターを開いておくことをお勧めします。

  • カスタム テストの作成。 テスト ツールキットのインストール ディレクトリのサブディレクトリ arm-ttk/testcases/deploymentTemplate/ のパスを見つけます。 ここから Visual Studio Code を実行し、そこでカスタム テストの作成と編集を行います。
  • テンプレート ファイルの作成とテストの実行。 このパスに使用する場所を選択します。 要求されたときに azuredeploy.json ファイルを簡単に編集できるように、このパスから Visual Studio Code のインスタンスを起動することをお勧めします。 この 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 .
    

    Note

    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 .
    

    Note

    Visual Studio Code がパス上にない場合は、手動で Visual Studio Code を開き、テンプレート ディレクトリを開きます。

  3. Visual Studio Code で、上部のメニューから [ターミナル]>[新しいターミナル] を選択して統合ターミナルを開きます。 ターミナルで次のコマンドを実行して、PowerShell シェルを開始します。

    pwsh
    

    次のような出力が表示されます。

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    
  4. ターミナルで Import-Module を実行します。

    Note

    モジュールをインポートする前に、path/to/arm-ttk/arm-ttk.psd1 をダウンロードしたテスト ツールキットへのパスに置き換えます。

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

    ヒント

    ツールを Downloads ディレクトリにダウンロードまたはクローンした場合、パスは "/Users/<ユーザー>/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 が保持されているテキスト エディターに戻ります。

    Note

    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 コマンドレットが呼び出されます。

テンプレート ファイルを更新する

次に、テンプレート ファイルにパラメーターを追加します。

  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 プレフィックスが不足しています。

テスト ツールキットを再実行する

この時点ではカスタム テストが作成されています。 ただし、テンプレート ファイルの名前付けは要件を満たしていません。 そのため、次のテスト実行は失敗することが予想されます。 次の手順を実行して、そうなることを確認しましょう。

PowerShell を開始し、テスト ツールキットをインポートした、既存の Visual Studio Code 統合ターミナル ウィンドウを使用します。

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)
    

Success! カスタム テストを実装して実行できました。 また、テストの条件に一致するようにデプロイ テンプレートを修正できました。

カスタム テストを作成して実行する

カスタム テストを作成し、テスト ツールキット ツールを使用して実行します。 また、テストに成功するように、デプロイ テンプレートを修正します。 カスタム テストによって、すべてのパラメーターが名前付け規則に従っていることを確認します。 この規則は、作業中のチームの製品に対するドメイン固有の要件です。

この演習では、2 つのテキスト エディターを開いておくことをお勧めします。

  • カスタム テストの作成。 テスト ツールキットのインストール ディレクトリのサブディレクトリ arm-ttk/testcases/deploymentTemplate/ のパスを見つけます。 ここから Visual Studio Code を実行し、そこでカスタム テストの作成と編集を行います。
  • テンプレート ファイルの作成とテストの実行。 このパスに使用する場所を選択します。 要求されたときに azuredeploy.json ファイルを簡単に編集できるように、このパスから Visual Studio Code のインスタンスを起動することをお勧めします。 この 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 .
    

    Note

    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 .
    

    Note

    Visual Studio Code がパス上にない場合は、手動で Visual Studio Code を開き、テンプレート ディレクトリを開きます。

  3. Visual Code で、上部のメニューから [ターミナル]>[新しいターミナル] を選択して統合ターミナルを開きます。 ターミナルで次のコマンドを実行して、PowerShell シェルを開始します。

    pwsh
    

    次のような出力が表示されます。

    PowerShell 7.0.3
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    https://aka.ms/powershell
    Type 'help' to get help.
    
  4. ターミナルで Import-Module を実行します。

    Note

    モジュールをインポートする前に、path/to/arm-ttk/arm-ttk.psd1 をダウンロードしたテスト ツールキットへのパスに置き換えます。

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

    ヒント

    ツールを Downloads ディレクトリにダウンロードまたはクローンした場合、パスは "/Users/<ユーザー>/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 が保持されているテキスト エディターに戻ります。

    Note

    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 コマンドレットが呼び出されます。

テンプレート ファイルを更新する

次に、テンプレート ファイルにパラメーターを追加します。

  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 プレフィックスが不足しています。

テスト ツールキットを再実行する

この時点ではカスタム テストが作成されています。 ただし、テンプレート ファイルの名前付けは要件を満たしていません。 そのため、次のテスト実行は失敗することが予想されます。 次の手順を実行して、そうなることを確認しましょう。

Note

PowerShell を開始し、テスト ツールキットをインポートした、既存の Visual Studio Code 統合ターミナル ウィンドウを使用します。

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)
    

Success! カスタム テストを実装して実行できました。 また、テストの条件に一致するようにデプロイ テンプレートを修正できました。

カスタム テストを作成して実行する

カスタム テストを作成し、テスト ツールキット ツールを使用して実行します。 また、テストに成功するように、デプロイ テンプレートを修正します。 カスタム テストによって、すべてのパラメーターが名前付け規則に従っていることを確認します。 この規則は、作業中のチームの製品に対するドメイン固有の要件です。

この演習では、2 つのテキスト エディターを開いておくことをお勧めします。

  • カスタム テストの作成。 テスト ツールキットのインストール ディレクトリのサブディレクトリ arm-ttk\testcases\deploymentTemplate\ のパスを見つけます。 ここから Visual Studio Code を実行し、そこでカスタム テストの作成と編集を行います。
  • テンプレート ファイルの作成とテストの実行。 このパスに使用する場所を選択します。 要求されたときに azuredeploy.json ファイルを簡単に編集できるように、このパスから Visual Studio Code のインスタンスを起動することをお勧めします。 この 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 .
    

    Note

    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 .
    

    Note

    Visual Studio Code がパス上にない場合は、手動で Visual Studio Code を開き、テンプレート ディレクトリを開きます。

  4. Visual Studio Code から、統合ターミナルを開きます。 コマンド パレットを表示し、「PowerShell」と入力して、[Show integrated terminal](統合ターミナルの表示) を選択します。

  5. ターミナルで次のコマンドを実行します。

    Note

    モジュールをインポートする前に、path\to\arm-ttk\arm-ttk.psd1 をダウンロードしたテスト ツールキットへのパスに置き換えます。

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

    ヒント

    ツールを Downloads ディレクトリにダウンロードまたはクローンした場合、パスは "C:\Users\<ユーザー>\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 が保持されているテキスト エディターに戻ります。

    Note

    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 コマンドレットが呼び出されます。

テンプレート ファイルを更新する

次に、テンプレート ファイルにパラメーターを追加します。

  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 プレフィックスが不足しています。

テスト ツールキットを再実行する

この時点ではカスタム テストが作成されています。 ただし、テンプレート ファイルの名前付けは要件を満たしていません。 そのため、次のテスト実行は失敗することが予想されます。 次の手順を実行して、そうなることを確認しましょう。

PowerShell を開始し、テスト ツールキットをインポートした、既存の Visual Studio Code 統合ターミナル ウィンドウを使用します。

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)
    

Success! カスタム テストを実装して実行できました。 また、テストの条件に一致するようにデプロイ テンプレートを修正できました。