素敵なおひげですね

PowerShellを中心に気分で書いているブログです。

Pester 4.0での新機能・変更点まとめ

元ネタはこちら。

github.com

そろそろPester 4.0のリリースも近づいているかなと思い、新機能や変更点をざっくりとまとめてみました。

Pester 4.0のインストール

現時点での最新版はVer.4.0.3(Release Candidate扱い)となっており、PowerShell Galleryから入手することができます。

Install-Module Pesterコマンドで普通にインストールできるはずですが、PowerShell 5.0以降の環境であれば標準でPester(Ver.3系)がインストール済みであるため-Force-SkipPublisherCheckgetパラメーターを指定する必要があるかもしれません。
私の環境では両方のパラメーター指定が必要でした。

インストール例)

Install-Module Pester -Scope CurrentUser -Force -SkipPublisherCheckget

これでPester 4.0の新機能を試すことができます。

1. 文法の変更

最初はVer.4で発生した文法の変更について記載します。

Shouldとともに使用していたBe等の動詞がVer.4から名前付きのダイナミックパラメーターとなり、-Beの様に指定することが可能になりました。
互換性を維持するため従来の記法は残されていますがいずれ廃止されるそうです。(時期は未定)

以下に簡単な例を示します。

# 従来の文法
Import-Module Pester -MaximumVersion 3.4.0 -Force

Describe '従来の文法 - 動詞のパラメーター化' {
    It '足し算のテスト' {
        1 + 1 | Should Be 2
    }
}
# Ver.4からの文法
Import-Module Pester -MinimumVersion 4.0.3 -Force

Describe '新しい文法 - 動詞のパラメーター化' {
    It '足し算のテスト' {
        # BeなどがShouldの名前付きパラメーターに
        1 + 1 | Should -Be 2
    }
}

この変更によりISEやVSCodeなどのインテリセンスに各動詞が表示される様になり、よりコーディングがしやくすなります。

f:id:stknohg:20170414200034p:plain

2. 配列を入力する際の仕様変更

Should Beにおける配列の扱いがVer.4から変更されます。

Ver.3までは以下のテストは$trueを返していましたが、Ver.4からこれは$falseを返す様になります。

# 従来の挙動
Import-Module Pester -MaximumVersion 3.4.0 -Force

Describe '従来の文法 - 配列の挙動' {
    It 'バージョン3までは通るテスト' {
        @( $true, $true, $true ) | Should Be $true
    }
}

Ver.4からこのテストを通すには以下の様に記述する必要があります。

# Ver.4からの挙動
Import-Module Pester -MinimumVersion 4.0.3 -Force

Describe '新しい文法 - 配列の挙動' {
    It 'バージョン4で通るテスト' {
        @( $true, $true, $true ) | Should -Be @( $true, $true, $true )
    }
}

見てわかるかと思いますが、Ver.4からはShouldに対して配列の要素ではなく配列全体が比較の対象になる様に変更されています。

3. 表示色の刷新

Ver.4からテスト結果の表示色が新しくなります。

Ver.3までの色はこちら。

f:id:stknohg:20170414200756p:plain

Ver.4からの色はこちら。

f:id:stknohg:20170414200817p:plain

色を変えた意図がいまいち掴めなかったのですが、コミットログを追う限りでは、従来ホスト毎にカラースキームを持ち色分けしていた部分を統一しシンプルにした影響を受けている様です。

4. ContextとDescribeのネスト

Ver.4からContextDescribeをネストすることが可能になります。
Ver.3まではネストするとエラーになりました。

設定例)

# Ver.4からの挙動
Import-Module Pester -MinimumVersion 4.0.3 -Force

Describe '新しい文法 - Describe ネスト1' {
    Describe '新しい文法 - Describe ネスト2' {
        Context '新しい文法 - Context ネスト1' {
            It '足し算のテスト' {
                1 + 1 | Should -Be 2
            }
        }
    }
}

