しばたテックブログ

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

Pesterでカスタムアサーションを行う - 正式版

blog.shibata.tech

以前Pesterの機能をハックしてカスタムアサーションを行うエントリを書きましたが、Pester 4.0.5より正式にカスタムアサーションを追加する方法が提供されました。

本エントリではその方法を紹介します。

Pesterでカスタムアサーションを行う

これまでは、

  1. Pester[動詞]
  2. Pester[動詞]FailureMessage
  3. NotPester[動詞]FailureMessage

という名称の3つの関数を用意してやればPesterが内部的に独自の動詞として認識してくれました。

Peseter 4.0.5からは新たにAdd-AssertionOperatorという関数が追加され、任意の関数を1つ用意すれば独自の動詞として使用することができる様になりました。

カスタムアサーション例

Gistに前回の例を正式な方法で移植したものを上げました。
前回の関数をそのまま移植している部分があるので若干ごちゃごちゃしていますが、とりあえずはBeHashという関数に注目してください。

gist.github.com

Pesterでカスタムアサーションを行うサンプル(正式版)

カスタムアサーションを行う関数の仕様

カスタムアサーションを行う関数の名称は任意で良くなりました。
今回はBeHashという名前にしています。

ただし、引数は最低限以下の様にする必要があります。

  • ActualValue : テスト対象となる値
  • ExpectedValue : (オプション)期待値
  • Nagate : -Notと併用される場合は$true、そうでない場合は$falseが指定される

検証していませんが、内部的にはパラメーター名で識別している様なので引数の順序はバラバラでも大丈夫そうです。
また-ExpectedValueは無くても問題ありません。

そして-Nagateパラメーターは

Should -Not -BeHash @{ Name = "田中"; Salary = 300 }

の様に-Notと動詞が併用されるときに$trueが渡されるパラメーターとなります。
先の例にある様にこのパラメーターによって検証結果の成否を反転してやる必要が出てきます。

ちなみに、本エントリでは詳細に触れませんが、この3つ以外に引数を追加すると独自パラメーターとして使える様です。

次に、関数の戻り値は以下のプロパティを持つPSCustomObject*1にする必要があります。

  • Succeeded : テストが成功した時は$true、失敗した時は$false
  • FailureMessage : テスト失敗時のエラーメッセージ

先の例にある様に-Nagateパラメーターによってエラーメッセージを切り替えてやるのがパターンの様です。
(この例では最終的に同じメッセージになるのですが、Pesterの内部実装を見るときちんとメッセージを分けてやっています)

Add-AssertionOperatorの使い方

新たに作った関数をAdd-AssertionOperatorに渡すことで独自の動詞として登録し、カスタムアサーションを行うことができる様になります。
Add-AssertionOperatorは以下の引数を取ります。

  • Name : Shouldで使われる動詞の名前。BeHashを指定するとShould -BeHashと宣言することが可能
  • Test : カスタムアサーションを行う関数
  • Alias : (オプション)動詞のエイリアス。[string[]]型で複数指定可能
  • SupportsArrayInput : (Switch)配列入力をサポートするか否か

使用例として先の例から利用個所を抜粋しておきます。

# 使用例
Add-AssertionOperator -Name BeHash -Test $function:BeHash -Alias 'Hash'

参考資料

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

Pester 4.0では/Functions/Assertionsディレクトリにある標準の動詞もAdd-AssertionOperatorを使う様に実装が書き換えられています。

これらの実装を読むのがカスタムアサーションを行う際の一番の参考資料になるでしょう。

*1:実装上はNew-Object PSObjectとしています

PowerShell 6.0からPowerShellのプログラム名がpwshに変わります

発端はGitHubのこちらのIssueから

github.com

もともと「PowerShellのプログラム名であるpowershell.exe(powershell)は長いので略称があった方が良いよね。」という提案から始まっています。

新しいPowerShellの略称について

先のIssueを見ればわかりますが、新しいPowerShellの略称は pwsh になりました。

これまでは慣例的にposhが良く使われていましたが、既存の名称(Policy-compliant Ordinary SHell)と重複するため却下され、最終的に名称の重複がないpwshが採用されました。

名前の重複に関しては以前にエイリアスにwgetcurlを使っていた件で荒れに荒れた過去があるためPowerShell Teamとしてかなり慎重になっている様です。

他にも以下の名称が候補に上がっていました。*1

