MRが楽しい

MRやVRについて学習したことを書き残す

AWESOME-COPILOTのドキュメントを読む その108(PowerShell Pester v5 Testing Guidelines)

本日はAWESOME-COPILOTの技術調査枠です。
AWESOME-COPILOTのドキュメントを読みながら実際に操作を試して記事に残します。
今回はカスタムインストラクションの一つPowerShell Pester v5 Testing Guidelinesについてです。

PowerShell Pester v5 Testing Guidelines

PowerShell Pester v5 Testing GuidelinesはPowerShell用テストフレームワークPester v5で自動テストを正しく書くためのルールです。
Pester v5はPowerShell向けの公式テストフレームワークでPowerShellコードを自動テスト(Unit Test/Integration Test)できる仕組みです。

以下のページからGenaiscriptのインストールボタンをクリックして取得します。
github.com

インストールボタンを押してPowerShell Pester v5 Testing Guidelinesをダウンロードします。
すると.github/instructions配下にインストラクションがインストールされます。

インストールしたインストラクションはCopilotの動作に自動的に適用されます。
このインストラクションを読み込むと、CopilotはPester v5規約に沿ったテストコードを生成するようになります。

具体的にはCopilotは以下のような行動をとります。

ファイル名は*.Tests.ps1とする

CopilotはテストファイルをGet-UserInfo.Tests.ps1のように命名します。
これはPesterが認識しやすい標準形式です。

テスト対象の近くに配置する

Copilotはテストを対象スクリプトの隣またはTests/フォルダに置く設計にします。

直接コードを書かずPesterブロック内に入れる

全てのコードは以下のPesterブロック内に入れます。

BeforeAll {}
Describe {}
Context {}
It {}

BeforeAllでテスト対象を読み込む

Copilotはテスト冒頭で以下のようにdot-sourceで対象関数を読み込みます。

BeforeAll {
    . $PSScriptRoot/Get-UserInfo.ps1
}

Describe / Context / It 階層を使う

Copilotは以下の階層でテストを整理します。

Describe 'FunctionName' {
    Context 'When condition' {
        It 'Should behavior' {
        }
    }
}

これにより関数 → 条件 → 期待動作の構造になります。

Shouldでアサーションを書く

CopilotはPester標準の Shouldを使います。
例えば以下のようなコードです。

$result | Should -Be 'Expected'
$result | Should -Not -BeNullOrEmpty
{ Invoke-Thing } | Should -Throw

アサーションを適切に使い分ける

Copilotは目的に応じて以下を使います。

用途 Should
値比較 -Be, -BeExactly
配列 -Contain, -HaveCount
文字列 -Match, -Like
-BeOfType
真偽値 -BeTrue, -BeFalse
例外 -Throw
ファイル -Exist, -FileContentMatch

Mockを使って依存を分離する

Copilotは外部依存をMock Get-ADUser { @{ Name = 'TestUser' } }で置き換えます。
これによりAD、ファイル、ネットワークなどを実際に叩かずテストできます。

Mock呼び出し回数を検証する

Copilotは以下のコードを使い、依存関数が期待通り呼ばれたか確認します。

Should -Invoke Get-ADUser -Exactly 1

セットアップと後片付けを分ける

Copilotは以下を用途別に使います。

ブロック 用途
BeforeAll 1回だけ高コスト準備
BeforeEach 各It前の準備
AfterEach 各It後の後片付け
AfterAll 最後に1回だけクリーンアップ