vbscriptの単体テスト(unit test)
ScriptUnitを使うつもりだったが、WScriptオブジェクトが使えないのと単独のvbsファイル向けだったため、ほかにないか探してみた。
ここで紹介されていた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の関数をテストできる。
作者の方に感謝します!