候補 不採用の理由(明確な理由がある場合のみ記載)
posh Policy-compliant Ordinary SHellと名前が重複
ps psコマンドと衝突
psc
psh Perl Shellと名前が重複
msh 既存の様々な略称と重複
mosh Mobile Shellと名前が重複
monad
pscore
coreps
coresh
pscmd
psc
pscx
pscsh cshと名前が重複
pshell
prsh
wpsh
wprsh
pwrsh
paua paua shell(パウア貝)...

個人的はpshが良かったのですが仕方ないですね...

PowerShellのプログラム名が変わる話

PowerShellの新しい略称が決まり、私個人の予想としてはショートカットやシンボリックリンクを張ることで実環境に反映させるのかと思っていたのですが、PowerShell 6.0ではプログラム名(powershell.exe(powershell))をpwsh.exe(pwsh)に変更する対応となりました。

変更するPull Requestが以下に上げられており、つい先日マージされ、正式にプログラム名が変更されることになりました。

github.com

この対応はかなり破壊的な変更になるので正直全く予想できませんでした...

とはいえ破壊的変更といっても非Windows環境においては影響が無く、Windows環境においても既存のWindows PowerShellと明確に区別したいという意図がある様で、改めて考えるとむしろ良い変更なのかな?という気もします。

*1:チェック漏れがあるかも...

PowerShell 6.0でアイコンが新しくなる話とPosh-ChanことPowerShellさんについて

ちょっとしたことですが意外と大きな変化です。

PowerShell 6.0の新しいアイコン

PowerShell 6.0の開発においてこれまでは味気ないコンソールアプリのデフォルトアイコンが使用されていましたが、PowerShell 6.0 Beta.8から黒色をベースとした新しいアイコンに変わり、これがPowerShell 6.0の新しいアイコンになる見込みです。

これまでのアイコン

f:id:stknohg:20171014132854p:plain:w100

新しいアイコン

f:id:stknohg:20171014132906p:plain:w100

【比較用】PowerShell 5.1のアイコン

f:id:stknohg:20171014132926p:plain:w100

アイコンを変えるまでの経緯についてはGitHubのこちらのIssueで確認できます。

github.com

アイコンとコンソールカラーの変化について

既にPowerShell 6.0をお使いの方はわかるかと思いますが、PowerShell 6.0ではコンソールの背景色がこれまでの青色(1,36,86)からコマンドプロンプトと同じく黒色に変わっています。

f:id:stknohg:20171014133919p:plain

PowerShell 6.0のアイコンが黒をベースとしてるのはこの変化が基本にある様です。

このコンソールカラーの変化については、特に理由は名言されていないのですが、クロスプラットフォーム化したことによりこれまでの青色が使えない・使いにくくなったのと、Windows 10 Fall Creators Updateでコンソールカラーが一新される事も背景にあるのかなと推測しています。

Posh-ChanことPowerShellさんについて

アイコンの変更に加えてPowerShell 6.0 Beta.8からWindows版のMSIインストーラーにアメコミ調の女性?型のキャラクターが表示される様になりました。*1

f:id:stknohg:20171014132939p:plain

このキャラクターはあまり認知度は高くないと思いますがPowerShell公式のキャラクターです。

名前はそのまま PowerShell の様です。(よくある言語の擬人化なのでしょう)
中の人からはPowerShell HeroやPosh-Chan*2と呼ばれている様です。

正確な時期は把握していないのですが、このPowerShellさんはNano ServerのキャラクターであるNanomanの登場と同時期に誕生しています。
私の記憶ではNanomanの漫画に突如出てきたのが初出です。

いまではPowerShell TeamのTwitterアイコンにも採用されています。

Digital Art

公式のアートワークが以下からダウンロードできますので是非ご覧ください。

PowerShell Digital Art | Microsoft Docs

おまけ

Windows版の$PSHOME\assetsフォルダに新しいアイコンとPowerShellさんのアイコンがあるのでショートカットを作る時などに使うと良いでしょう。

f:id:stknohg:20171014133006p:plain

ちなみにPowerShellさんのアイコンは黒アイコンに決まる前の最初の変更案でした...
PowerShell Teamがどこまで本気だったか図りかねるのですが黒アイコンに決まってくれて心底ホッとしています。

*1:残念ながらWindowsのみです。ほかのOSのインストーラーには表示されません。

*2:ちゃん付けするにはかなり勇ましいですが...