troushoo

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

Windows 10 よりデフォルトでインストールされている、PowerShell のテストフレームワーク Pester

Windows 10 よりデフォルトでインストールされている、PowerShell のテストフレームワーク Pester の基本的な使用方法を紹介します。
Pester はオープンソースのため、GitHub にてソースコードも確認することができます。

Pester の基本的な使用方法
1. PowerShell のソースコード、並びに、テスト用のソースコードを格納するフォルダーを作成します。

2. PowerShell を起動し、上記 1 で作成したフォルダーに移動します。

3. 「New-Fixture –Name <ソースコードのファイル名>」を実行します。すると、.ps1 ファイルと、.Tests.ps1 ファイルが出来上がります。
この .ps1 ファイルに PowerShell スクリプトを、.Tests.ps1 にテストコードを記述します。
補足:これらの .ps1 ファイル、並びに、.Tests.ps1 ファイルは、New-Fixture コマンドを使わず、手動で作成しても構いません。


4. 上記 3 で作成された .ps1 ファイルを開くと以下のようになっています。

function mypestertest {

}

このひな形から黄色の部分を変更し、値を 2倍する、以下のコードを記述します。

function TimesTwo($valuse){
    return $valuse * 2
}


5. 上記 3 で作成された .Tests.ps1 ファイルを開くと以下のようになっています。

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here\$sut"

Describe "mypestertest" {
    It "does something useful" {
        $true | Should Be $false
    }
}


このひな形から黄色の部分を追記し、単体テスト用のコードを記述します。

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here\$sut"

Describe "mypestertest" {
  Context 'NumbersTest'{
    It "Multiplies numbers properly" {
      TimesTwo 2 | Should Be 4
    }
  }
  Context 'StringsTest'{
    It "Multiplies strings properly" {
      TimesTwo 'Test' | Should BeExactly 'TestTest'
    }
  }

}


上述のコードの通り、Pester には、DescribeContextIt のブロックが必要です。各々の意味は以下です。

Describe

Describe ブロックにテストを記述します。Pester のテストファイルは、1 つ以上の Describe を持ちます。

Context
オプションの設定で、Describe ブロックの内部に定義する、サブブロックです。

It
1 つのテストを定義します。

6. PowerShell にて「Invoke-Pester」コマンドを実行することにより、単体テストが実行できます。
「Passed: 2」と表示され、2 つのテストが成功したことがわかります。


Mock
Mock を利用することで、PowerShell コマンドの戻り値を変更することが可能です。
以下、具体例を用いて Mock の使用方法を紹介します。

0. 上記の 1 から 3 までを実行しておきます。

1. 作成された .ps1 ファイルを編集し、拡張子が .txt だったらそのファイル名を返す PowerShell するスクリプトを作成します。

function Get-TxtFileNames(){
    Get-ChildItem | Where Name -like *.txt | Select -ExpandProperty Name
}


2. 作成された .Tests.ps1 ファイルを編集し、Get-ChildItem 実行時に、Name が「mockfile.txt」であるオブジェクトファイルを返すようにします。
Mock Get-ChildItem { [PSCustomObject]@{ Name = 'mockfile.txt' } }」の部分です。

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here\$sut"

Describe "mocktest" {
    It 'returns one text file' {
        Mock Get-ChildItem { [PSCustomObject]@{ Name = 'mockfile.txt' } }
        Get-TxtFileNames | Should Be 'mockfile.txt'
    }

}


その後、Get-TxtFileNames を呼んでいますが、Get-TxtFileNames の中で呼ばれる Get-ChildItem は、「mockfile.txt」を返すように変更されているので、このテストは必ず成功はずです。

3. txt がないカレントディレクトリで、PowerShell にて「Invoke-Pester」コマンドを実行します。
本来なら、「Get-ChildItem | Where Name -like *.txt | Select -ExpandProperty Name」は、.txt ファイルがないために何も返さないはずです。


しかし、「Mock Get-ChildItem { [PSCustomObject]@{ Name = 'mockfile.txt' } }」により、Get-TxtFileNames の中の Get-ChildItem は「mockfile.txt」を返すように変更されているので、テストが成功します。



情報元
Pester (英語)
What is Pester and Why Should I Care? (英語)

関連記事
PowerShell Tools for Visual Studio 2015 : Visual Studio でPowerShell の開発・デバッグ
  1. 2017/01/15(日) 21:49:19|
  2. ツール
  3. | トラックバック:0
  4. | コメント:0
<<リバース実行を用いた gdb によるデバッグ | ホーム | Linux パフォーマンスチェックリスト - CPU 編 ->>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/328-716d42ec
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。