それでも僕はユニットテストを書きたい - pester powered by powershell
TRANSCRIPT
それでも僕はユニットテストを書きたい
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:temp\test.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!