ARM-sablontesztelési eszközkészlet használata

Az Azure Resource Manager-sablon (ARM-sablon) teszteszközkészlete ellenőrzi, hogy a sablon használ-e ajánlott eljárásokat. Ha a sablon nem felel meg az ajánlott eljárásoknak, a javasolt módosításokat tartalmazó figyelmeztetések listáját adja vissza. A tesztelési eszközkészlet használatával megtudhatja, hogyan kerülheti el a sablonfejlesztés gyakori problémáit. Ez a cikk bemutatja, hogyan futtathatja a teszteszközkészletet, és hogyan adhat hozzá vagy távolíthat el teszteket. A tesztek futtatásával vagy egy adott teszt futtatásával kapcsolatos további információkért lásd: Tesztparaméterek.

Az eszközkészlet PowerShell-szkriptek készlete, amelyek a PowerShell vagy a parancssori felület parancsaiból futtathatók. Ezek a tesztek javaslatok, de nem követelmények. Eldöntheti, hogy mely tesztek relevánsak a céljaihoz, és testre szabhatja a futtatott teszteket.

Az eszközkészlet négy tesztkészletet tartalmaz:

Megjegyzés

A teszteszközkészlet csak ARM-sablonokhoz érhető el. A Bicep-fájlok ellenőrzéséhez használja a Bicep-lintert.

Képzési források

Ha többet szeretne megtudni az ARM-sablontesztelési eszközkészletről, és gyakorlati útmutatást szeretne, olvassa el az Azure-erőforrások ellenőrzése az ARM-sablontesztelési eszközkészlettel című témakört.

Telepítés Windows rendszeren

  1. Ha még nem rendelkezik PowerShell-lel, telepítse a PowerShellt Windows rendszeren.

  2. Töltse le a tesztelési eszközkészlethez tartozó legújabb .zip fájlt , és bontsa ki.

  3. Indítsa el a PowerShellt.

  4. Lépjen arra a mappára, ahol kinyerte a teszteszközkészletet. A mappában keresse meg az arm-ttk mappát.

  5. Ha a végrehajtási szabályzat letiltja a parancsfájlokat az internetről, fel kell oldania a szkriptfájlok letiltását. Győződjön meg arról, hogy az arm-ttk mappában van.

    Get-ChildItem *.ps1, *.psd1, *.ps1xml, *.psm1 -Recurse | Unblock-File
    
  6. Importálja a modult.

    Import-Module .\arm-ttk.psd1
    
  7. A tesztek futtatásához használja a következő parancsot:

    Test-AzTemplate -TemplatePath \path\to\template
    

Telepítés Linux rendszeren

  1. Ha még nem rendelkezik PowerShell-lel, telepítse a PowerShellt Linux rendszeren.

  2. Töltse le a tesztelési eszközkészlethez tartozó legújabb .zip fájlt , és bontsa ki.

  3. Indítsa el a PowerShellt.

    pwsh
    
  4. Lépjen arra a mappára, ahol kinyerte a teszteszközkészletet. A mappában keresse meg az arm-ttk mappát.

  5. Ha a végrehajtási szabályzat letiltja a parancsfájlokat az internetről, fel kell oldania a szkriptfájlok letiltását. Győződjön meg arról, hogy az arm-ttk mappában van.

    Get-ChildItem *.ps1, *.psd1, *.ps1xml, *.psm1 -Recurse | Unblock-File
    
  6. Importálja a modult.

    Import-Module ./arm-ttk.psd1
    
  7. A tesztek futtatásához használja a következő parancsot:

    Test-AzTemplate -TemplatePath /path/to/template
    

Telepítés macOS rendszeren

  1. Ha még nem rendelkezik PowerShell-lel, telepítse a PowerShellt macOS rendszeren.

  2. coreutils telepítése:

    brew install coreutils
    
  3. Töltse le a tesztelési eszközkészlethez tartozó legújabb .zip fájlt , és bontsa ki.

  4. Indítsa el a PowerShellt.

    pwsh
    
  5. Lépjen arra a mappára, ahol kinyerte a teszteszközkészletet. A mappában keresse meg az arm-ttk mappát.

  6. Ha a végrehajtási szabályzat letiltja a parancsfájlokat az internetről, fel kell oldania a szkriptfájlok letiltását. Győződjön meg arról, hogy az arm-ttk mappában van.

    Get-ChildItem *.ps1, *.psd1, *.ps1xml, *.psm1 -Recurse | Unblock-File
    
  7. Importálja a modult.

    Import-Module ./arm-ttk.psd1
    
  8. A tesztek futtatásához használja a következő parancsot:

    Test-AzTemplate -TemplatePath /path/to/template
    

