PowerShellでのテスト方法「Pester」

趣味でPythonを学んでおりますが、開発するうえで避けて通れないのがコードのテストですよね。

 実務ではPowerShellに触ることが多いのですが、インフラエンジニアとして簡単なスクリプトを組む時はテストを自動化するということはあまり意識しておりませんでした。そりゃ簡単なテストはしますが、モジュールを使用してのテストにはどうしても疎い感じが私自身あります。

今回はそんなPowerShellのテストを実現するモジュールを紹介します。
その名もPesterです。
github.com


Windows 10 / Windows Server 2016 には Pester が標準で組み込まれているのですが、それ以前は組み込まれていないようです。

以下テスト方法
<コマンド>
mkdir C:\Pester
cd C:\Pester
New-Fixture -Name TestFunc


上記のコマンドを打つとファンクション スケルトン※1 を含んだ TestFunc.ps1 と、テストコードの TestFunc.Tests.ps1 の 2 ファイルが生成されます。
まずはファンクション スケルトンを含んだ TestFunc.ps1 を開いてファンクションを完成させます。
 
ファンクションを完成

TestFunc.ps1

#classを適当に作成
class Device {
    [string]$Name
    [string]$Age
    [string]$Hobby
    [string]ToString($Name,$Age,$Hobby){
        return ("私は{0}です。年齢は{1}才。趣味は{2}です。" -f $this.Name, $this.Age, $this.Hobby)
    }
}

#うるう年を判定するメソッド
function is_leap_year {
    param(
        $year
    )
    return ($year % 4 -eq 0) -and ($year % 100 -ne 0) -or ($year % 400) -eq 0
}


テストコード作成

TestFunc.Tests.ps1

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here\$sut"

Describe "is_leap_year" {
    It "test 1 clear" {
        is_leap_year '2000' | Should Be 'True'
    }
}

Describe "Device.ToString" {
    Context "contruction" {
        It 'Deviceインスタンスが生成されました' {
            [Device]::new()
        }
    }
    Context "method" {
        It 'ToString メソッドが呼び出されました' {
            $Device = [Device]::new()
            $Device.Name = "Kato"
            $Device.Age = 35
            $Device.Interests_Hobbies= "音楽鑑賞"
            $Result = $Device.ToString($Device.Name,$Device.Age,$Device.Hobby)
            $Result | Should be '私はKosakaです。年齢は35才。趣味は音楽鑑賞です。'
        }
    }
}

Describe 'class Hello' {
    Context 'contruction' {
        It 'Helloインスタンスが生成されました' {
            [Hello]::new()
        }
    }
    Context 'method' {
        It 'Helloのメソッドが呼び出されました' {
            $r = [Hello]::new().method('Yugo')
            $r | Should be 'Yugo hello'
        }
    }
}

構造
Describe → テストタイトル
It → テスト定義(これがコンソール上で成功するとメッセージとして吐かれる)
Context → classをテストするために必要な項目なようです(すみません、よく調査できてません)


上記が設定出来たらテスト実行です。

Invoke-Pester でテストコードを実行します。
f:id:annodomini_sh:20210621140750p:plain

それぞれの結果が緑色に表示され Passed: が 5 なのでテスト成功です。
classも通常の関数もテスト可能なので、手動でテストするより楽に実施できるのではないかと思います。





※1
ケルトンコード
コンピュータプログラムのソースコードでは、主要な制御構造や関数などの宣言や呼び出し、処理の核心部分などプログラムの大枠のみを記述し、詳細な処理の記述を省いたものをスケルトンコード、スケルトンプログラムなどと呼ぶことがある。