PowerShell スクリプトでより重要なタスクを行うようになると、スクリプトのテストが必要になります。IT管理者はこれまで、ソフトウェアテストに関してあまり関心を持たなかったかもしれませんが、ソフトウェア開発者は何十年もの間コードのテストを書いてきました。IT管理者も会社にとって重要なコード (スクリプト) を書き始めるようになり、テストの重要性が認知され始めています。
ソフトウェアテストは、コードを検証するためのコードを書くことが根幹になります。コードのテストを書くことはコード自身を書くこととそれほど異なるわけではありません、少なくとも PowerShell に関しては。
PowerShell コードをテストするための事実上のテスト用フレームワークは Pester です。Pester は、Windows 10 と Windows Server 2016 に組み込まれる PowerShell モジュールとして構築されたオープンソース・プロジェクトです。Pester は、PowerShell ギャラリーからダウンロードするか GitHub からダウンロードすれば、古いシステムでも実行できます。Pester は、特別に書かれたテストスクリプトを読むプロジェクトであり、種々のテストに合格したかどうかを示すアウトプットを出します。
Pester を使った PowerShell 用のテストの書き方について、シンプルなコードを取り上げ、そのためのテストを書いて説明します。シンプルなコードとして次のスクリプトを使うことにします。
function Do-Something {
param(
$String
)
if ($String -eq 1) {
'string was 1'
} else {
'string was something else'
}
}
上の関数は、$String に値1が渡されたときに “string was 1” を返し、$String がそれ以外の値であれば “string was something else” を返すという簡単なものです。このためのテストを作成するには、別の PowerShell スクリプトを作成する必要がありますが、名前の最後に Tests.ps1 を追加します。技術的には、必ずしもそうする必要はありませんが、ベストプラクティスとして推奨します。
関連 Podcast: What's Up With PowerShell And Pester?
Pesterテストは、describe ブロック、it ブロックと呼ばれる2つのスクリプトブロックで構成されます。これらがすべてのテストを整理します。たとえば、上記のコードのための小さなテストフレームワークを作成すると、次のようになります。
describe 'Do-Something' {
it "when 1 is passed as String, it returns 'string was 1'" {
}
it "when anything other than 1 is passed as String, it returns 'string was something else'" {
}
}
テストの構成は、describe ブロック内に個々のテスト(it ブロック)を配置する形式をとります。基本的な構造ができたら、次にコードを実行してテストします。1つの方法は、describe ブロック内部のコード、それから it ブロック内部のコードを呼び出して、期待される結果を assert することです。この例では、テストにマッチするよう2つの異なる値を使って関数を実行します。そして、should キーワードを使用して、出力が予想どおりだったかどうかを確認します。
describe 'Do-Something' {
it "when 1 is passed as String, it returns 'string was 1'" {
Do-Something -String 1 | should be 'string was 1'
}
it "when anything other than 1 is passed as String, it returns 'string was something else'" {
Do-Something -String 'something else' | should be 'string was something else'
}
}
上でわかるように、should キーワードを使ってどういう出力がされるべきかを指定できす。should キーワードは異なる値をチェックすることができます。テストが構築できたら、実行に移ります。実行には、Invoke-Pester コマンドを使います。このコマンドは、テストスクリプトを渡してテストフレームワークを実行します。次のような感じになります。
PS> Invoke-Pester -Path C:\Do-Something.Tests.ps1
Describing Do-Something
[+] when 1 is passed as String, it returns 'string was 1' 131ms
[+] when anything other than 1 is passed as String, it returns 'string was something else' 21ms
もし、何かがあってコードが変更されたとします。
function Do-Something {
param(
$String
)
if ($String -eq 1) {
'string was not right'
} else {
'string was something else'
}
}
変更後のコードのテストを再度実行すると、何かおかしいという即座のフィードバックを受け取ることができます。
Describing Do-Something
[-] when 1 is passed as String, it returns 'string was 1' 105ms
Expected string length 12 but was 20. Strings differ at index 11.
Expected: {string was 1}
But was: {string was not right}
----------------------^
at line: 4 in
4: Do-Something -String 1 | should be 'string was 1'
[+] when anything other than 1 is passed as String, it returns 'string was something else' 24ms
Pester は、インフラストラクチャ設定のテスト、種々のコード・ルーチンなど、他の多くのテストタスクを実行できます。Pester で何ができるかについて、一から詳細に知りたい場合は、The Pester Book をお読みください。
Subscribe to get all the news, info and tutorials you need to build better business apps and sites