撰寫自訂測試來執行領域特定規則

已完成

到目前為止,您已經了解如何在範本上執行某些測試。 不過,您也可能會在具有自己一套專屬規則的公司或小組中作業。 這些規則可能表示您想要「自訂」測試體驗。 您可能會遇到下列狀況:

  • 執行特定測試套件。 安裝測試工具組工具後,系統會為您提供一組將執行的測試。 這些測試位於下列目錄:<install directory>/arm-ttk/testcases/deploymentTemplate

    您可以自訂此測試回合體驗。 如先前單元所見,其中一種自訂方式是使用參數 -Test 參數。 您也可以移除該目錄中的檔案,以編輯要執行的測試。 您可以使用 -Skip 參數來略過特定的測試。

  • 撰寫並執行領域特定測試。 您可以撰寫測試檔案來強制執行網域特定規則。 本單元將會著重於此案例。

撰寫並執行您自己的測試

您已決定要撰寫您自己的領域特定測試。 撰寫及執行此類測試的流程如下:

  1. 在目錄 <install directory>/arm-ttk/testcases/deploymentTemplate 中建立檔案。
  2. 在 PowerShell 中撰寫檔案。
  3. 執行檔案並檢查結果。

建立自訂測試

自訂測試必須放在正確的目錄中:<install directory>/arm-ttk/testcases/deploymentTemplate。 其也需要遵循命名標準:包含虛線、.test 的後置詞,並以 .ps1 結尾。 一般的測試檔案看起來像這樣:

Domain-Specific.test.ps1

編寫

若要撰寫測試檔案名稱,則必須將其寫入 PowerShell。 測試檔案的三個部分為:

  • 文件。 這個部分為選擇性,但新增後可提供有效幫助。 其位於檔案的頂端,且通常是一組描述測試為何、測試會執行哪些動作以及其呼叫方式的註解。 註解看起來如下範例所示:

    <#
    .Synopsis
         Ensures that all IDs use the resourceID() function.
    .Description
         Ensures that all IDs use the resourceID() function, or resolve to parameters or variables that use the ResourceID() function.
    .Example
         Test-AzTemplate -TemplatePath .\100-marketplace-sample\ -Test IDs-Should-Be-Derived-From-ResourceIDs
    #>
    

    上述範例簡短描述該測試功能的區段,稱為 .Synopsis。 另一個具有較長描述的區段,稱為 .Description。 最後,有一個展示以不同方式執行測試的區段,稱為 .Example

  • 輸入參數。 測試檔案可以擁有一組輸入參數。 此區段是由關鍵字 param 與括弧所定義的。 其看起來通常像下面這樣:

    param(
       [Parameter(Mandatory=$true)]
       [PSObject]$TemplateObject,
    
       [Parameter(Mandatory=$true)]
       [string]$TemplateFileName,
    
       [string]$SampleName = "$ENV:SAMPLE_NAME"
    )
    

    上述範例顯示三個參數:$TemplateObject$TemplateFileName$SampleName。 前兩個是必要參數,如 Parameter[(Mandatory = $true)] 裝飾所示。 這些參數會根據其意義來命名。 $TemplateObject 包含範本檔案的物件表示法,而 TemplateFileName 則包含所測試檔案的名稱。

    提示

    ARM 範本測試工具箱一文中有參數的詳細資訊。

  • 測試邏輯。 測試的最後一個部分是測試邏輯。 大部分的測試通常會執行下列步驟:

    1. 逐一查看範本。
    2. 驗證一或多個條件。
    3. 如果某個項目不正確,則引發錯誤。

程式碼協助程式

有很多協助程式可協助您尋找所需內容,並回報錯誤。 以下是程式碼協助程式的兩個範例:

  • Find-JsonContent。 此協助程式有助於找出具有特定值的特定元素。 以下是範例:

    Find-JsonContent -Key apiVersion -Value * -Like
    

    上述程式碼有助於尋找名稱為 apiVersion 且具有 * 值的 JSON 屬性 (這基本上代表所有名稱為 apiVersion 的屬性)。 其會與 JSON 物件相符,如下所示:

    {
       "apiVersion": "2021-01-01"
    }
    
  • Write-Error。 協助您與 Test Runner 通訊,告知其範本中的某些內容不正確。 您可以加以使用來表示錯誤訊息,並使用所需的任何變數來插入字串運算式。 以下是使用範例:

      Write-Error "Resource $($resource.Name) Location must be located in westeurope'" -TargetObject $resource
    

執行測試

至此,您已經撰寫了測試。 該檔案將與相同目錄中的所有其他檔案一起執行。

如同上述範例,您可以選擇使用 -Test 參數,只執行特定的測試檔案。 作為參數,您可以為其提供已移除副檔名的測試檔案名稱。 Custom-Test.test.ps1 接著將透過 Test-AzTemplate -TemplatePath /path/to/template -Test Custom-Test 自行執行。