それでも僕は
ユニットテストを書きたい
Pester - powered by PowerShell
2016/4/9(Sat)
第 6 回 PowerShell 勉強会 @日本マイクロソフト 関西支店
Twitter: @HIDARI0415
Pester
Pesterとは
❏ PowerShellのためのテスティングフレームワーク
❏ 内部はPowerShellで書かれたDSL
❏ Windows 10から標準搭載
❏ NuGetから手に入る
❏ PowerShell本家のテストもPesterに移行中
❏ BDDスタイルでテストを記述
Pesterとは
Describe "意識高い系" {
It "ビジネスのオポチュニティ" {
Set-価値ある仕事 | Should Be "すごい価値が生まれる"
}
}
BDDスタイル
Assert.AreEqual(expected, hoge);
参考:TDDスタイル
Pesterとは
❏ Invoke-Pesterコマンドでテストを実行
❏ *.Tests.ps1というファイルをテストとして実行
❏ 現在のフォルダで再帰的にファイルを検索
❏ -TestName オプションでテスト名を指定可能
C:PS> Invoke-Pester
C:PS> Invoke-Pester -TestName 意識高い系, スタバMacドヤリング
Features
Pesterの特徴
❏ 安全なテストのためのTestDrive
❏ パワフルなMock
❏ デフォルトでCodeCoverageを計測可能
❏ CIのための複数のオプション
Pesterの特徴
❏ 安全なテストのためのTestDrive
❏ パワフルなMock
❏ デフォルトでCodeCoverageを計測可能
❏ CIのための複数のオプション
Pesterの特徴 ー 安全なテストのためのTestDrive
❏ TestDrive: or $TestDrive でテスト実行時の一時的な
ドライブにアクセス
❏ ファイル操作での副作用のある挙動をテスト
function Add-付加価値($path, $付加価値) {
Add-Content $path -Value $付加価値
}
Describe "Add-付加価値" {
$testPath = "TestDrive:付加価値のあるテキスト.txt"
Set-Content $testPath -value "ビジネスを円滑に進めるソリューション"
Add-付加価値 $testPath " -高い付加価値"
$result = Get-Content $testPath
It "adds a 付加価値" {
(-join $result) `
| Should Be "ビジネスを円滑に進めるソリューション -高い付加価値"
}
}
Pesterの特徴 ー 安全なテストのためのTestDrive
❏ TestDriveはDescribe開始時に作成、終了時に破棄される
❏ 各Contextで追加されたファイルは終了時に削除される
❏ Context内でのファイル内容の変更は次のContextに持ち
越されるので注意
Pesterの特徴 ー 安全なテストのためのTestDrive
Pesterの特徴
❏ 安全なテストのためのTestDrive
❏ パワフルなMock
❏ デフォルトでCodeCoverageを計測可能
❏ CIのための複数のオプション
❏ Mockによるシンプルな記述
❏ Assert-VerifiableMocks、Assert-MockCalledによ
るパワフルなチェック
Pesterの特徴 ー パワフルなMock
Mock
❏ 指定したコマンドをモック化する
❏ 特定のパラメータで呼び出されたときだけモック化可能
Pesterの特徴 ー パワフルなMock
Mock `
-CommandName Get-ChildItem `
-MockWith {return @{FullName = "A_File.TXT"} } `
-ParameterFilter {$Path -and $Path.StartsWith($env:temp)}
Assert-VerifiableMocks
❏ -VerifiableなMockが呼ばれたかをチェック
Pesterの特徴 ー パワフルなMock
Mock
`Set-Content {} `
-Verifiable `
-ParameterFilter {$Value -eq "Expected Value"}
Set-Content some_path -Value "Expected Value"
Assert-VerifiableMocks
Assert-MockCalled
❏ Mockが指定回数呼ばれているかをチェック
Pesterの特徴 ー パワフルなMock
Mock Set-Content `
-ParameterFilter {$path.StartsWith("$env:temp")}
Assert-MockCalled `
-CommandName Set-Content `
-Times 2 `
-ParameterFilter { $path -eq "$env:temptest.txt" }
Pesterの特徴
❏ 安全なテストのためのTestDrive
❏ パワフルなMock
❏ デフォルトでCodeCoverageを計測可能
❏ CIのための複数のオプション
❏ Invoke-Pesterの-CodeCoverageパラメータを使用
❏ 分析対象をファイルパスか、ファイルパスを含む
hashtableで指定
Pesterの特徴 ー デフォルトでCodeCoverageを計測可能
C:PS> Invoke-Pester .結果にコミットする.Tests.ps1 `
-CodeCoverage @{Path='.結果にコミットする.ps1'; Function='ライ●ップ'}
Code coverage report:
Covered 66.67 % of 3 analyzed commands in 1 file.
Missed commands:
File Function Line Command
---- -------- ---- -------
結果にコミットする.ps1 ライ●ップ 5 return '世界一のボディメイクを達成'
Pesterの特徴 ー デフォルトでCodeCoverageを計測可能
❏ 安全なテストのためのTestDrive
❏ パワフルなMock
❏ デフォルトでCodeCoverageを計測可能
❏ CIのための複数のオプション
Pesterの特徴
❏ Invoke-PesterにCIのためのパラメータ
❏ -OutputFileパラメータを使ってNUnit形式のXMLを出力で
きるので、お好みのCIツールを使って解決
❏ -EnableExitスイッチを指定するとリターンコードを伴って
PowerShellのセッションを終了する
Pesterの特徴 ー CIのための複数のオプション
❏ -PassThru でInvoke-Pesterの実行結果を格納したオブジェ
クトを返す
❏ CI環境で直接PowerShellを実行出来るならこのオブジェク
トを使って後続処理
❏ TotalCount/PassedCount/FailedCount
❏ Time
❏ TestResult
Pesterの特徴 ー CIのための複数のオプション
Information
Pesterの情報
❏ Pester Wiki
❏ PowershellでPesterを使ってテストしてみた - なか日記
❏ PesterのMock機能をもう少し詳しく│株式会社シフト
❏ Get started with Pester (PowerShell unit testing framework)
❏ Testing your PowerShell scripts with Pester: Assertions and
more
Enjoy Testing, Enjoy Pester!

それでも僕はユニットテストを書きたい - Pester powered by PowerShell