vbscriptの単体テスト(unit test)

ScriptUnitを使うつもりだったが、WScriptオブジェクトが使えないのと単独のvbsファイル向けだったため、ほかにないか探してみた。

VBSでUnitTest - @yamagh

ここで紹介されていたvbslibが欲しい機能を備えていた。

vbslib - VBScript Portable Library and Utility - Google Project Hosting

vbslibの使い方

TestRunner.wsfにテストするvbsファイルを渡す。

vbsファイルをコマンドラインで指定する場合
cscript TestRunner.wsf test_foo.vbs test_bar.vbs
vbsファイルを標準入力で指定する場合
dir /b test_*.vbs | cscript TestRunner.wsf /stdin+

2つ目のやり方が使いやすく、vbslibのtestフォルダのrun.batがあるのでこれを修正して使うのがいいようだ。

run.bat

@echo off
setlocal
set testrunner=C:\Tools\vbslib-20090627\bin\TestRunner.wsf
set cscript=C:\Windows\SysWow64\cscript.exe
rem dir /b test_*.vbs | cscript %testrunner% //Job:ConsoleTestRunner /stdin+ %*
dir /b test_*.vbs | %cscript% %testrunner% //Job:ConsoleTestRunner /stdin+ %*
endlocal
補足

vbslibはScriptControlを使っているので、32bitで実行させる。
64bit版環境であれば(Windows7など)、C:\Windows\System32\cscript.exeでなく、C:\Windows\SysWow64\cscript.exeを使う。


sample01.vbs (テスト対象のスクリプト)

Function Foo1(para1)
    Foo1 = "Foo1 called. para1:" & para1
End Function

test_01.vbs (テストスクリプト)

' @import sample01.vbs

Sub SetUp()
'    WScript.Echo ""
'    WScript.Echo "SetUp() called."
End Sub
Sub TearDown()
'    WScript.Echo ""
'    WScript.Echo "TearDown() called."
End Sub

Sub TestEqual()
    AssertEqual "1", "1"
    AssertEqualWithMessage "2", "2", "メッセージ"
End Sub

Sub TestEqual2()
    AssertEqual "Foo1 called. para1:あ", Foo1("あ")
End Sub

Sub TestAssert()
    Assert 1 = 1
End Sub
Sub TestAssertNG()
    AssertWithMessage 1 = 2, "1 <> 2"
End Sub

Sub TestAssertSame()
    Dim o
    Set o = CreateObject("Scripting.Dictionary")
    AssertSame o, o
End Sub
Sub TestAssertSameNG()
    Dim o
    Set o = CreateObject("Scripting.Dictionary")
    AssertSameWithMessage o, CreateObject("Scripting.Dictionary"), "expect fail"
End Sub

Sub TestMatch()
    AssertMatch "^Foo1.*あ$", Foo1("あ")
End Sub
Sub TestMatchNG()
    AssertMatchWithMessage "^Foo1.*あ$", Foo1("あ1"), "AssertMatch test."
End Sub

Sub TestAssertFail()
    AssertFail
End Sub
Sub TestAssertFail2()
    AssertFailWithMessage "AssertFail test."
End Sub

Sub TestNG1()
    AssertEqual "1", "11"
End Sub
Sub TestNG2()
    AssertEqualWithMessage "1", "11", "NG test."
End Sub

@アノテーションを使い、テストしたいスクリプトファイルを読み込む。

NGがあれば、cscript TestRunner.wsfの戻り値として1が返る。 すべてOKであれば、0が返る。

これで、wsf用に作ったvbsの関数をテストできる。

作者の方に感謝します!

関連

クラシックASPのコーディング考慮点 その4 - umejanのブログ