しばたテックブログ

気分で書いている技術ブログです。

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

元ネタはこちら。

github.com

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

Pester 4のインストール

現時点での最新版は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の新機能を試すことができます。

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のリリース時期はまだ具体的に決まっていない様ですが、今から備えておくのも良いかと思います。

Windows 7にPowerShell 6.0をインストールする

【2017/12/27追記】

最新のPowerShell 6.0 RC2での手順を別エントリに記載しました。

blog.shibata.tech

インストール手順はこちらのエントリをご覧ください。


割と誰得なエントリです。

PowerShell 6.0のサポートしているプラットフォームにWindows 7があったので実際に試したところ意外とハマったので記録を残しておきます。

インストール方法について

github.com

Windows 7向けのPowerShell 6.0(現時点ではAlpha 17)はMSIのインストーラーが提供されています。

公式のインストール手順にはMSIを実行するだけ、Windows 8.1、Windows 2012R2ではVisual Studio 2015 の Visual C++ 再頒布可能パッケージも必要だと記載されているだけであり、Windows 7向けには特に注意書きなどは記載されていません...

一抹の不安を感じますがこの手順を信じて進めてみることにします。

Windows 7にPowerShell 6.0をインストールする

今回は32Bit版での手順を紹介します。
64Bit版もやることは同じです。

1. とりあえずMSIをインストールすると...

インストール媒体からOSをインストールした直後の状態でMSIを実行しPowerShell 6.0をインストールすると、インストール自体はできるのですがプログラムを実行すると以下のエラーが出てしまいます。

コンピューターに api-ms-win-crt-runtime-l1-1-0.dll がないため プログラムを開始できません。 この問題を解決するには、プログラムを再インストールしてみてください。

f:id:stknohg:20170401081756p:plain

詳細ついては特に説明不要かと思います。
Windows 7でもWindows 8.1、Windows 2012R2同様にVisual Studio 2015 の Visual C++ 再頒布可能パッケージが必要となります。

2. SP1のインストール

Visual Studio 2015 の Visual C++ 再頒布可能パッケージをインストールするには、Windows 7 SP1である必要があります。

このためSP1が適用されていない環境では先にSP1にする必要があります。
この手順については細かく説明しませんが、Windows UpdateかKB976932を適用してください。

3. Visual Studio 2015 の Visual C++ 再頒布可能パッケージのインストール

SP1を適用したらVisual Studio 2015 の Visual C++ 再頒布可能パッケージをインストールしてください。
インストーラーの指示に従うだけですのでこの手順についても細かく説明はしません。

4. KB2533623 の適用

Visual Studio 2015 の Visual C++ 再頒布可能パッケージをインストールした後でPowerShell 6.0を実行すると、今度は以下のエラーが出てしまいました。

Failed to load the dll from [C:\Program Files\PowerShell\6.0.0.17\hostfxr.dll],
HRESULT: 0x80070057 The library hostfxr.dll was found, but loading it from C:\Program Files\PowerShell\6.0.0.17\hostfxr.dll failed

f:id:stknohg:20170401081920p:plain

エラーメッセージを見るに.NET Coreの起動に必要な何かが不足していることがわかります。

そこで.NET Coreの利用に必要な事前条件を確認すると、

For Windows 7 and Windows Server 2008 machines only:
Make sure that your Windows installation is up-to-date and includes hotfix KB2533623 installed through Windows Update.

と記載されており、KB2533623を適用する必要があることがわかります。

この更新を適用することで無事PowerShell 6.0を起動することができました。

f:id:stknohg:20170401081934p:plain

おまけ

Visual Studio Code PowerShell拡張はPowerShell 3.0以上であれば使えます。

f:id:stknohg:20170401082714p:plain

settings.jsonpowershell.developer.powerShellExePathにPowerShell 6.0のパスを設定することでWindows 7でもPowerShell拡張を使うことが可能です。

// settings.json
{
    "powershell.developer.powerShellExePath": "C:\\Program Files\\PowerShell\\6.0.0.17\\powershell.exe"
}

