LingoUnit FAQ
Contents
一つのテストケースが実行されるたびに、グローバル変数はクリアされます。メッセージウィンドウで設定した変数がクリアされる点にも注意してください。setUpで設定したグローバル変数を使うことはできます。
on setUp me
global gValue
gValue = 3
end
on testGlobalValue me
global gValue
me.assertEquals(6, gValue * 2)
end
|
Protectableを参照してください。
GUITestRunnerで、[...]ボタンを押して表示されるリストは、単に
メンバー名に"test"を含むスクリプトを選んでいるだけです。
リストに表示させたいときは、"test"を含む名前をつけてください。
名前に"alltests"を含むものは一番上に表示されます。
SimpleTestCollectorを参照してください。
テストを名前で指定するときは、キャストライブラリ名とメンバー名をドットでつないで、
のように指定することができます。
ドットを、メンバー名やキャストライブラリ名で使用する場合は、
バックスラッシュでエスケープしてください。文字列でテストを指定する際のバックスラッシュの次の文字は、その文字自体をあらわします。ドットは"\."、バックスラッシュは、"\\"とします。
put member(1).name
-- "MyTest.1"
put castlib(member(1, "LingoUnit").castlibNum).name
-- "Castlib.5"
script("TestRunner").run("Castlib\.5.MyTest\.1")
|
TestMemberNameParserを参照してください
以下を実行して、ダイアログの各ボタンを試してみてください。デバッガを開いて閉じたときだけ、動作が異なるのがわかると思います。
on debuggerTest
put "main start"
debuggerTestSub()
put "main end"
end
on debuggerTestSub
put "sub start"
a = 1 / 0
put "sub end"
end
|
このようにデバッガを開いて閉じると、エラーから復帰して実行を継続してしまうため、GUITestRunnerがエラーの検出に失敗します。
- addTest(aTest) ... TestのインスタンスをTestSuiteに追加する。
- addTestSuite(testMember) ... メンバーからTestSuiteを作成して、これをTestSuiteに追加する。
メンバーからTestSuiteを作成する方法は、
script("TestSuite", "LingoUnit").new(member("MyTest", "Main"))
|
です。これによって、"test"で始まる全てのハンドラからTestCaseが作成され、スイートに追加されます。
つまり、以下の二つは同じことをします。
aTestSuite.addTestSuite(member("MyTest", "Main"))
aTestSuite.addTest(script("TestSuite", "LingoUnit").new(member("MyTest", "Main")))
|
ライブラリパレットのOneTimeFixtureTemplateを使用します。
suiteハンドラで実行したいテストを追加し、setUpハンドラとtearDownハンドラにスイートの最初と最後に実行したいコードを書きます。
property ancestor
on new me, aTest
ancestor = script("TestSetup", "LingoUnit").new(aTest)
return me
end
on suite thisScript
aTestSuite = script("TestSuite", "LingoUnit").new()
-- add your tests and suites here.
aTestSuite.addTest(script("AllTests", "LingoUnitTests").suite())
aTestSetup = thisScript.new(aTestSuite)
return aTestSetup
end
on setUp me
-- write your additional setUp code here.
-- (This runs at the begining of the suite.)
put "setup"
end
on tearDown me
-- write your additional tearDown code.
-- (This runs at the end of the suite.)
put "teardown"
end
|
ライブラリパレットのRepeatedTestTemplateを使用します。
on suite thisScript
timesRepeat = 3
aTest = script("AllTests", "LingoUnitTests").suite()
aRepeatedTest = script("RepeatedTest", "LingoUnit").new(aTest, timesRepeat)
aTestSuite = script("TestSuite", "LingoUnit").new()
aTestSuite.addTest(aRepeatedTest)
return aTestSuite
end
|
Reflection(introspection)の実装に限界があるためです。Lingoでは、あるオブジェクトが、どのキャストライブラリのどのメンバーから作成されたのかを確実に知る方法がありません(と思います)。たとえば、
script("TestRunner").run(script("MyTest").new("test1"))
|
とあった場合、TestRunnerに渡されるのはオブジェクトであり、渡されたオブジェクトがどのメンバーから作成されたのかTestRunnerにはわかりません。次のような場合も同様です。
aTestSuite.addTest(script("MyTest").new("test1"))
|
テストを再実行するには、どのメンバーがそのテストケースオブジェクトを作成したかを知る必要があります。上のようにオブジェクトが直接TestRunnerに渡るときは、メンバーがわからないので再実行できません。テスト結果が<offspring ...>のように表示されているときは、メンバーを取得することができなかったことを示しています。
メンバーが取得可能なのは、以下のような場合です。
-- 文字列で指定
script("TestRunner").run("MyTest")
-- メンバーを渡す
script("TestRunner").run(member("MyTest"))
aTestSuite.addTestSuite(member("MyTest"))
|
このような場合は、テストに失敗しても再実行できます。
オブジェクトの作成時にメンバーを記録しているからです。
あるいは、明示的にメンバーを指定することもできます
(そこまでする必要があるかはわかりませんが・・)。
aTestCase = script("MyTest").new("test1")
script("TestRunner").run(aTestCase, script("VerboseReport").new())
-- "Running: test1 (<offspring "MyTest" 11 1ff02c>)"
aTestCase = script("MyTest").new("test1")
aTestCase.setMember(member("MyTest"))
script("TestRunner").run(aTestCase, script("VerboseReport").new())
-- "Running: test1 (CastlibName.MyTest)"
|
GUITestRunner.dirを開いて、チェックボックスに割り当てられているビヘイビアのプロパティを変更してください。
オンにした場合、the alertHookシステム変数は一切変更されません。
一番簡単な方法は、Testをrunすることです。
aTestResult = script("MyTest", "Castlib").run()
if aTestResult.wasSuccessful() then
put "OK"
end if
aTestResult = script("AllTests", "Castlib").suite().run()
if aTestResult.wasSuccessful() then
put "OK"
end if
aTestResult = script("TestResult", "LingoUnit").new()
script("MyTest", "Castlib").run(aTestResult)
script("AllTests", "Castlib").suite().run(aTestResult)
if aTestResult.wasSuccessful() then
put "OK"
end if
|
オリジナルのReportを作成するには、ライブラリパレットのReportTemplateを使用してください。
property ancestor
on new me, aWriter
ancestor = script("BaseReport", "LingoUnit").new(aWriter)
return me
end
on startTest me, aTest
me.println("Running: " & aTest.toString())
end
on addError me, aTest, anExceptionError
me.println("Error: " & aTest.toString() & ": " & anExceptionError.toString())
end
on addFailure me, aTest, anExceptionFailure
me.println("Failure: " & aTest.toString() & ": " & anExceptionFailure.toString())
end
|
GUITestRunnerを開いたまま作業していると、時々ウィンドウが反応しなくなってしまいます。また、エスケープキーを押したりしても、停止してしまいます(Windows版で確認)。他のXtraムービーでもこのような問題が起こるようです。
普通はウィンドウを閉じてもう一度開けば問題ないのですが、あるいはメッセージウィンドウで
script("WindowProxy", "LingoUnit").kill("GUITestRunner")
|
と入力しても、強制終了できます。
デモ以外に使い道ないと思いますが、Shockwave版GUITestRunnerの作成手順は以下の通りです。
- GUITestRunner.dirを作業用のフォルダにコピーして開く。
- LingoUnit.cstをリンクする。
- LingoUnitTest.cst等テストで使用するキャストや、sw/empty1.cst等のプレースホルダー用のキャストを、お好みに応じてリンクする。
- GUITestRunnerキャストライブラリのWindowProxyスクリプトを開いて、newハンドラでセットしているpFrameworkLinkageの値をFALSEからTRUEに変える。
- [...]ボタンのビヘイビアプロパティを開いて、jump toの値(ジャンプ先のマーカ)をselectからswselectに変える。
- パブリッシュする。
このShockwaveをローカルで実行する際は、使用する全てのファイルをdswmediaと名前をつけたフォルダに入れておく必要があります。
abstructメソッドの代わりです。
オーバーライドしないとエラーになるようにという意図で、存在しないハンドラを呼ぶようにしてあります。
これは、これがよいスタイルだと主張するものではありません。
staticメソッドの代わりです。
オブジェクトではなくスクリプトを第一引数にして
呼ばれることがある、ということを表現するために、meではなくthisScriptと
しています。たとえば、suiteハンドラは、
on suite thisScript
...
end
|
ですが、これは
aTest = script("MyTestSuite").suite()
|
のように呼ばれるということを表しています。
これは、これがよいスタイルだと主張するものではありません。
Koseki Kengo <kengo@tt.rim.or.jp
>