複数のテストスクリプトと、それをまとめるスクリプト

用意したテストデータを使ってテストを行うPowerShellスクリプトを用意する。先程用意した4種類のデータは次のように4つのスクリプトで動作を確認できる。

test001.ps1

$n = '001'
$d = 'zip'
$f = New-TemporaryFile

.\csv2tsv.exe .\data\${d}.csv > $f

C:\Windows\System32\fc.exe .\data\${d}.tsv $f > $null

if ($?) {
    echo "テスト${n}: 成功"
}
else {
    echo "テスト${n}: 失敗"
}

Remove-Item $f

test002.ps1

$n = '002'
$d = 'doublequotes'
$f = New-TemporaryFile

.\csv2tsv.exe .\data\${d}.csv > $f

C:\Windows\System32\fc.exe .\data\${d}.tsv $f > $null

if ($?) {
    echo "テスト${n}: 成功"
}
else {
    echo "テスト${n}: 失敗"
}

Remove-Item $f

test003.ps1

$n = '003'
$d = 'spaces'
$f = New-TemporaryFile

.\csv2tsv.exe .\data\${d}.csv > $f

C:\Windows\System32\fc.exe .\data\${d}.tsv $f > $null

if ($?) {
    echo "テスト${n}: 成功"
}
else {
    echo "テスト${n}: 失敗"
}

Remove-Item $f

test004.ps1

$n = '004'
$d = 'empty'
$f = New-TemporaryFile

.\csv2tsv.exe .\data\${d}.csv > $f

C:\Windows\System32\fc.exe .\data\${d}.tsv $f > $null

if ($?) {
    echo "テスト${n}: 成功"
}
else {
    echo "テスト${n}: 失敗"
}

Remove-Item $f

さて、問題はここからだ。Makefileから直接この4つのテストスクリプトを呼び出す仕組みにしたとしよう。そうすると、例えばテストコードが100個など大量になってきたときに、Makefileに100行のテストコード呼び出し処理が記述されることになる。あまり見通しのよい書き方とは言えない。

そこで、ほかのテストスクリプトを呼び出してすべてのテストを実施するスクリプトを用意し、Makefileからはそのスクリプトのみを実行するといった仕組みにする。次のようなスクリプトを用意して、ほかのテストスクリプトを実行させる。

test.ps1

##########################################################################
# テスト数
##########################################################################
$TESTS = 4

##########################################################################
# テスト実施
##########################################################################
$res = $true
1..$TESTS |
% {
    $n = $_.ToString("000")
    Invoke-Expression ./tests/test${n}.ps1

    if (-Not $?) {
        $res = $false
    }
}

##########################################################################
# テスト結果出力
##########################################################################
if ($res) {
    echo '全テストをパス'
}
else {
    echo 'テスト失敗'
    exit -1
}

PowerShellスクリプト自体の説明はここでは行わないが、上記のスクリプトはtestsディレクトリ以下のテストスクリプトを順番に実行し、1つでも失敗がればこのスクリプトの終了コードも失敗として処理する内容になっている。