←
▼
▲
Sub TestScript::Finish
テストを終了します。 ログ取りを終了して集計します。
TestScript クラスのデストラクタによってテストが終了しますが、
明示的にこの Finish を呼び出して終了させることもできます。
(src)
←
▼
▲
Class UnitTest
Public Symbol ' as string
Public ScriptPath ' as string
Public Priority ' as integer
Public Delegate ' as variant
End Class
(src)
←
▼
▲
←
▼
▲
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 関数などの引数
に渡るオブジェクトを指しています。
サンプル
←
▼
▲
Sub CheckTestErrLevel( errorlevel as integer )
VBS プログラムの終了コード(エラーレベル)に問題があったらエラーを発生させる。
【引数】
errorlevel
関連
エラーレベル(WScript.Quit の引数)
内部で、Pass, Fail, Skip のいずれかを呼び出します。
VBS プログラムは、wscript ではなく cscript で呼び出さないと、正しいエラーレベル
を取得できません。
r = RunProg( "cscript sample.vbs", "" )
CheckTestErrLevel r
サンプル
(src)
←
▼
▲
Dim g_IsAutoTest as boolean
自動テストを実行中かどうか。
g_IsAutoTest = True にすると、
しなくなることがあります。
←
▼
▲
テスト対象となるスクリプトが使うもの
←
▼
▲
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
<?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 属性)のリンク先を得るには、
などを使います。
テストケースが書かれた XML ファイルの書式
InputData
Answer
TestCase_for_T_Test1
TestCase_for_T_Test1_sub
関連
Function ReadTestCase( XmlPath as string, Empty ) as Dictionary
→ TestNums (clib)
TestCases
TestCase
SubCase
SubCase
SubCase
TestCase
TestCase
SubCase
TestCase
TestCases
デバッグ用に、テストケースを指定します
スクリプト・ファイル内のデータ
C言語のテスト番号
T_Test1
T_Test1
T_Test1
などを使って値を設定してください。
を使ってください。
属性値の扱い方
辞書を使ったテストデータ
←
▼
▲
複数のテストケースで共通のデータは、
<?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
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
Empty
T_Test1
T_Test1
T_Test1
複数のテスト・プログラムで共通のデータは、親フォルダーにある共通の XML ファイルからリードして
ください。
Set xx = ReadTestCase( SearchParent("TestCommon_Data.xml"), Empty ) '// xx as <TestCases>
←
▼
▲
ReadTestCase がリードする XML ファイルは、データの記述が冗長にならないように、データの継承や集約
ができる特殊な XML が使えます。
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
←
▼
▲
<?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 属性と同じ記述形式です。 別のファイルから継承する
こともできます。
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"
ファイルパスに、ピリオドを3つ並べると、親フォルダー、親の親フォルダー … と探していきます。
参考
テスト
→ T_TestCaseData.vbs # [T_BaseTestCaseData]
→ T_TestCaseData.xml # T_BaseTestCaseData_1 など
←
▼
▲
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>
上のファイルと下のファイルは、同じデータになります。
InputDataA
テスト
→ T_TestCaseData.vbs # [T_BaseTestCaseData]
→ T_TestCaseData2.xml # T_BaseTestCaseData_22 など
InputDataA
←
▼
▲
TestCase タグの子の SubCase タグに、別の TestCase タグの子を追加するときは、
aggregate 属性を使います。
<?xml version="1.0" encoding="Shift_JIS"?>
<TestCases>
<TestCase id="TestCase_for_T_Test1" aggregate="#TestCase_Common">
<SubCase name="a" InputDataA="123" InputDataB="123"/>
</TestCase>
<TestCase id="TestCase_for_T_Test2" aggregate="#TestCase_Common">
<SubCase name="b" InputDataA="123" InputDataB="ABC"/>
</TestCase>
<TestCase id="TestCase_Common">
<SubCase name="c" InputDataA="ABC" InputDataB="ABC"/>
</TestCase>
</TestCases>
サンプル XML ファイル: T_Test1_Data.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<TestCases>
<TestCase id="TestCase_for_T_Test1">
<SubCase name="a" InputDataA="123" InputDataB="123"/>
<SubCase name="c" InputDataA="ABC" InputDataB="ABC"/>
</TestCase>
<TestCase id="TestCase_for_T_Test2">
<SubCase name="b" InputDataA="123" InputDataB="ABC"/>
<SubCase name="c" InputDataA="ABC" InputDataB="ABC"/>
</TestCase>
</TestCases>
上のファイルと下のファイルは、同じデータになります。
TestCase_Common
TestCase_Common
TestCase_Common
テスト
→ T_TestCaseData.vbs # [T_BaseTestCaseData]
→ T_TestCaseData.xml # T_AggregateTestCaseData_1 など
SubCase
SubCase
SubCase
←
▼
▲
Sub T_Test1( Opt, AppKey )
Dim x, y, mix
Dim cases_x : Set cases_x = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1_x" )
Dim cases_y : Set cases_y = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1_y" )
Set mix = CreateObject( "Scripting.Dictionary" )
For Each y In cases_y.Items
For Each x In cases_x.Items
mix.RemoveAll : Dic_add mix, x : Dic_add mix, y
T_Test1_main Opt, AppKey, mix
Next
Next
Pass
End Sub
'// ループが増えてもインデントを深くさせないため、テストの実施は *_main 関数にする
Sub T_Test1_main( Opt, AppKey, x )
echo x
FuncA x("InputData"), ReadFile( x("CurrentFolder") +"\file.txt" )
End Sub
<?xml version="1.0" encoding="UTF-8"?>
<TestCases>
<TestCase id="TestCase_for_T_Test1_x">
<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_y"> <!-- This is cross case -->
<SubCase name="CurrentFolder"
CurrentFolder = "."
StepPath = "Data\"
/>
<SubCase name="SubFolder"
CurrentFolder = "Data"
StepPath = ""
/>
</TestCase>
</TestCases>
InputData
CurrentFolder
サンプル XML ファイル: T_Test1_Data.xml
テストケースの値が、表の縦軸と横軸にあり、表の全てをテストする場合は、下記のように二重ループに
して、Dic_add を使ってテストデータを結合します。
T_Test1
T_Test1
T_Test1
Sub T_Test1( Opt, AppKey )
Set t = CreateObject( "Scripting.Dictionary" )
For Each endian In Array( "LittleEndian", "BigEndian" )
For Each language In Array( "VBScript", "C" )
t("Endian") = endian
t("Language") = language
T_Test1_Main t
Next
Next
Pass
End Sub
'// ループが増えてもインデントを深くさせないため、テストの実施は *_Main 関数にする
Sub T_Test1_Main( Opt, AppKey, x )
echo x
FuncA x("Endian"), x("Language")
End Sub
←
▼
▲
Sub T_Test1( Opt, AppKey )
Dim x
Dim cases : Set cases = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1" )
Set x = cases.LookUpDic( "name", "Alphabet" )
T_Test1_main Opt, AppKey, x
Pass
End Sub
SubCase タグの中から、特定のタグだけ選択するときは、ArrayClass の LookUpDic を使ってください。
<?xml version="1.0" encoding="Shift_JIS"?>
<TestCases>
<TestCase id="TestCase_for_T_Test1">
<SubCase name="Number"
InputData = "123"
Answer = "ans%Num%.txt"
/>
<SubCase name="Alphabet"
InputData = "ABC"
Answer = "ans2.txt"
/>
</TestCase>
</TestCases>
サンプル XML ファイル: T_Test1_Data.xml
"name", "Alphabet"
←
▼
▲
Sub T_Test1( Opt, AppKey )
Dim x, y
Dim cases : Set cases_x = ReadTestCase( "T_Test1_Data.xml", "TestCase_for_T_Test1" )
For Each x In cases_x.Items
For Each y In Array( 2, 3 )
x("y") = y
T_Test1_main Opt, AppKey, x
x.Remove "y"
Next
Next
Pass
End Sub
'// ループが増えてもインデントを深くさせないため、テストの実施は *_main 関数にする
Sub T_Test1_main( Opt, AppKey, x )
echo x
FuncA x("InputData"), ReadFile( x("y") +"\file.txt" )
End Sub
テストケースの値を XML ファイルではなく、スクリプトに埋め込む場合は、下記のように代入します。
x("y") = y
( 2, 3 )
T_Test1
T_Test1
T_Test1
x("y")
x.Remove "y"