PowerShellとPesterで設定をテストしましょう


私はすべてを自動化する傾向がある、それはあなたが一度より多くを行うように要求されている場合は、自動化するために必要な場合は、それは巨大ではない、それを自動化するいくつかの時間を費やすことを意味することを意味します.しかし、私はしばしば自分のスクリプトを変更する必要はありません設定ファイルを持って、私は単に仕事をするスクリプトを作成し、設定ファイルを入力としてスクリプトを提供します.
これはあなたのスクリプトにもパラメータを持っていないときに非常に良いアプローチです.
しかし、その後、あなたの会社でこれを通信し、より多くの人々があなたの自動化を使用して起動すると、もちろん、設定ファイルのようにどのように見えるかを知っているが、他の人が気づいていない場合はどうですか?その自動化がパイプラインで終わるならば、どうですか?あなたには、使用された使用法がありますしかし、おそらく他の人はそれに気づいていない.
……どのように、あなたはスクリプトが安全な方法で使用されるのを確実にします、そして、あなたの構成ファイルは光栄ですか?よく、読んでください、私はそれを行う方法を示します.)

概論
私たちには、クラウド内にいくつかのリソースを構築する形式のファイルがあると考えましょう.そして、あなたはJSONファイルを提供しています.
このJSONはあなたが作成する何かであるので、フォーマットはあなたのニーズのためにそれが今までに何を意味するかということです、どんなフォーマットとフィールドのどんな量でも持つことができます、しかし、あなたはそれを与える構造に従い、テストが少し変わるかもしれないということを知っている必要があります.

設定ファイルの例
この例では、この例のために作った一般的なJSONファイルを使用します.
[
    {
        "vnet_name": "demo-vnet-name-1",
        "resource_group_name": "resource_groupname",
        "address_space": [
            "10.0.0.0/23"
        ],
        "dns_servers": [
            "10.0.1.0",
            "10.0.0.128"
        ],
        "vnet_location": "eastus2",
        "Subnets": {
            "name": "misubnet",
            "address_prefixes": [
                "10.0.0.0/24",
                "10.0.0.128/24"
            ]
        },
        "Enabled" : true
    },
    {
        "vnet_name": "demo-vneT-name",
        "resource_group_name": "resource_groupname",
        "address_space": [
            "10.0.2.0/24"
        ],
        "dns_servers": [
            "10.0.1.12"
        ],
        "vnet_location": "eastus3",
        "Subnets": {
            "name": "misubnet2",
            "address_prefixes": [
                "10.0.2.0/24",
                "10.0.2.128/24"
            ]
        },
        "Enabled" : false
    }
]

この構成ファイルは2つの仮定的ネットワーク資源を構築する2つの定義を含む配列です.

思考過程
まず最初にやりたいことは、座って、リラックスして、設定ファイルを見て、何が妥当かを確認して、何がそうではないのかを考えることです.すべての検証をする必要がないときには、テストのキロを書きたくないのですが、たぶん、それらの値には何の価値もないフィールドがあります(タグのように、タグが正しいかどうか気にしないでしょう).命名規則のように.
テストを書きたいと思ったら、次のステップは、テストしたいテストのリストを書き留めます.
テストしたい
1 )私のvnetchen nameは空ではありません
2 )私の命名規則に従ってVnetRage名を確認したいのです( 4つのセクションが必要です).
3 )マイネット名は小文字のみで構成されています
4 )資源の場所は、私が「承認する」ものである必要があります
このリストを使用してテストを開始する準備が整いました.

スター

それは
PesterはPowerShellのためのテストフレームワーク、非常に使いやすいです、我々の主張を走らせる方法/キーワードの多くを含みます、そして、それはインストールと構成がより単純であることができません.
pesterを使用して、私たちは私たちのアサーションを分割する論理的な方法である“description”という単語によって定義された“description”というブロックを記述します.
出力では、“出力されたPEAR”コマンドを“出力詳細”パラメータで実行すると、“description”ブロックは“it”アサーションをグループ化するので、出力として読みやすくなります.

インストール方法
pesterをインストールするには、以下のPSGalleryからインストールするのと同じくらい簡単ですthis ガイド.
キーステップは次のとおりです.
PowerShell端末を管理者として開く
2 )ランInstall-Module -Name Pester -Force -SkipPublisherCheckここで大きな謎は、それはあなたのホストのモジュールとしてpesterをインストールし、それを使用する準備ができます.

