はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【PowerShell】PesterというPowerShell用のテストフレームワークを用いてテストを実装する方法

はじめに

今回は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.dev
github.com

概要

PesterPowerShell用のテストフレームワークです。主にUnit TestE2E 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
}

unitysetup.powershell/Tests/UnitTests/Find-UnitySetupInstaller.Tests.ps1 at 7a565a0db854a38d714ebc98f62f0d830ea0e27b · microsoft/unitysetup.powershell · GitHub