5. Gherkinのサポート

Ver.4からPesterでGherkin(ガーキン)を使ったFeatureファイルによるテストがサポートされる様になりました。

Gherkinとは何ぞやといった話については、

いまさら聞けないTDD/BDD超入門(2):TDD/BDDの思想とテスティングフレームワークの関係を整理しよう (3/3) - @IT

Cucumber のフィーチャの文法 - Gherkin | そんなこと覚えてない

が参考になります。

使い方としては、Featureファイル(ほげほげ.feature)とStepファイル(ほげほげ.steps.ps1)を記述し、Invoke-Gherkinコマンドを呼ぶことでテストを実行することができます。
Featureファイルにおける各機能は以下の様にPesterの機能と対応しています。

  • Feature(フィーチャ) = Describe
  • Scenario(シナリオ) = Context
  • 各ステップ = It

正直良い例が思いつかなったので、先述の@ITの記事にあるサンプルをPesterに合わせた形にして例示します。

Featureファイル(Sample.feature)

# language: ja
フィーチャ: TDDのサイクルはRED、GREEN、REFACTORからなっています。
  GREENからREFACTORを飛ばすことはありますが、REDからGREENを飛ばしてREFACTORしないのが特徴です。
  これはテストなどによって保証されている範囲でのみ内部を変更することを「REFACTORING」と呼ぶという定義によるものです。
  
  シナリオ: プロジェクトを始めるときにTDDの最初の一歩になる手順
    前提 プロジェクトを始めるときはテストがない
    もし 要求を満たすテストを追加する
    かつ テストを実行する
    ならば テストが失敗して、TDDでいう「RED」になる

Stepファイル(Sample.steps.ps1)

Given 'プロジェクトを始めるときはテストがない' {
    # 処理
}
When '要求を満たすテストを追加する' {
    # 処理
}

And 'テストを実行する' {
    # 処理
}

Then 'テストが失敗して、TDDでいう「RED」になる' {
    # 処理
}

テスト実行例)

# カレントディレクトリにあるすべての.featureファイルを実行する
Invoke-Gherkin

# Pathを指定する場合
# [Feature名].Steps.ps1 という名称のStepファイルを自動で取り込む
Invoke-Gherkin -Path .\Sample.feature

実行した結果はこんな感じになります。
まだ英語以外の言語では警告がでる様です。

f:id:stknohg:20170414204928p:plain

ちなみにGitHubにもサンプルがありますのでこちらを参照するのも良いかと思います。

6. 非推奨、または廃止された機能

Ver.4になって非推奨、または廃止された機能は以下となります。

  • Invoke-Pester-Quietパラメーターは非推奨になり、代わりに-Show Noneを使うことが推奨されます。
    -ShowパラメーターにはPester.OutputTypes列挙型の値を指定することができ、以下の様に定義されています。
namespace Pester
{
    [Flags]
    public enum OutputTypes
    {
        None = 0,
        Default = 1,
        Passed = 2,
        Failed = 4,
        Pending = 8,
        Skipped = 16,
        Inconclusive = 32,
        Describe = 64,
        Context = 128,
        Summary = 256,
        Header = 512,
        All = Default | Passed | Failed | Pending | Skipped | Inconclusive | Describe | Context | Summary | Header,
        Fails = Default | Failed | Pending | Skipped | Inconclusive | Describe | Context | Summary | Header
    }
}
  • New-TestDriveItemは無くなりました。(ただ、昔から無い様に見受けられます…)

  • Invoke-Pester-OutputXmlパラメーターは無くなり、-OutputFile-OutputFormatの組み合わせに変更されます。
    -OutputFormatはいまのところNUnitXmlのみですが、今後のバージョンで増える可能性はありそうです。

最後に

とりあえずこんな感じです。
Pester 4.0のリリース時期はまだ具体的に決まっていない様ですが、今から備えておくのも良いかと思います。