動作方法
前に述べたように、テストを書くのは簡単ですDescribe 同様のアサーションをグループ化し、それらのブロックの内部にブロックするIt 各アサーションのブロック.
のためにDescribe ブロックは、多くの言うことはありません、あなたは彼らに名前を置き、それ以上何も.
のためにIt アサートは異なっています、彼らの中であなたはTestCase これは、assertが1つずつ評価する要素の配列であるか、単にIt block検証コードを作成するコード.
あなたがアサーションを書くとき、あなたは操作をして、それからパイプにそれをしたいですshould 演算子(それはあなたがpesterでインストールするものの一部です).このshould 演算子は、評価が返されることを期待するものを記述するために使用できるパラメータをいくつか持っています.
パラメータshould
  • 評価結果を所望の値に比較する
  • not :評価の論理値を反転する
  • Benulloempty :評価が空文字列か、定義されていないかどうかを調べる
  • BeGreenErthan :評価が定義値より大きいかどうかを調べる
  • belessthan :評価が定義値未満であるかどうかを調べる
  • Here あなたは完全なリストを見つけることができます
    テストが書かれたら、実行して呼び出すことができますInvoke-Pester -Path <file.ps1> そして、あなたがverbose出力(私のような)が好きであるならば-Output Detailed
    例のスター試験
    私たちはこのガイドでpester 5.3.1を使用するつもりです.次に、次の手順を説明します.

    プレテストデータ
    テストを始める前にいくつかの要素が必要になります.これはテストのために特定の値を定義することです.
    # We retrieve the configuration to test
    $configfile = Get-Content -path "./configuration.json" | ConvertFrom-Json -Depth 4
    
    # Define the list of approved regions to deploy resources
    $Regions = @('eastus2','eastus')
    
    # We create an empty array to pass to our tests
    $TestCases = @()
    
    # We populate our test cases creating elements named "Instance" for each entry in our config file
    foreach ($item in $configfile) {
        $TestCases += @{Instance = $item }
    }
    

    「私の名前は空ではありません」
    このテストを定義しましょう
    # Example to verify if the value was defined, this prevents missing important fields.
    Describe "Check vnet_name is defined." -Verbose {
        It "Verify the name is set in <Instance.vnet_name>." -TestCases $TestCases -Verbose {
            Param($Instance)
            $Instance.vnet_name | should -not -Benullorempty
        }
    }
    
    ここでは、“from”、“not”と“benulloempty”を使用して、私たちが設定から得た値と比較するために、pesterはすでに使用する準備ができているすべてのこの機能を持っています.

    命名規約
    この1つでは、私たちの命名規則は、「-」で区切られた4つのセグメントを持つ必要がある何かであると仮定します.これは非常に簡単なチェックです、あなたがそれらのセクションの各々を確認することさえできて、それらの値が正しいかどうか見ることができると思います.
    もう一つの便利なチェックは、この名前ですでに作成された他の資源がないならば、検証することです.
    あなたが“記述”セクションの中に複数の“IT”コマンドを持つことができます.
    # Example to verify namingconvention, this helps to enforce we don't create resources wrongly named.
    Describe "Check naming convention for vnet_name." -Verbose {
        It "Verify the vnet_name for <Instance.vnet_name> matches naming convention length." -TestCases $TestCases -Verbose {
            Param($Instance)
            $Instance.vnet_name.split("-").count | should -be 4
        }
    }    
    

    VnetRule名では低い文字しか許されません
    これは非常に興味深いです、我々は正規表現を使用して、私たちが提供している名前が小文字で構成されているかどうかを確認するために使用され、正規表現は非常に強力であり、我々は期待しているものを定義するためにそれらを使用して、本当に良いテストを書くことができます.
    この例ではCMathは大文字小文字を区別しないマッチ用で、Imatchは大文字小文字を区別しないマッチに使用されます.
    # Example to validate our names are all lowercase, useful for resources that doesn't support uppercase
    # here the cmatch uses a regular expression, this can be adjusted to match any patter we need.
    Describe "Check name for vnet_name should be all lowercase." -Verbose {
        It "Verify <Instance.vnet_name> is all lowercase." -TestCases $TestCases -Verbose {
            Param($Instance)
            $Instance.vnet_name -cmatch "^[^A-Z]*$" | should -be $true
        }
    } 
    

    承認された場所にのみ配備されます
    このセクションの冒頭で、我々は承認された場所のリストを定義しました、我々は我々の構成の位置を検証するためにそれを使用するそのリストにあります.
    # Example on how to validate a value in an array of values, like in this case where an 
    # approved list of regions is given to the test to validate we build in the approved locations/regions.
    Describe "Check location/region to deploy." -Verbose {
        It "Verify if region for <Instance.vnet_name> is approved." -TestCases $TestCases -Verbose {
            Param($Instance)
            $Regions -contains $Instance.vnet_location | should -be $true
        }
    }
    

    最終ノート
    いつものように、あなたは私の他のネットワークを見つけることができますhere
    あなたがこの役に立つか、どんな推薦もするならば、コメントで私に知らせてください、そして、私がどんなコンテンツがコミュニティによってより望まれているかについてわかっているように、私は将来のポストのために私について来てください、そして、私はそれのより多くを生産することに集中することができて、あなたがそれを楽しんでいたことを望みます.
    読んでくれてありがとう!