はじめに
今回はPester
というPowerShell用のテストフレームワークを紹介したいと思います。
$ Invoke-Pester -Output Detailed ./Sandbox.Test.ps1 Pester v5.6.1 Starting discovery in 1 files. Discovery found 3 tests in 2ms. Running tests. Running tests from '/---/Sandbox.Test.ps1' Describing Get-AddNum [+] 1 + 2 = 3 1ms (1ms|0ms) [+] -5 + 5 = 0 1ms (1ms|0ms) [+] (-1) + (-2) = 3 1ms (1ms|0ms) Tests completed in 14ms Tests Passed: 3, Failed: 0, Skipped: 0, Inconclusive: 0, NotRun: 0
概要
Pester
はPowerShell用のテストフレームワークです。主にUnit Test
やE2E Test
で使われます。(それ以外でも色々と使えるらしいです)
Pester is a testing and mocking framework for PowerShell.
Pester provides a framework for writing and running tests. Pester is most commonly used for writing unit and integration tests, but it is not limited to just that. It is also a base for tools that validate whole environments, computer deployments, database configurations and so on.
Pester は PowerShell 用のテストおよびモッキングフレームワークです。 Pester はテストを書いて実行するためのフレームワークを提供します。 Pester はユニットテストや統合テストを書くのによく使われますが、それだけではありません。 環境全体、コンピュータのデプロイメント、データベースの設定などを検証するツールのベースにもなる。
https://pester.dev/docs/quick-start#what-is-pester
ひとまずPowerShellでテストを書きたいとなったら、Pester
を使うという流れで基本はOKでしょう。
Getting Started
Pesterは*.Tests.ps1
(例. Sandbox.Test.ps1
)という名前が一致したファイルに対してテストを実行します。
# Sandbox.Test.ps1 # BeforeAllはテストスイート(Describeブロック)の前に一度だけ実行されるPesterの関数 BeforeAll { function Get-AddNum { param( [int]$x, [int]$y ) return $x + $y } } # Describeはテストスイート(関連するテストケースをグループ化したもの)を定義するPesterの関数 Describe 'Get-AddNum' { # Itはテストケースを定義するPesterの関数 # 複数のケースを描きたい場合はItを複数記述します It '1 + 2 = 3' { $actual = Get-AddNum -x 1 -y 2 # ShouldはPesterの検証関数(3であることを検証) $actual | Should -Be 3 } It '-5 + 5 = 0' { $actual = Get-AddNum -x -5 -y 5 $actual | Should -Be 0 } It '(-1) + (-2) = 3' { $actual = Get-AddNum -x -1 -y -2 $actual | Should -Be -3 } }
テストをコマンドから実行します。
# -Output Detailedは任意です > Invoke-Pester -Output Detailed <path-to-Sandbox.Test.ps1>
また以下のような書き方もできます。
> Invoke-Pester ./Tests/UnitTest/*.Test.ps1
Pesterのインストール
Pesterがまだインストールされていなければ、以下コマンドを打ち込んでください。
> Install-Module Pester -Force
DescribeとContext
Describe
はテストケースをグループ化したものですが、Describe
の内部でさらにグループ化したい場合はContext
を利用します。
Describe 'Get-AddNum' { Context 'GroupA' { It '1 + 2 = 3' { # .. } } Context "GroupB" { It '(-10) + (- 20)' { # ... } } }
BeforeAll
BeforeAll
はテストスイート(Describeブロック)の前に一度だけ実行されるPesterの関数です。また後に実行するAfterAll
もあります。
さらに指定したブロック内のすべてのテストの前に実行されるBeforeEach
, AfterEach
もあります。
テスト対象のメソッドをTestファイルから切り出す
Test.ps1
の中にテスト対象のメソッドがあることは普通はないと思います。(実験とかならあるかもですが)
そこで別ファイルに定義されているメソッドを呼び出すには、
# Sandbox.ps1 function Get-AddNum { param( [int]$x, [int]$y ) return $x + $y }
# Sandbox.Test.ps1 # BeforeAllはテストスイート(Describeブロック)の前に一度だけ実行されるPesterの関数 BeforeAll { # $PSScriptRootはスクリプトファイルのディレクトリを表す自動変数 . $PSScriptRoot/Sandbox.ps1 } # Describeはテストスイート(関連するテストケースをグループ化したもの)を定義するPesterの関数 Describe 'Get-AddNum' { # Itはテストケースを定義するPesterの関数 # 複数のケースを描きたい場合はItを複数記述します It '1 + 2 = 3' { $actual = Get-AddNum -x 1 -y 2 # ShouldはPesterの検証関数(3であることを検証) $actual | Should -Be 3 } It '-5 + 5 = 0' { $actual = Get-AddNum -x -5 -y 5 $actual | Should -Be 0 } It '(-1) + (-2) = 3' { $actual = Get-AddNum -x -1 -y -2 $actual | Should -Be -3 } }
psd1の場合
.psd1
の場合はImport-Module
するみたいですね。
BeforeEach { Import-Module "$PSScriptRoot\..\..\UnitySetup\UnitySetup.psd1" -Force }