Az eredmény formátuma

A sikeres tesztek zöld színnel jelennek meg, és a következő előtaggal jelennek meg: [+].

A sikertelen tesztek pirossal jelennek meg, és a következő előtaggal jelennek meg: [-].

A figyelmeztetéssel ellátott tesztek sárga színnel jelennek meg, és a következő előtaggal jelennek meg: [?].

Képernyőkép a teszteredmények különböző színekben való átadásáról, sikertelenségéről és figyelmeztetéséről.

A szöveges eredmények a következők:

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.

Tesztparaméterek

A paraméter megadásakor -TemplatePath az eszközkészlet egy azuredeploy.json vagy maintemplate.json nevű sablont keres a mappában. Először teszteli ezt a sablont, majd teszteli a mappában és annak almappáiban található összes többi sablont. A többi sablont csatolt sablonként teszteljük. Ha az elérési út tartalmaz egy createUiDefinition.json nevű fájlt, a felhasználói felület definíciójához kapcsolódó teszteket futtat. A teszteket a paraméterfájlok és a mappában található összes JSON-fájl is futtatja.

Test-AzTemplate -TemplatePath $TemplateFolder

Ha egy fájlt szeretne tesztelni a mappában, adja hozzá a paramétert -File . A mappának azonban továbbra is rendelkeznie kell egy azuredeploy.json vagy maintemplate.json nevű fő sablonnal.

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

Alapértelmezés szerint minden teszt lefut. Az egyes futtatandó tesztek megadásához használja a paramétert -Test , és adja meg a teszt nevét. A tesztnevekért lásd: ARM-sablonok, paraméterfájlok, createUiDefinition.json és minden fájl.

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

Tesztek testreszabása

Testre szabhatja az alapértelmezett teszteket, vagy létrehozhat saját teszteket. Ha véglegesen el szeretne távolítani egy tesztet, törölje a .test.ps1 fájlt a mappából.

Az eszközkészlet négy mappával rendelkezik, amelyek az adott fájltípusokhoz futtatott alapértelmezett teszteket tartalmazzák:

  • ARM-sablonok: \arm-ttk\testcases\deploymentTemplate
  • Paraméterfájlok: \arm-ttk\testcases\deploymentParameters
  • createUiDefinition.json: \arm-ttk\testcases\CreateUIDefinition
  • Minden fájl: \arm-ttk\testcases\AllFiles

Egyéni teszt hozzáadása

Saját teszt hozzáadásához hozzon létre egy fájlt az elnevezési konvencióval: Your-Custom-Test-Name.test.ps1.

A teszt objektumparaméterként vagy sztringparaméterként is lekérheti a sablont. Általában az egyiket vagy a másikat használja, de mindkettőt használhatja.

Az objektumparamétert akkor használja, ha be kell szereznie a sablon egy szakaszát, és át kell haladnia a tulajdonságain. Az objektumparamétert használó teszt formátuma a következő:

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

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

A sablonobjektum a következő tulajdonságokkal rendelkezik:

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

Például lekérheti a paraméterek gyűjteményét a következővel $TemplateObject.parameters: .

Akkor használja a sztringparamétert, ha sztringműveletet kell végrehajtania a teljes sablonon. A sztringparamétert használó teszt formátuma a következő:

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

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

Futtathatja például a sztringparaméter reguláris kifejezését annak ellenőrzéséhez, hogy használ-e egy adott szintaxist.

A teszt implementálásával kapcsolatos további információkért tekintse meg az adott mappában található többi tesztet.

Sablonok ellenőrzése Azure Marketplace

Ha közzé szeretne tenni egy ajánlatot Azure Marketplace, használja a teszteszközkészletet a sablonok érvényesítéséhez. Amikor a sablonok átmennek az érvényesítési teszteken, Azure Marketplace gyorsabban jóváhagyja az ajánlatot. Ha a tesztek sikertelenek, az ajánlat sikertelen lesz a minősítéssel.

Fontos

A Marketplace-teszteket 2022 júliusában adták hozzá. Ha korábbi verzióval rendelkezik, frissítse a modult.

A tesztek futtatása a környezetben

Az eszközkészlet telepítése és a modul importálása után futtassa a következő parancsmagot a csomag teszteléséhez:

Test-AzMarketplacePackage -TemplatePath "Path to the unzipped package folder"

Az eredmények értelmezése

