PowerShellでPesterを使ったモジュールのテスト方法を学ぶ

PowerShellは、WindowsやLinuxで使える強力なコマンドラインツールです。

開発者がスクリプトやモジュールを作成する際に、テストの自動化は欠かせない要素です。

PowerShellには、Pesterという人気のあるテストフレームワークがあり、これを使うことでスクリプトやモジュールの品質を保つことができます。

この記事では、Pesterの基本から実際のモジュールのテスト方法までを学び、実際に使えるスクリプト例と解説を行います。

最後に演習問題も用意しているので、理解度をチェックしてみてください。


Pesterとは?

Pesterは、PowerShell用のテストフレームワークであり、単体テストやモジュールの機能テストを自動で行うために使われます。

テスト駆動開発(TDD)にも対応しており、開発者はテスト結果をもとにコードを改善することができます。

Pesterを使うメリットは以下の通りです:

  • テストが自動化され、エラー検出の効率が向上する
  • コードの品質が向上し、運用リスクが軽減される
  • 継続的インテグレーション(CI)ツールとの相性が良い

Pesterのインストール

PesterはPowerShell Galleryからインストールすることができます。

次のコマンドで最新バージョンのPesterをインストールしましょう。

Install-Module -Name Pester -Force -SkipPublisherCheck

注意: 初めてPowerShell Galleryからモジュールをインストールする場合、「NuGetプロバイダーのインストールを求められる」ことがあります。その場合は、指示に従ってインストールしてください。


Pesterの基本構文

Pesterを使ったテストスクリプトの基本構造は次の通りです:

Describe 'テストする機能の説明' {
    Context '特定の条件の説明' {
        It '期待される結果の説明' {
            # 実際のテストコードを書く
            $result = <実行するコード>
            $result | Should -Be <期待される値>
        }
    }
}
  • Describe:テストする対象の説明を行います。
  • Context:特定の条件やシナリオを記述します。
  • It:個別のテストケースを定義します。
  • Should:結果の検証を行います。例:-Be は一致するかどうかのチェックです。

Pesterを使った基本テストの例

ここでは、関数が正常に動作するかをテストするシンプルな例を見てみましょう。

関数の定義(例)

次の関数は、2つの数値の和を返します。

Function Add-Numbers {
    param(
        [int]$a,
        [int]$b
    )
    return $a + $b
}

Pesterテストの作成

上記の関数をテストするために、以下のテストスクリプトを作成します。

Describe 'Add-Numbers関数のテスト' {
    Context '正常な入力の場合' {
        It '2と3を足すと5になる' {
            $result = Add-Numbers -a 2 -b 3
            $result | Should -Be 5
        }
    }

    Context '負の数を含む場合' {
        It '-1と1を足すと0になる' {
            $result = Add-Numbers -a -1 -b 1
            $result | Should -Be 0
        }
    }
}

高度なPesterテストの例

ここでは、カスタムモジュール内の複雑な関数をテストする例を紹介します。

モジュール例:ユーザーの役割を判定する関数

次の関数は、ユーザーのロール(AdminまたはUser)をチェックします。

Function Get-UserRole {
    param(
        [string]$UserName
    )
    if ($UserName -eq 'admin') {
        return 'Admin'
    }
    else {
        return 'User'
    }
}

Pesterテストの作成

この関数が正しくロールを返すかをテストします。

Describe 'Get-UserRole関数のテスト' {
    Context 'adminユーザーの場合' {
        It 'adminと入力するとAdminを返す' {
            $role = Get-UserRole -UserName 'admin'
            $role | Should -Be 'Admin'
        }
    }

    Context '一般ユーザーの場合' {
        It 'userと入力するとUserを返す' {
            $role = Get-UserRole -UserName 'user'
            $role | Should -Be 'User'
        }
    }
}

演習問題

以下の問題に挑戦し、Pesterを使ったテストスクリプトを自分で作成してみましょう。

問題1:文字列の長さを返す関数を作成

要件

  1. 関数名は Get-StringLength とする。
  2. 引数として文字列を1つ受け取り、その文字列の長さを返す。

テスト内容

  • 入力が “PowerShell” のとき、返り値は 10 である。
  • 空文字列を入力したとき、返り値は 0 である。

解答例

関数の定義

Function Get-StringLength {
    param(
        [string]$InputString
    )
    return $InputString.Length
}

Pesterテストの作成

Describe 'Get-StringLength関数のテスト' {
    Context '通常の文字列の場合' {
        It '"PowerShell"の長さは10' {
            $length = Get-StringLength -InputString 'PowerShell'
            $length | Should -Be 10
        }
    }

    Context '空文字列の場合' {
        It '空文字列の長さは0' {
            $length = Get-StringLength -InputString ''
            $length | Should -Be 0
        }
    }
}

まとめ

この記事では、PowerShellのテストフレームワークであるPesterを使って、モジュールや関数のテストを行う方法を紹介しました。

Pesterは、コードの品質を高めるための強力なツールであり、継続的なテストが求められる環境で非常に有用です。

演習問題で示したように、Pesterを使えば、関数のテストを簡単に自動化できます。

これを機に、ぜひ自分のプロジェクトにもPesterを導入してみてください。

この記事が、PowerShellの開発におけるテスト自動化の第一歩となることを願っています。