なか日記

一度きりの人生、楽しく生きよう。

PSExpectでTDD(FizzBuzzでいこう)

@biacさんのブログ「PSExpect - PowerShell 用ユニット テスト ライブラリー: biac の それさえもおそらくは幸せな日々@nifty」で紹介されていた
psexpect
を使用してFizzFuzzやってみました。

ファイルの配置

ファイルはこんな感じ。

\PowerShell
 +-PSExpect         … PSExpect本体
 +-FizzBuzz.ps1     … FizzBuzz本体
 +-FizzBuzzTest.ps1 … テストコード

FizzBuzz本体(FizzBuzz.ps1)

まずはFizzBuzz本体。

function global:FizzBuzz([int]$x)
{
    if (($x % 3 -eq 0) -and ($x % 5 -eq 0)){
        return "FizzBuzz"
    }
    if ($x % 3 -eq 0) {
        return "Fizz"
    }
    if ($x % 5 -eq 0) {
        return "Buzz"
    }
    return $x
}

スクリプトファイル内で宣言された関数を別のスクリプトファイルから参照したいので、「global:」というスコープ修飾子を付けてます。

テストコード(FizzBuzzTest.ps1)

で、テストコード。

if (!(Test-Path variable:_TESTLIB)) { .\PSExpect\TestLib.ps1 }
.\FizzBuzz.ps1

function Check([int]$x, $expected)
{
    $result = FizzBuzz($x)
    AssertEqual $expected $result ("arg:" + $x)
    RaiseAssertions
}

Check 1 1
Check 2 2
Check 3 "Fizz"
Check 5 "Buzz"
Check 6 "Fizz"
Check 10 "Buzz"
Check 15 "FizzBuzz"

1行目でPSExpectを読み込んで(見たまんまですねw)、2行目でFizzBuzz本体のスクリプトを読み込ませてます。
PSExpectの使い方としては、AssertEqual等のチェックを書いておいて、RaiseAssertionsでコンソールにAssertionの結果を表示するような感じです。

実行すると、以下の様な結果がコンソールに出力されます。

2010/10/19 22:06:54,SHOULDPASS,PASSED,arg:1
2010/10/19 22:06:54,SHOULDPASS,PASSED,arg:2
2010/10/19 22:06:54,SHOULDPASS,PASSED,arg:3
2010/10/19 22:06:54,SHOULDPASS,PASSED,arg:5
2010/10/19 22:06:54,SHOULDPASS,PASSED,arg:6
2010/10/19 22:06:54,SHOULDPASS,PASSED,arg:10
2010/10/19 22:06:54,SHOULDPASS,PASSED,arg:15

その他いろいろ機能はありそうなのですが、今回はさわりということでこの辺でw