Använda ARM-malltestverktyg

Testverktyget Azure Resource Manager (ARM-mall) kontrollerar om mallen använder rekommenderade metoder. När mallen inte är kompatibel med rekommenderade metoder returneras en lista med varningar med de föreslagna ändringarna. Med hjälp av testverktygen kan du lära dig hur du undviker vanliga problem vid mallutveckling. Den här artikeln beskriver hur du kör testverktygslådan och hur du lägger till eller tar bort tester. Mer information om hur du kör tester eller hur du kör ett specifikt test finns i Testparametrar.

Verktygsuppsättningen är en uppsättning PowerShell-skript som kan köras från ett kommando i PowerShell eller CLI. Dessa tester är rekommendationer men inte krav. Du kan bestämma vilka tester som är relevanta för dina mål och anpassa vilka tester som körs.

Verktygslådan innehåller fyra uppsättningar tester:

Microsoft Learn

Mer information om ARM-mallens testverktyg och praktisk vägledning finns i Validate Azure resources by using the ARM Template Test Toolkit on Microsoft Learn.

Installera i Windows

  1. Om du inte redan har PowerShell installerar du PowerShell på Windows.

  2. Hämta den senaste .zip för testverktygslådan och extrahera den.

  3. Starta PowerShell.

  4. Navigera till mappen där du extraherade testverktygslådan. I den mappen navigerar du till mappen arm-ttk.

  5. Om din körningsprincip blockerar skript från Internet måste du avblockera skriptfilerna. Kontrollera att du är i mappen arm-ttk.

    Get-ChildItem *.ps1, *.psd1, *.ps1xml, *.psm1 -Recurse | Unblock-File
    
  6. Importera modulen.

    Import-Module .\arm-ttk.psd1
    
  7. Kör testerna med följande kommando:

    Test-AzTemplate -TemplatePath \path\to\template
    

Installera på Linux

  1. Om du inte redan har PowerShell installerar du PowerShell på Linux.

  2. Hämta den senaste .zip för testverktygslådan och extrahera den.

  3. Starta PowerShell.

    pwsh
    
  4. Navigera till mappen där du extraherade testverktygslådan. I den mappen navigerar du till mappen arm-ttk.

  5. Om din körningsprincip blockerar skript från Internet måste du avblockera skriptfilerna. Kontrollera att du är i mappen arm-ttk.

    Get-ChildItem *.ps1, *.psd1, *.ps1xml, *.psm1 -Recurse | Unblock-File
    
  6. Importera modulen.

    Import-Module ./arm-ttk.psd1
    
  7. Kör testerna med följande kommando:

    Test-AzTemplate -TemplatePath /path/to/template
    

Installera på macOS

  1. Om du inte redan har PowerShell installerar du PowerShell på macOS.

  2. Installera coreutils:

    brew install coreutils
    
  3. Hämta den senaste .zip för testverktygslådan och extrahera den.

  4. Starta PowerShell.

    pwsh
    
  5. Navigera till mappen där du extraherade testverktygslådan. I den mappen navigerar du till mappen arm-ttk.

  6. Om din körningsprincip blockerar skript från Internet måste du avblockera skriptfilerna. Kontrollera att du är i mappen arm-ttk.

    Get-ChildItem *.ps1, *.psd1, *.ps1xml, *.psm1 -Recurse | Unblock-File
    
  7. Importera modulen.

    Import-Module ./arm-ttk.psd1
    
  8. Kör testerna med följande kommando:

    Test-AzTemplate -TemplatePath /path/to/template
    

Resultatformat

Tester som klarar visas i grönt och föregås av [+] .

Tester som misslyckas visas i rött och föregås av [-] .

Tester med en varning visas i gult och föregås av [?] .

visa testresultat.

Textresultaten är:

deploymentTemplate
[+] adminUsername Should Not Be A Literal (6 ms)
[+] apiVersions Should Be Recent In Reference Functions (9 ms)
[-] apiVersions Should Be Recent (6 ms)
    Api versions must be the latest or under 2 years old (730 days) - API version 2019-06-01 of
    Microsoft.Storage/storageAccounts is 760 days old
    Valid Api Versions:
    2021-04-01
    2021-02-01
    2021-01-01
    2020-08-01-preview

[+] artifacts parameter (4 ms)
[+] CommandToExecute Must Use ProtectedSettings For Secrets (9 ms)
[+] DependsOn Best Practices (5 ms)
[+] Deployment Resources Must Not Be Debug (6 ms)
[+] DeploymentTemplate Must Not Contain Hardcoded Uri (4 ms)
[?] DeploymentTemplate Schema Is Correct (6 ms)
    Template is using schema version '2015-01-01' which has been deprecated and is no longer
    maintained.

Testparametrar

När du anger parametern söker toolkiten i mappen efter en mall med namnet -TemplatePath azuredeploy.json eller maintemplate.json. Den testar den här mallen först och testar sedan alla andra mallar i mappen och dess undermappar. De andra mallarna testas som länkade mallar. Om sökvägen innehåller en fil med namnet createUiDefinition.jsonkörs tester som är relevanta för UI-definitionen. Tester körs också för parameterfiler och alla JSON-filer i mappen.

Test-AzTemplate -TemplatePath $TemplateFolder

