39
35

More than 5 years have passed since last update.

PowerShellでユニットテスト(Pester)

Last updated at Posted at 2016-12-11

概要

Pesterを使ったPowerShellスクリプトのユニットテスト方法。

環境

  • Windows 10
  • PowerShell V5
  • Pester 3.4.4

ダウンロード、展開

Pesterをダウンロード。

※PowerShell V5には最初から入っているかも。

GitHub - pester/Pester: PowerShell BDD style testing framework

pes01.png

ダウンロードしたzipファイルを右クリック、プロパティでブロックの解除してから適当な場所に展開。
pes02.png

ひな形の生成

モジュール読み込み

Pesterモジュールを読み込む。

Import-Module .\Pester.psm1

ひな形生成

スクリプト格納用のディレクトリ作成。

md Test

作成したディレクトリの中にひな形出力。

New-Fixture .\Test Test1
実行結果
    ディレクトリ: C:\Work\Pester\Test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2016/12/11     20:19             26 Test1.ps1
-a----       2016/12/11     20:19            250 Test1.Tests.ps1

生成されたファイル。

Test1.ps1
function Test1 {

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

Describe "Test1" {
    It "does something useful" {
        $true | Should Be $false
    }
}

実行

ひな形のテストコード実行

とりあえず実行してみる。
Pester.psm1の読み込みは先ほどやったので省略。
Invoke-Pesterでテストファイルを読み込ませる。
[+]緑なら期待通りの結果、[-]赤なら期待とは違うという意味。
赤いのでテスト失敗。
pes03.png

Test1.Test.ps1を修正する。
Should Be $falseは、結果が$falseであることを期待するので、パイプラインの左側を$trueから$falseに修正して保存する。

Test1.Tests.ps1(抜粋)
        $false | Should Be $false

もう一度実行。
今度は成功。
pes04.png

色々試す

色々追加してみる。

Test1.ps1
function Test1([int]$i) {
    1000 / $i
}

function StrTest1([string]$msg) {
    $msg + $msg
}

Describeにそのテストの説明を書く。
Contextでテストをグルーピングすることができる。
Itが具体的なテストケース。

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

Describe "Test1の動作確認" {
    Context "正常系の確認" {
        It "1000を与えたら1が返るはず" {
            Test1 1000 | Should Be 1
        }
        It "200を与えたら5が返るはず" {
            Test1 200 | Should Be 5
        }
    }
    Context "異常系の確認" {
        It "0を渡したら例外が発生するはず" {
            {Test1 0} | Should Throw
        }
        It "数値以外を渡したら例外が発生するはず" {
            {Test1 "aaa"} | Should Throw
        }
    }
}
Describe "StrTest1の動作確認" {
    It "aaaを渡したらaaaaaaが返るはず" {
        StrTest1 "aaa" | Should Be "aaaaaa"
    }
    It "aaaを渡したらbbbは返らないはず" {
        StrTest1 "aaa" | Should Not Be "bbb"
    }
    It "nullを渡したらnullが返るはず" {
        StrTest1 $null | Should BeNullOrEmpty
    }
}
Describe "その他" {
    It "0より大きいはず" {
        5 | Should BeGreaterThan 0
    }
    It "100より小さいはず" {
        99 | Should BeLessThan 100
    }
    It "Test1.ps1はカレントディレクトリに存在するはず" {
        ".\Test1.ps1" | Should Exist
    }
    It "文字列型のはず" {
        "あああ" | Should BeOfType System.String
    }
    It "abで始まるはず(大文字・小文字区別なし)" {
        "ABCDefg" | Should BeLike "ab*"
    }
}

実行してみる。Invoke-Pesterに引数を指定しない場合はカレント配下にあるテストファイルを全部実行。
pes05.png

Test1.Test.ps1Describe "その他"の中に失敗ケースを入れてみる。

Test1.Tests.ps1(抜粋)
    It "abで始まるはず(大文字・小文字区別あり)" {
        "ABCDefg" | Should BeLikeExactly "ab*"
    }

Invoke-Pesterで実行。
予想結果が「小文字のabで始まる」に対し、入力がABCDefgなのでテスト失敗。
pes06.png

テスト結果のファイル出力

Invoke-Pester -OutputFormat NUnitXml -OutputFile テスト結果.xml

参考サイト

39
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
35