A tesztek két szakaszban adnak vissza eredményeket. Az első szakasz a kötelező teszteket tartalmazza. Ezeknek a teszteknek az eredményei az összefoglaló szakaszban jelennek meg.

Fontos

A Marketplace-ajánlat elfogadása előtt minden eredményt pirossal kell kijavítania. Javasoljuk, hogy a sárga színnel visszaadott eredményeket kijavítsa.

A szöveges eredmények a következők:

Validating nestedtemplates\AzDashboard.json
    [+] adminUsername Should Not Be A Literal (210 ms)
    [+] artifacts parameter (3 ms)
    [+] CommandToExecute Must Use ProtectedSettings For Secrets (201 ms)
    [+] Deployment Resources Must Not Be Debug (160 ms)
    [+] DeploymentTemplate Must Not Contain Hardcoded Url (13 ms)
    [+] Location Should Not Be Hardcoded (31 ms)
    [+] Min and Max Value Are Numbers (4 ms)
    [+] Outputs Must Not Contain Secrets (9 ms)
    [+] Password params must be secure (3 ms)
    [+] Resources Should Have Location (2 ms)
    [+] Resources Should Not Be Ambiguous (2 ms)
    [+] Secure Params In Nested Deployments (205 ms)
    [+] Secure String Parameters Cannot Have Default (3 ms)
    [+] URIs Should Be Properly Constructed (190 ms)
    [+] Variables Must Be Referenced (9 ms)
    [+] Virtual Machines Should Not Be Preview (173 ms)
    [+] VM Size Should Be A Parameter (165 ms)
Pass : 99
Fail : 3
Total: 102
Validating StartStopV2mkpl_1.0.09302021\anothertemplate.json
    [?] Parameters Must Be Referenced (86 ms)
        Unreferenced parameter: resourceGroupName
        Unreferenced parameter: location
        Unreferenced parameter: azureFunctionAppName
        Unreferenced parameter: applicationInsightsName
        Unreferenced parameter: applicationInsightsRegion

Az összefoglaló szakasz alatti szakasz a figyelmeztetésként értelmezhető teszthibákat tartalmazza. A hibák kijavítása nem kötelező, de erősen ajánlott. A hibák gyakran olyan gyakori problémákra mutatnak, amelyek hibákat okoznak, amikor egy ügyfél telepíti az ajánlatot.

A tesztek javításához kövesse az Önre vonatkozó tesztesetet:

Ajánlat elküldése

A szükséges javítások elvégzése után futtassa újra a teszteszközkészletet. Mielőtt elküldené az ajánlatot Azure Marketplace, győződjön meg arról, hogy nincsenek hibák.

Integrálás az Azure Pipelines szolgáltatással

A teszteszközkészletet hozzáadhatja az Azure Pipeline-hoz. A folyamatokkal futtathatja a tesztet minden alkalommal, amikor a sablon frissül, vagy futtathatja azt az üzembe helyezési folyamat részeként.

A teszteszközkészletet a legegyszerűbben külső bővítményekkel lehet hozzáadni a folyamathoz. A következő két bővítmény érhető el:

Vagy saját feladatokat is megvalósíthat. Az alábbi példa bemutatja, hogyan töltheti le a teszteszközkészletet.

Kiadási folyamat esetén:

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

Folyamat YAML-definíciója esetén:

- pwsh: |
   New-Item '$(ttk.folder)' -ItemType Directory
   Invoke-WebRequest -uri '$(ttk.uri)' -OutFile "$(ttk.folder)/$(ttk.asset.filename)" -Verbose
   Get-ChildItem '$(ttk.folder)' -Recurse
   
   Write-Host "Expanding files..."
   Expand-Archive -Path '$(ttk.folder)/*.zip' -DestinationPath '$(ttk.folder)' -Verbose
   
   Write-Host "Expanded files found:"
   Get-ChildItem '$(ttk.folder)' -Recurse
  displayName: 'Download TTK'

A következő példa bemutatja, hogyan futtathatja a teszteket.

Kiadási folyamat esetén:

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

Folyamat YAML-definíciója esetén:

- pwsh: |
   Import-Module $(ttk.folder)/arm-ttk/arm-ttk.psd1 -Verbose
   $testOutput = @(Test-AzTemplate -TemplatePath "$(sample.folder)")
   $testOutput
   
   if ($testOutput | ? {$_.Errors }) {
      exit 1 
   } else {
       Write-Host "##vso[task.setvariable variable=result.best.practice]$true"
       exit 0
   } 
  errorActionPreference: continue
  failOnStderr: true
  displayName: 'Run Best Practices Tests'
  continueOnError: true

Következő lépések