<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1678611822423757&amp;ev=PageView&amp;noscript=1">

PowerShell の Pester とは?

Adam Bertram| February 01 2019

| IT insights, PowerShell

what-is-pester

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 をお読みください。

PowerShell を使って自動化する方法

Topics: IT insights, PowerShell

Default HTML block

コメントをどうぞ

メールアドレスは公開されません。アスタリスクマーク*のついたフィールドは必須項目です。

THIS POST WAS WRITTEN BY Adam Bertram

Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.

無料試用版

無料試用版をお気軽にお試しください。

無料試用版を試す

コンタクト

ご質問、ご意見をお寄せください。

連絡先

ブログの定期メール便

ブログを定期的にメール配信いたします。