(for Internet Explorer)
← ▼ ▲
↑
DoTest (Tests)
Sub Tests::DoTest( Func as string, bReverse as Boolean )
3. call each "Test_build" in sub folders
など、テスト関数の１つを実行します。
【引数】
Func
bReverse
呼び出す関数の名前
複数の Test.vbs の関数を逆順に呼び出します。(*1)
→ サブフォルダの関数の呼び出し順序
(*1)
(src)
関連
→ Tests::DoAllTest
サブフォルダーにあるテスト・スクリプトで定義されている、Func に指定した名前の
関数もコールバックされます。
True にすると、Test_clean と同じ順序に呼び出します。
← ▼ ▲
SetCur (Tests)
Sub Tests::SetCur( SubSymbol )
デバッグを行うサブテストシンボルを設定します。
Test_current の中から呼び出してください。
指定したサブテストシンボルのテスト項目だけ実施するようになります。
→ Tests::IsCur
Sub Test_current( tests )
tests.SetCur "SubTestA"
End Sub
Sub Test_start( tests )
If tests.IsCur( "SubTestA" ) Then
'// Do SubTestA
End If
If tests.IsCur( "SubTestB" ) Then
'// Do SubTestB
End If
Pass
End Sub
デバッグが済んだら、"" を設定してください。
(src)
テスト
→ T_SubTest\Test_target.vbs#SetCur
← ▼ ▲
IsCur (Tests)
Function Tests::IsCur( SubSymbol )
指定のサブテストシンボル、または "" が設定されているか判定します。
Test_start など（Test_current 以外）の中から呼び出します。
→ Tests::SetCur
(src)
テスト
→ T_SubTest\Test_target.vbs#IsCur
関連
← ▼ ▲
SaveTestResultHtml (Tests)
Sub Tests::SaveTestResultHtml( SavePath as string )
テストの結果を HTML 形式で出力します。
【引数】
SavePath
出力ファイルパス。 Empty のとき "TestResult.html"
ファイル：
TestScript.vbs
(src)
→ T_SomeTests.vbs # T_TestReport
テスト
出力サンプル：
書きかけ
未対応
← ▼ ▲
SaveTestResultCSV (Tests)
Sub Tests::SaveTestResultCSV( SavePath as string )
テストの結果を CSV 形式で出力します。
【引数】
SavePath
出力ファイルパス。 Empty のとき "TestResult.csv"
ファイル：
TestScript.vbs
出力サンプル：
(src)
Test symbol,result,step,path,priority
T_SomeTests,Pass,,TestOfTest2.vbs,1000
T_SampA,Pass,,T_SampA\TestOfTest2.vbs,1000
T_SampB,Fail,Test_check,T_SampB\TestOfTest2.vbs,1000
T_SampC,Skip,Test_setup,T_SampC\TestOfTest2.vbs,1000
→ T_SomeTests.vbs # T_TestReport
テスト
← ▼ ▲
LoadTestResultCSV (Tests)
Sub Tests::LoadTestResultCSV( LoadPath as string )
テストの結果を CSV 形式で出力します。
【引数】
LoadPath
出力ファイルパス。 Empty のとき "TestResult.csv"
ファイル：
TestScript.vbs
(src)
← ▼ ▲
TestScript クラス、g_Test 変数
テストスクリプトを呼び出すクラスです。
グローバル変数 g_Test は、TestScript クラスのオブジェクトを参照しています。
→ TestScript::Finish
→ TestScript::Do_
→ TestScript::Start
テストを開始します。 ログ取りを開始します。
テスト関数を呼び出します。（同じプロセス）
テストを終了します。 ログ取りを終了して集計します。
→ テスト・スクリプトのテスト
(src)
← ▼ ▲
Start (TestScript)
Sub TestScript::Start
テストを開始します。 ログ取りを開始します。
カレントテストのスクリプトがあるフォルダに、TestScript_log.txt
ができます。
(src)
← ▼ ▲
Do_ (TestScript)
Sub TestScript::Do_( vbs_path as string, func as string, param as variant )
テスト関数を呼び出します。（同じプロセス）
【引数】
vbs_path
func
テスト・スクリプトが書かれた VBScript ファイルのパス
呼び出す関数の名前（文字列）
param
関数に渡すパラメータ
Do の後に、アンダーラインがあるので注意してください。（無いとエラーになるため）
(src)
← ▼ ▲
Finish (TestScript)
Sub TestScript::Finish
テストを終了します。 ログ取りを終了して集計します。
TestScript クラスのデストラクタによってテストが終了しますが、
明示的にこの Finish を呼び出して終了させることもできます。
(src)
← ▼ ▲
ExpectedPassConut (TestScript)
Dim TestScript::ExpectedPassConut as integer
予想される Pass の数。
==========================================================
Test Finish (Pass=155, Manual=6, Skip=0, Fail=0)
ExpectedPassConut = 155 [OK]
サンプル
一致した時の表示例
一致しなかったら、[FAIL] と表示されます。
ExpectedPassConut が設定されていないときは、ExpectedPassConut の行を表示しません。
ソース
→ TestScript.vbs
テスト
→ T_Prpt フォルダー
関連
→ RunTestPromptConfigClass
Test.vbs を使うとき
::ExpectedPassConut
← ▼ ▲
UnitTest クラス
Class UnitTest
Public Symbol ' as string
Public ScriptPath ' as string
Public Priority ' as integer
Public Delegate ' as variant
End Class
(src)
Delegate
← ▼ ▲
その他の関数
← ▼ ▲
GetTemporaryTestsObject
Function GetTemporaryTestsObject() as Tests
一時的な Tests オブジェクトを生成し、Test_current を呼び出します。
【引数】
返り値
テスト・オブジェクト
ファイル：
TestScript.vbs
Sub Main( Opt, AppKey )
Dim g : Set g = GetTemporaryTestsObject().CurrentTest.Delegate
RunTestPrompt AppKey.NewWritable( Array( ".", g("PublicFolder") ) )
End Sub
Sub Test_current( tests )
If IsEmpty( tests.CurrentTest.Delegate ) Then
Dim g : Set g = CreateObject( "Scripting.Dictionary" ) : Set tests.CurrentTest.Delegate = g
'[Setting]
'==============================================================================
g("PublicFolder") = "..\Public\FromPackage"
'==============================================================================
End If
End Sub
主に、Test_current で取得できるデータを、RunTestPrompt を呼び出す前に参照するときに使います。
テスト
→ T_TempTests フォルダ
GetTemporaryTestsObject().CurrentTest は、同じファイルの中にある Test_current 関数などの引数
に渡るオブジェクトを指しています。
サンプル
← ▼ ▲
CheckTestErrLevel
Sub CheckTestErrLevel( errorlevel as integer )
VBS プログラムの終了コード（エラーレベル）に問題があったらエラーを発生させる。
【引数】
errorlevel
→ RunProg
エラーレベル（WScript.Quit の引数）
内部で、Pass, Fail, Skip のいずれかを呼び出します。
VBS プログラムは、wscript ではなく cscript で呼び出さないと、正しいエラーレベル
を取得できません。
r = g_sh.Run( "cscript sample.vbs",, True )
CheckTestErrLevel r
(src)
→ 正常終了時の動作
関連
サンプル
RunProg
から VBScript のスクリプトを呼び出して、子プロセスでエラーが発生すると、
親プロセスの RunProg の中からエラーが発生してしまうため、終了コードを取得できません。
Run (Shell)
を使ってください。
→ エラー発生時の動作
参考
← ▼ ▲
g_IsAutoTest
Dim g_IsAutoTest as boolean
自動テストを実行中かどうか。
g_IsAutoTest = True にすると、
Pause
しなくなることがあります。
← ▼ ▲
テスト支援機能 （関数）
テスト対象となるスクリプトが使うもの
← ▼ ▲
Sub T_Test1( Opt, AppKey )
Dim x
Dim cases : Set cases = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1" )
For Each x In cases.Items
T_Test1_main Opt, AppKey, x '// Test.vbs の中では、パラメーターは ( tests, x )
Next
Pass
End Sub
'// ループが増えてもインデントを深くさせなくて済むように、テストの実施は *_main 関数にする
Sub T_Test1_main( Opt, AppKey, x )
Dim w_:Set w_=AppKey.NewWritable( "out" ).Enable()
EchoTestStart "T_Test1"
echo x '// 全てのデータを表示する
FuncA CInt( x("InputData") )
FuncB Replace( x("Answer"), "%Num%", CStr( 12 ) )
End Sub
ReadTestCase
<?xml version="1.0" encoding="Shift_JIS"?>
<TestCases name="common" ExeName="Sample">
<!-- base_data="...\TestCommon_Data.xml#root" -->
<TestCase id="TestCase_for_T_Test1" base_data="#common">
<SubCase name="Number"
InputData = "123"
Answer = "ans%Num%.txt" _comment2= "FilePath with variable"
/>
<SubCase name="Alphabet"
InputData = "ABC"
Answer = "ans2.txt"
/>
</TestCase>
<TestCase id="TestCase_for_T_Test1_sub"> <!-- This is cross parameter -->
<SubCase name="CurrentFolder"
CurrentFolder = "."
StepPath = "Data\"
/>
<SubCase name="SubFolder"
CurrentFolder = "Data"
StepPath = ""
/>
</TestCase>
</TestCases>
サンプル XML ファイル： T_Test1_Data.xml
Function ReadTestCase( XmlPath as string, TestCaseID as string )
as ArrayClass of Dictionary
テストケースが書かれた XML ファイルのデータにアクセスするオブジェクトを返します。
【引数】
XmlPath
TestCaseID
テストケースが書かれた XML ファイルのパス
XML ファイルの中の <TestCase> タグの id 属性の値、または Empty
TestScript.vbs
返り値
テストケースのデータの辞書、または、その配列
ファイル：
テスト
(src)
→ T_TestCaseData.vbs # T_TestCaseData
テストケースのデータの多くは構造体の配列であるため、XML ファイルの書式は、それを想定
して、ある程度決めています。 この標準化により、XML ファイルを見たときにテストケースが
把握しやすくなりますし、テスト・スクリプトのコードも DOM より簡単になります。 書式の詳細は、
下記の DTD を参照してください。
もし、複雑なデータを記述したいときは、一般的な XML ファイルをアクセスする DOM を使って
ください。 参考
サンプル・コード：
T_Test1_Data.xml
TestCase_for_T_Test1
Answer
InputData
TestCases、TestCase、SubCase のタグ名を変えることはできません。
XML タグの中（例：SubCase タグの中） に <!-- --> 形式のコメントは入れたいときは、
XMLの仕様上できないので、ダミーとなる _comment1 などの属性を使って、コメントを
記述します。
返り値は、辞書型を要素に持つ配列（ArrayClass）です。 辞書のキーは、XML 属性の名前です。
データの具体的な値は、下記のサンプル XML ファイルを参照してください。
・得られるデータはすべて文字列型です。
・数値を使うときは、CInt 関数などを使います。
・辞書のキーに指定した名前に対応する XML 属性が存在しないときは、Empty を返します。
・複数のデータをコンマで区切って記述したときは、
・動的に変化するデータを XML ファイルに記述するときは、%Num% のように変数を記述します。
ただし、テスト・スクリプトで Replace 関数や
・#name （HTML の href 属性）のリンク先を得るには、
ArrayFromCSV
などを使います。
テストケースが書かれた XML ファイルの書式
InputData
Answer
TestCase_for_T_Test1
TestCase_for_T_Test1_sub
→ GetMainSetting 関数 (vbsool)
関連
Function ReadTestCase( XmlPath as string, Empty ) as Dictionary
→ LoadXML
ArrayClass
Dictionary
Dictionary
→ TestNums (clib)
TestCases
TestCase
SubCase
SubCase
SubCase
TestCase
TestCase
SubCase
TestCase
TestCases
→ 複数ケースで共通のデータ
→ SetReadTestCase
デバッグ用に、テストケースを指定します
スクリプト・ファイル内のデータ
C言語のテスト番号
T_Test1
T_Test1
T_Test1
→ 複数のケースで共通のデータ
→ クロス・ケース
→ テスト・ケースの選択
→ スクリプトからテストケースを指定する
→ 特殊な XML 属性 (ReadTestCase)
#common
などを使って値を設定してください。
DicItemOfItem
GetHRefBase
を使ってください。
属性値の扱い方
→ DicTable
辞書を使ったテストデータ
ReadTestCase
← ▼ ▲
複数のケースで共通のデータ
[ 親: ReadTestCase ]
複数のテストケースで共通のデータは、
<?xml version="1.0" encoding="Shift_JIS"?>
<TestCases ExeName="Sample" name="common">
<!-- base_data="...\TestCommon_Data.xml#root" -->
<TestCase id="TestCase_for_T_Test1" CommonData1="1" base_data="#common">
<SubCase name="Number"
InputData = "123"
Answer = "ans%Num%.txt" _comment2= "FilePath with variable"
/>
<SubCase name="Alphabet"
InputData = "ABC"
Answer = "ans2.txt"
/>
</TestCase>
</TestCases>
サンプル XML ファイル： T_Test1_Data.xml
#common
common
を指定するか、
TestCase タグの属性に記述できます。
<?xml version="1.0" encoding="Shift_JIS"?>
<TestCase id="TestCase_for_T_Test1">
<SubCase name="Number"
InputData = "123"
Answer = "ans%Num%.txt" _comment2= "FilePath with variable"
CommonData1 = "1" ExeName = "Sample.exe"
/>
<SubCase name="Alphabet"
InputData = "ABC"
Answer = "ans2.txt"
CommonData1 = "1" ExeName = "Sample.exe"
/>
</TestCase>
</TestCases>
上のファイルと下のファイルは、同じテスト・データになります。
CommonData1
特殊な XML 属性
CommonData1
CommonData1
ExeName
ExeName
ExeName
Dim test_common_data : Set test_common_data = ReadTestCase( SearchParent(_
"TestCommon_Data.xml" ), Empty ) '// test_common_data as <TestCases>
start test_common_data( "ExeName" )
<TestCases> タグの内容をリードするときは、下記のようにします。
← ▼ ▲
（旧版） 複数のケースで共通のデータ
Sub T_Test1( Opt, AppKey )
Dim x
Dim xx : Set xx = ReadTestCase( "T_Test1_Data.xml", Empty ) '// xx as <TestCases>
Dim cases : Set cases = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1" )
For Each x In cases.Items
Dic_add x, xx
T_Test1_main Opt, AppKey, x
Next
Pass
End Sub
'// ループが増えてもインデントを深くさせないため、テストの実施は *_main 関数にする
Sub T_Test1_main( Opt, AppKey, x )
echo x
FuncA CInt( x("InputData") )
FuncB x("CommonData1")
End Sub
T_Test1_Data.xml
<?xml version="1.0" encoding="UTF-8"?>
<TestCases
CommonData1 = "Sample.exe"
>
<TestCase id="TestCase_for_T_Test1">
<SubCase name="Number"
InputData = "123"
Answer = "ans%Num%.txt" _comment2= "FilePath with variable"
/>
<SubCase name="Alphabet"
InputData = "ABC"
Answer = "ans2.txt"
/>
</TestCase>
</TestCases>
CommonData1
TestCases
CommonData1
複数のテストケースで共通のデータを、XML ファイルの TestCases タグの属性からリードするときは、
ReadTestCase の第2引数を Empty に指定してください。
サンプル XML ファイル： T_Test1_Data.xml
[ 親: ReadTestCase ]
Empty
T_Test1
T_Test1
T_Test1
複数のテスト・プログラムで共通のデータは、親フォルダーにある共通の XML ファイルからリードして
ください。
Set xx = ReadTestCase( SearchParent("TestCommon_Data.xml"), Empty ) '// xx as <TestCases>
SearchParent
← ▼ ▲
特殊な XML 属性 (ReadTestCase)
ReadTestCase がリードする XML ファイルは、データの記述が冗長にならないように、データの継承や集約
ができる特殊な XML が使えます。
→ base_data 属性
→ plus_attr 属性
→ aggregate 属性
XML 属性を継承します
継承した XML 属性は CSV 形式で追加します
子の XML 要素を集約します
<!ELEMENT TestCases (TestCase*)>
<!ELEMENT TestCase (SubCase*)>
<!ATTLIST TestCases
* CDATA #IMPLIED
name ID #IMPLIED
base_data IDREFS #IMPLIED
plus_attr NMTOKENS #IMPLIED
>
<!ATTLIST TestCase
* CDATA #IMPLIED
id ID #REQUIRED
base_data IDREFS #IMPLIED
plus_attr NMTOKENS #IMPLIED
aggregate IDREFS #IMPLIED
>
<!ATTLIST SubCase
* CDATA #IMPLIED
name ID #IMPLIED
base_data IDREFS #IMPLIED
plus_attr NMTOKENS #IMPLIED
>
テストデータを記述する XML ファイルの DTD
[ 親: ReadTestCase ]
← ▼ ▲
<?xml version="1.0" encoding="Shift_JIS"?>
<TestCases>
<TestCase id="TestCase_for_T_Test1">
<SubCase name="Number" InputData = "123" base_data="#T_Test1_Common"/>
<SubCase name="Alphabet" InputData = "ABC" base_data="#T_Test1_Common"/>
<SubCase name="AlphaNum" InputData = "1AB" Answer="ans2.txt"/>
</TestCase>
<TestCase id="TestCase_for_T_Test1_Common">
<SubCase name="T_Test1_Common" Answer="ans1.txt"/>
</TestCase>
</TestCases>
サンプル XML ファイル： T_Test1_Data.xml
データの多くは共通で、一部のデータだけ変えるときは、base_data 属性を使って属性を継承することが
できます。 base_data 属性は、A タグの href 属性と同じ記述形式です。 別のファイルから継承する
こともできます。
base_data 属性
T_Test1_Common
T_Test1_Common
T_Test1_Common
<?xml version="1.0" encoding="Shift_JIS"?>
<TestCases>
<TestCase id="TestCase_for_T_Test1">
<SubCase name="Number" InputData = "123" Answer="ans1.txt"/>
<SubCase name="Alphabet" InputData = "ABC" Answer="ans1.txt"/>
<SubCase name="AlphaNum" InputData = "1AB" Answer="ans2.txt"/>
</TestCase>
</TestCases>
上のファイルと下のファイルは、同じデータになります。
Answer="ans1.txt"
Answer="ans1.txt"
ファイルパスに、ピリオドを３つ並べると、親フォルダー、親の親フォルダー … と探していきます。
参考
→ パスにピリオドを３つ並べた場合
[ 親: ReadTestCase ]
テスト
→ T_TestCaseData.vbs # [T_BaseTestCaseData]
→ T_TestCaseData.xml # T_BaseTestCaseData_1 など
← ▼ ▲
plus_attr 属性
CSV 形式のデータを、別のタグから追加するときは、plus_attr 属性を使います。
plus_attr 属性の値は、属性の値を CSV 形式で並べます。
<?xml version="1.0" encoding="Shift_JIS"?>
<TestCases>
<TestCase id="TestCase_for_T_Test1">
<SubCase name="a" InputDataA="123" InputDataB="123"
base_data="#T_Test1_Common" plus_attr="InputDataA"/>
</TestCase>
<TestCase id="TestCase_for_T_Test1_Common">
<SubCase name="T_Test1_Common" InputDataB="ABC" InputDataB="ABC"/>
</TestCase>
</TestCases>
サンプル XML ファイル： T_Test1_Data.xml
InputDataA
<?xml version="1.0" encoding="Shift_JIS"?>
<TestCases>
<TestCase id="TestCase_for_T_Test1">
<SubCase name="a" InputDataA="123, ABC" InputDataB="123"/>
</TestCase>
</TestCases>
上のファイルと下のファイルは、同じデータになります。
[ 親: ReadTestCase ]
InputDataA
テスト
→ T_TestCaseData.vbs # [T_BaseTestCaseData]
→ T_TestCaseData2.xml # T_BaseTestCaseData_22 など
InputDataA
←
↓