Om du vill testa en fil i mappen lägger du till -File parametern . Mappen måste dock fortfarande ha en huvudmall med namnet azuredeploy.json eller maintemplate.json.

Test-AzTemplate -TemplatePath $TemplateFolder -File cdn.json

Som standard körs alla tester. Om du vill ange enskilda tester som ska köras använder -Test du parametern och anger testnamnet. Testnamnen finns i ARM-mallar, parameterfiler, createUiDefinition.jsonoch alla filer.

Test-AzTemplate -TemplatePath $TemplateFolder -Test "Resources Should Have Location"

Anpassa tester

Du kan anpassa standardtesterna eller skapa egna tester. Om du vill ta bort ett test permanent tar du bort .test.ps1-filen från mappen .

Verktygslådan har fyra mappar som innehåller standardtesterna som körs för specifika filtyper:

  • ARM-mallar: \arm-ttk\testcases\deploymentTemplate
  • Parameterfiler: \arm-ttk\testcases\deploymentParameters
  • createUiDefinition.json: \arm-ttk\testcases\CreateUIDefinition
  • Alla filer: \arm-ttk\testcases\AllFiles

Lägga till ett anpassat test

Om du vill lägga till ett eget test skapar du en fil med namngivningskonventionen: Your-Custom-Test-Name.test.ps1.

Testet kan hämta mallen som en objektparameter eller en strängparameter. Vanligtvis använder du den ena eller den andra, men du kan använda båda.

Använd objektparametern när du behöver hämta ett avsnitt av mallen och iterera genom dess egenskaper. Ett test som använder objektparametern har följande format:

param(
  [Parameter(Mandatory=$true,Position=0)]
  [PSObject]
  $TemplateObject
)

# Implement test logic that evaluates parts of the template.
# Output error with: Write-Error -Message

Mallobjektet har följande egenskaper:

  • $schema
  • contentVersion
  • parameters
  • variables
  • resources
  • outputs

Du kan till exempel hämta parametersamlingen med $TemplateObject.parameters .

Använd strängparametern när du behöver göra en strängåtgärd på hela mallen. Ett test som använder strängparametern har följande format:

param(
  [Parameter(Mandatory)]
  [string]
  $TemplateText
)

# Implement test logic that performs string operations.
# Output error with: Write-Error -Message

Du kan till exempel köra ett reguljärt uttryck av strängparametern för att se om en specifik syntax används.

Mer information om hur du implementerar testet finns i de andra testerna i den mappen.

Integrera med Azure Pipelines

Du kan lägga till testverktygslådan i azure-pipelinen. Med en pipeline kan du köra testet varje gång mallen uppdateras eller köra den som en del av distributionsprocessen.

Det enklaste sättet att lägga till testverktygssatsen i din pipeline är med tillägg från tredje part. Följande två tillägg är tillgängliga:

Eller så kan du implementera egna uppgifter. I följande exempel visas hur du laddar ned testverktygslådan.

{
  "environment": {},
  "enabled": true,
  "continueOnError": false,
  "alwaysRun": false,
  "displayName": "Download TTK",
  "timeoutInMinutes": 0,
  "condition": "succeeded()",
  "task": {
    "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
    "versionSpec": "2.*",
    "definitionType": "task"
  },
  "inputs": {
    "targetType": "inline",
    "filePath": "",
    "arguments": "",
    "script": "New-Item '$(ttk.folder)' -ItemType Directory\nInvoke-WebRequest -uri '$(ttk.uri)' -OutFile \"$(ttk.folder)/$(ttk.asset.filename)\" -Verbose\nGet-ChildItem '$(ttk.folder)' -Recurse\n\nWrite-Host \"Expanding files...\"\nExpand-Archive -Path '$(ttk.folder)/*.zip' -DestinationPath '$(ttk.folder)' -Verbose\n\nWrite-Host \"Expanded files found:\"\nGet-ChildItem '$(ttk.folder)' -Recurse",
    "errorActionPreference": "stop",
    "failOnStderr": "false",
    "ignoreLASTEXITCODE": "false",
    "pwsh": "true",
    "workingDirectory": ""
  }
}

I nästa exempel visas hur du kör testerna.

{
  "environment": {},
  "enabled": true,
  "continueOnError": true,
  "alwaysRun": false,
  "displayName": "Run Best Practices Tests",
  "timeoutInMinutes": 0,
  "condition": "succeeded()",
  "task": {
    "id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
    "versionSpec": "2.*",
    "definitionType": "task"
  },
  "inputs": {
    "targetType": "inline",
    "filePath": "",
    "arguments": "",
    "script": "Import-Module $(ttk.folder)/arm-ttk/arm-ttk.psd1 -Verbose\n$testOutput = @(Test-AzTemplate -TemplatePath \"$(sample.folder)\")\n$testOutput\n\nif ($testOutput | ? {$_.Errors }) {\n   exit 1 \n} else {\n    Write-Host \"##vso[task.setvariable variable=result.best.practice]$true\"\n    exit 0\n} \n",
    "errorActionPreference": "continue",
    "failOnStderr": "true",
    "ignoreLASTEXITCODE": "false",
    "pwsh": "true",
    "workingDirectory": ""
  }
}

Nästa steg