f:id:stknohg:20170401082547p:plain

右下のPowerShellのバージョン欄がちゃんと6.0になっていることがわかります。

最後に

とりあえずこんな感じです。

現時点でWindows 7を扱う環境であれば、大抵の場合SP1および最新の(またはそれに近い)Windows Updateが適用されていると思いますので、本エントリの様にハマることは少ないと思います。

また、Windows 7ではWMF 5.1(PowerShell 5.1)もインストールすることができますので通常はこちらをインストールすることになるでしょう。

stknohg.hatenablog.jp

もともと本エントリを書こうと思った動機は「何らかの理由でPowerShell 3.0以降をインストールすることができない環境にPowerShell 6.0をサクッとインストールして代替とすることができないか?」だったのですが、現実はそう甘くなかったです。

Visual Studio Code PowerShell拡張で使えるコマンドまとめ

前回前々回に続いて今回はPowerShell拡張で利用可能なコマンドをまとめました。

各コマンドがどのバージョンから利用可能になったか調査するのが難しい部分があったため、単純に現在最新のバージョン(Ver.0.11)で利用可能なものをリストアップする形としています。

1. コマンドパレットで使えるコマンド

最初にコマンドパレットで利用可能なコマンドについて記載します。

コマンドパレットはCtrl+Shift+Pで開くことができ、Powershell:で始まるコマンドがPowerShell拡張で使えるコマンドになります。

f:id:stknohg:20170328210828p:plain

以下に一覧を記載します。

コマンド 内容
PowerShell: Create New Project from Plaster Template Plasterを使いテンプレートからプロジェクトを生成します。
PowerShell: Expand Alias (Shift+Alt+E) スクリプト中のエイリアスを展開します。
PowerShell: Find/Install PowerShell Modules from the gallery (Ctrl+K Ctrl+F) PowerShell Galleryからモジュールを検索しインストールします。
PowerShell: Get online help for Commands (Ctrl+F1) 選択されたコマンドのオンラインヘルプを表示します。
PowerShell: Open current file in PowerShell ISE (Ctrl+Shift+I) 現在のファイルをPowerShell ISEで開きます。
PowerShell: Open Examples Folder Examplesフォルダを開きます。
PowerShell: Open PowerShell Extension logs Folder PowerShell拡張のログフォルダを開きます。
PowerShell: Restart Current Session 現在のPowerShell Sessionを再起動します。
PowerShell: Run selecton (F8) 選択部分を実行します。
PowerShell: Select PSScriptAnalyzer Rules PSScriptAnalyzerで適用するルールを設定します。
PowerShell: Show additional commands from PowerShell modules PowerShell拡張に追加したコマンドを表示します。
PowerShell: Show Integrated Console Integrated Consoleを表示します。
PowerShell: Open PowerShell Extension logs PowerShell拡張のログを出力に表示します。
PowerShell: Open Show Session Menu セッションメニューを表示します。

PowerShell: Create New Project from Plaster Template

Plasterを使いテンプレートからプロジェクトを生成します。
Plasterでは独自のテンプレートを作ることができますが、現時点ではNew PowerShell Manifest Moduleというマニフェストモジュールを作るテンプレートのみ登録されています。

f:id:stknohg:20170328020411p:plain

動作を確認してみたところ、Integrated Consoleとの相性が悪いのか、このコマンドを実行してもキャレットの制御が上手くいかずモジュールの生成がかなり面倒なことになっていました…
これはそのうち改善されると思います。

PowerShell: Expand Alias

スクリプト中のエイリアスを展開し元の関数に戻してくれます。
例えば、

echo "Hello World"

というスクリプトであれば、

Write-Output "Hello World"

と変換してくれます。
非常に便利な機能な上Shift+Alt+Eのショートカットキーも割り当てられていますので覚えておくとスクリプトの作成が捗るでしょう。

PowerShell: Find/Install PowerShell Modules from the gallery

