はじめに
Windows 運用しているとPowersShellでスクリプトを書くことがあります。
スクリプトを書くなら、ユニットテストは自動化したいですよね?
そこで、PowerShellの標準モジュールであるPesterについて紹介します。
現在Pesterはv5 が最新バージョンですが、古いPowersShell(5.x.x系など)はv3がインストールされています。 構文や使える機能が若干異なるので、利用する前に必ず確認しましょう。 |
Pesterについて
公式ドキュメントは以下を参照してください。
- V5:https://pester.dev/docs/quick-start
- V4:https://pester.dev/docs/v4/quick-start
- V3:https://github.com/pester/Pester/wiki/Should-v3
ちなみにPesterは「しつこくせがむ」「うるさくせがむ」みたいなニュアンスらしいです。
「全てがgreenになるまで根気強くテストせよ」みたいな意味なんですかね。
Pesterの使い方
pesterのバージョン確認のコマンドは以下の通りです。
今回は5系を使用します。
1 2 3 4 5 6 7 |
❯ Get-Module -ListAvailable -Name Pester Directory: C:\Users\sci02118\Documents\PowerShell\Modules ModuleType Version PreRelease Name PSEdition ExportedCommands ---------- ------- ---------- ---- --------- ---------------- Script 5.6.0 Pester Desk {Invoke-Pester, Describe, Context, It…} |
ディレクトリ構成は以下の通りです。
1 2 3 |
│ ├ Functions.ps1 └ Functions.Tests.ps1 |
テスト実行時は以下のようにします。
1 |
Invoke-Pester .\Functions.Tests.ps1 |
各ファイルの中身は以下の通りです。
・Functions.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 関数やオブジェクトを宣言するファイル function Get-Planet ([string]$Name = '*') { $planets = @( @{ Name = 'Mercury' } @{ Name = 'Venus' } @{ Name = 'Earth' } @{ Name = 'Mars' } @{ Name = 'Jupiter' } @{ Name = 'Saturn' } @{ Name = 'Uranus' } @{ Name = 'Neptune' } ) | ForEach-Object { [PSCustomObject] $_ } $planets | Where-Object { $_.Name -like $Name } } |
・Functions.Tests.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 同じディレクトリにある同名ファイルを呼び出して関数をImportする BeforeAll { . $PSScriptRoot\Functions.ps1 } # テスト定義 Describe 'Get-Planet' { It 'Given no parameters, it lists all 8 planets' { $allPlanets = Get-Planet $allPlanets.Count | Should -Be 8 } } |
テスト定義については、書き方の構文が決まっています。
1 2 3 4 5 6 7 8 9 10 11 |
# Desctibe はテストの説明です。基本的にはどのメソッドをテストするかが書かれます。 Describe 'Get-Planet' { # It はテストケースの説明です。 It 'Given no parameters, it lists all 8 planets' { $allPlanets = Get-Planet # テスト結果を比較します。 # Should の右側に期待する値を書きます。 # 今回の場合、実行結果として8つのオブジェクトが返ってくることを期待しています。 $allPlanets.Count | Should -Be 8 } } |
テスト結果を取得するshoudについてはバージョンによって構文が異なります。
公式ドキュメントを確認して、適切な値で書いてください。
実行するときはInvoke-Pester
コマンドを使います。
1 2 3 4 5 |
Invoke-Pester .\Functions.Tests.ps1 Describing Get-Planet [+] Given no parameters, it lists all 8 planets 52ms Tests completed in 52ms |
試しに失敗するテストを書いてみます。
Functions.Tests.ps1を以下の通り修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 同じディレクトリにある同名ファイルを呼び出して関数をImportする BeforeAll { . $PSScriptRoot\Functions.ps1 } # テスト定義 Describe 'Get-Planet' { It 'Given no parameters, it lists all 8 planets' { $allPlanets = Get-Planet $allPlanets.Count | Should -Be 8 } } Describe 'Get-Planet-Failed' { It 'Given no parameters, it lists all 6 planets' { $allPlanets = Get-Planet # 要素数を6に変更(本来の返り値は8) $allPlanets.Count | Should -Be 6 } } |
実行してみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Invoke-Pester .\Functions.Tests.ps1 Describing Get-Planet [+] Given no parameters, it lists all 8 planets 71ms Describing Get-Planet-Failed [-] Given no parameters, it lists all 8 planets 92ms Expected: {6} But was: {8} 19: $allPlanets.Count | Should Be 6 at <ScriptBlock>, C:\Users\sci02118\dev\pester\Functions.Tests.ps1: line 19 Tests completed in 164ms Passed: 1 Failed: 1 Skipped: 0 Pending: 0 Inconclusive: 0 |
2個目のテストが失敗していることがわかりますね。
コードブロックだとわかりにくいですが、実際のpowershellはcolor表示してくれるのでだいぶ見やすくなっています。
おわりに
今回はpowershellの標準モジュールであるPesterの使い方について紹介しました。
ユニットテストを実施する時にぜひ使ってみてください。