PowerShell Pester 101: 初心者のための実践ガイド

スクリプトを実行した際、それが正確に意図したとおりに行われたことをどのように確認できますか?ファイルが削除されたり、サービスが停止されたりしたかもしれません。しかし、すべての環境、ユーザーセッション、または触れたすべてのマシンで完璧に行われたかどうかはわかりません。スクリプトが複数の場所に影響を与える場合、Pesterを使用したテストが最善の選択肢です。

Pesterは、強力なPowerShellモジュールであり、特定のドメイン言語(DSL)を使用して自動テストを記述するのに役立ちます。このチュートリアルでは、推測作業を排除し、スクリプトを検証するための堅牢なプロセスを作成する方法を学びます。

準備を整えて、Pesterがスクリプトの信頼性を向上させるのをお楽しみください!

Pesterのインストールと設定

Pesterを使用すると、スクリプトのアクションがすべての環境で期待通りに行われることを確認できます。Pesterを使用したテストは、PowerShellを使用してインフラストラクチャを管理するための必須スキルです。

しかし、まずはPesterをインストールして、Pesterのテストがどのように機能するかを確認するために、サーバーをプロビジョニングするスクリプトの周りにいくつかのテストを構築する必要があります。

PowerShell ギャラリーからPesterモジュールをダウンロードできます:

Install-Module Pester

警告が表示される場合は、Windows 10(以降)クライアントにはデフォルトで古いバージョンのPesterがインストールされている可能性があるためです。たとえば、バージョン3.4.0が事前にインストールされていることがよくあります。

競合を避けるために古いバージョンを削除してください:

$module = "C:\Program Files\WindowsPowerShell\Modules\Pester\3.4.0"
takeown /F $module /A /R
icacls $module /reset
icacls $module /grant "*S-1-5-32-544:F" /inheritance:d /T
Remove-Item -Path $module -Recurse -Force -Confirm:$false

このスクリプトは、Pester 3.4.0フォルダーの所有権を取得し、アクセス許可を更新して削除します。

最新バージョンのPesterをインストールするには、-Forceパラメーターを追加してください。

Install-Module Pester -Force

新しいバージョンの署名に関する別の警告が表示されるかもしれません。Microsoftはプリインストール版に署名しましたが、Pesterの管理者Jakubは最新バージョンに署名しました。

インストールされているバージョンを以下のコマンドで確認してください:

Get-Module -Name Pester -ListAvailable

Pesterテストファイルの作成

Pesterがインストールされたので、いくつかのテストを作成しましょう。デモ目的で、スクリプトがIIS Windows機能をインストールするタスクを担当していると仮定します。

ServerProvisioning.Tests.ps1という名前のPowerShellスクリプトを希望のディレクトリに作成します。たとえば、~\Documentsフォルダーにあるとしましょう。

次に、Invoke-Pesterコマンドレットを使用してPesterのテストを実行します:

cd ~\Documents
Invoke-Pester

このコマンドをテストなしで実行すると、テストは実行されません。

Pesterの階層ブロック構造を使用していくつかのテストを追加しましょう。ここで:

  • describeは、スクリプトの主要機能など、テストのカテゴリを表します。
  • contextは、オプションでテストをサブカテゴリに整理します。
  • itは、個別のテストを定義します。
describe 'IIS' {
    context 'Windows features' {
        it 'installs the Web-Server Windows feature' {

        }
    }
}

describe 'RegistryTweaks' {

}

describe 'SoftwareInstalls' {

}

テストの追加と実行

サーバーをプロビジョニングするスクリプトがあると仮定しますが、必要な機能を有効にするという重要なステップを見逃しています。この見落としは、チェックしないままだと本番環境で連鎖的な問題を引き起こす可能性があります。

サーバープロビジョニングスクリプトが実行されたと仮定し、Web-Server機能がインストールされていることを確認するタスクがあります。そうであれば、手動で確認を行ってください。

次のコマンドを実行して、リモートサーバーにWeb-Server機能(IIS)がインストールされているか手動で確認します。

Invoke-Command -ComputerName SRV1 -ScriptBlock { (Get-WindowsFeature -ComputerName SRV1 -Name Web-Server).Installed }

このコマンドは、機能がインストールされている場合はTrueを返し、そうでない場合はFalseを返します。

次に、このテストを自動化するためにitブロックに以下を追加します。should演算子と-BeTrue条件は、機能がインストールされていることを確認します。

describe 'IIS' {
    context 'Windows features' {
        it 'installs the Web-Server Windows feature' {
            Invoke-Command -ComputerName SRV1 -ScriptBlock { (Get-WindowsFeature -ComputerName SRV1 -Name Web-Server).Installed } | should -BeTrue
        }
    }
}

最後に、テストを再実行します:

cd ~\documents
Invoke-Pester

予想通り、機能がインストールされていない場合、テストは失敗します。


VS Codeには優れたPester統合もあります。Invoke-Pesterを実行する代わりに、VS Code内で個々のテストのRun Tests項目をクリックできます。このアクションは特定のテストを実行します。


結論

このチュートリアルでは、Pesterを使用してPowerShellスクリプトのテストを自動化する方法を学びました。スクリプトを効果的に検証するための基本的なステップをカバーしました。これらのステップには、Pesterのインストールと設定、テストファイルの作成、および最初の自動テストの作成が含まれます。

この基盤の上に、PesterがAPIのテスト、コマンドのモック、またはデプロイ前後の検証などのより高度なシナリオをどのように処理できるかを探求してください。

Pesterをワークフローに統合することで、スクリプトを改善し、その信頼性を確信できるようになります—自信を持って自動化の取り組みを拡大しましょう!

Source:
https://adamtheautomator.com/powershell-pester-testing-guide/