PowerShell Galleryからモジュールを検索しインストールすることができます。

f:id:stknohg:20170328022653p:plain

Install-Module -Name [モジュール名] -Scope CurrnetUser

と同等の機能ですが、一旦すべてのモジュール情報をローカルにキャッシュしている様で初回実行時はレスポンスが非常に悪いです…
率直に言ってこれならIntegrated Consoleから直接Find-ModuleInstall-Moduleを実行した方がマシだと思います。

PowerShell: Get online help for Commands

選択されたコマンドのオンラインヘルプ(MSDN)を表示します。
残念ながらブラウザを起動して該当のページを開いてくれるだけで、PowerShell ISEのコマンドアドオンの様に至れり尽くせりな感じではないです…

PowerShell: Open current file in PowerShell ISE

現在のファイルをPowerShell ISEで開きます。
機能としては面白いですが、正直使いどころがわかりません…

PowerShell: Open Examples Folder

新しいVisual Studio Codeを起動し、Examplesフォルダを開きます。

f:id:stknohg:20170328022410p:plain

PowerShell: Open PowerShell Extension logs Folder

新しいVisual Studio Codeを起動し、PowerShell拡張のログフォルダを開きます。

f:id:stknohg:20170328023020p:plain

PowerShell: Restart Current Session

現在のPowerShellセッションを再起動します。
このコマンドは実質PowerShell拡張の再起動コマンドとなります。

前回触れたとおり、powershell.startAutomatically=falseの場合はこのコマンドを使ってPowerShell拡張を有効にする必要があります。

PowerShell: Run selecton

ファイル中で選択された部分を実行します。

このコマンドはコマンドパレットからよりF8キーを押して実行する方が多いかと思います。

PowerShell: Select PSScriptAnalyzer Rules

PSScriptAnalyzerで適用するルールを設定します。

f:id:stknohg:20170328023728p:plain

チェックを付けたルールが有効になりconfirmをクリックすると反映されます。

この設定は永続化しませんので、永続化させたい場合はpowershell.scriptAnalysis.settingsPathパラメーターに独自の設定ファイルを記述する必要があります。

PowerShell: Show additional commands from PowerShell modules

PowerShell拡張に追加したコマンドを表示・実行します。

ここでコマンドを表示するには、あらかじめRegister-EditorCommandを使いコマンドを追加しておく必要があります。
細かい手順については Extending the Host Editor を参考にしてください。*1

PowerShell: Show Integrated Console

Integrated Consoleを表示します。
おおむねCtrl+@と同等の動作をしますが、細かい違いとしてはIntegrated Terminalに複数の端末がある場合にIntegrated Consoleを選択して表示してくれます。
(Ctrl+@の場合は直近に開かれていた端末を表示するだけです)

PowerShell: Open PowerShell Extension logs

PowerShell拡張のログを出力に表示します。

f:id:stknohg:20170328024640p:plain

PowerShell: Open Show Session Menu

セッションメニューを表示します。

f:id:stknohg:20170328024754p:plain

セッションメニューでは、

  • Restart Current Session
  • Open Session Logs Folder

コマンドと、このメニューにのみ存在する

  • Switch to Windows PowerShell [(x86)|(x64)]

コマンドが提供されています。
Switch to Windows PowerShellコマンドは意外と使いどころがありそうなので独立したコマンドにしてほしい感じです。


【2017/07/13追記】

Ver.1.2.0よりこのメニューが拡張され、Switch to Windows PowerShell [(x86)|(x64)]に加え、追加でインストールされたPowerShell*2に切り替えることが出来る様になりました。

f:id:stknohg:20170713190247p:plain

2. Integrated Consoleで使えるコマンド

  • 2017/07/13 Ver.1.4.0で追加されたコマンドに対する説明を追記

続けてIntegrated Consoleで使える独自コマンド*3について説明します。

現時点ではまだpseditの1コマンドしかありません。

コマンド 内容
psedit 指定したファイルをVisual Studio Codeで表示します。
Out-CurrentFile フォーマットされた文字列を現在開いているファイルに出力します。
New-VSCodeHtmlContentView 新しいHTMLコンテンツビューを作成します。
Set-VSCodeHtmlContentView 指定されたHTMLコンテンツビューにHTMLを上書きします。
Write-VSCodeHtmlContentView 指定されたHTMLコンテンツビューにHTMLを追記します。
Show-VSCodeHtmlContentView 指定されたHTMLコンテンツビューをアクティブにして表示します。
Close-VSCodeHtmlContentView 指定されたHTMLコンテンツビューを非表示にします。

psedit

pseditは指定したファイルをVisual Studio Codeで開くコマンドです。
PowerShell ISEに同名のコマンドが存在しますが、Ver.0.11になってPowerShell拡張にも実装されました。

PowerShell ISEとはパラメーター名が異なり-FilePathsとなっています。*4

実行例は以下の様な感じです。

> psedit -FilePaths .\hello.ps1, .\world.ps1

f:id:stknohg:20170328214905p:plain

Out-CurrentFile (Ver.1.4.0より利用可)

コマンドなどを実行した結果の文字列を現在開いているファイルに文字列として出力します。
下の画像を見ていただければイメージは一発で掴めるかと思います。

実行例)

ls c:\ -Directory | select -ExpandProperty name | Out-CurrentFile

f:id:stknohg:20170713212416p:plain

New-VSCodeHtmlContentView (Ver.1.4.0より利用可)

Ver.1.4.0より、HTMLコンテンツビュー(チェンジログなどの表示に使われているHTML形式のビュー)を扱うためのコマンドレットが追加されました。

現状これらのコマンドが何に使えるのかといえば答えに窮するのですが、PowerShell TeamとしてもUI拡張のための機能をとりあえず作ってみたといった感じの様です。
そんな感じなのでこのHTMLコンテンツビューに関する機能については今後いろいろと変化するものと予想されます。

で、このNew-VSCodeHtmlContentViewでは新しいHTMLコンテンツビューを作成します。
次に説明するSet-VSCodeHtmlContentViewWrite-VSCodeHtmlContentViewと合わせて、GitHubに記載されている例を見ればイメージは掴めるかと思います。

実行例)

$view = New-VSCodeHtmlContentView -Title "My Custom View" -ShowInColumn One
Set-VSCodeHtmlContentView -View $view -Content "<h1>Hello world!</h1>"
Write-VSCodeHtmlContentView $view -Content "<b>I'm adding new content!</b><br />"

https://user-images.githubusercontent.com/79405/27394133-f96c38cc-565f-11e7-8102-a3727014ea5a.GIF

(上図は https://github.com/PowerShell/vscode-powershell/releases より)

ちなみに、現時点でHTMLコンテンツビューにJavaScriptを差し込むことはできません。

Set-VSCodeHtmlContentView (Ver.1.4.0より利用可)

指定されたHTMLコンテンツビューにHTMLを上書きします。
実行例は上記参照。

Write-VSCodeHtmlContentView (Ver.1.4.0より利用可)

指定されたHTMLコンテンツビューにHTMLを追記します。
実行例は上記参照。

Show-VSCodeHtmlContentView (Ver.1.4.0より利用可)

指定されたHTMLコンテンツビューをアクティブにして表示します。

実行例)

Show-VSCodeHtmlContentView -View $view

Close-VSCodeHtmlContentView (Ver.1.4.0より利用可)

指定されたHTMLコンテンツビューを非表示にします。

実行例)

Close-VSCodeHtmlContentView -View $view

最後に

とりあえずこんな感じです。

率直に言ってあまりぱっとしないコマンドもありますが、便利なコマンドもありますので覚えておいて損はないかと思います。

*1:こちらについては時間をとって別記事を書こうと思います。

*2:基本的にはPowerShell 6.0の各バージョンになるはずですが…

*3:というか関数ですね…

*4:PowerShell ISEのpseditのパラメーター名は-filenamesです。