LingoUnit FAQ

[ English | Japanese || Home | Project Summary ]
Last updated: Thu, 1 Nov 2001 16:51:18 +0900

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を参照してください。


メンバー名に"."が含まれる場合の指定方法は?

テストを名前で指定するときは、キャストライブラリ名とメンバー名をドットでつないで、

CastlibName.MemberName

のように指定することができます。

ドットを、メンバー名やキャストライブラリ名で使用する場合は、 バックスラッシュでエスケープしてください。文字列でテストを指定する際のバックスラッシュの次の文字は、その文字自体をあらわします。ドットは"\."、バックスラッシュは、"\\"とします。


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とaddTestSuiteの違いは?

メンバーからTestSuiteを作成する方法は、


script("TestSuite", "LingoUnit").new(member("MyTest", "Main"))

です。これによって、"test"で始まる全てのハンドラからTestCaseが作成され、スイートに追加されます。
つまり、以下の二つは同じことをします。


aTestSuite.addTestSuite(member("MyTest", "Main"))
aTestSuite.addTest(script("TestSuite", "LingoUnit").new(member("MyTest", "Main")))


テストの最初に一度だけsetUpするには?

ライブラリパレットの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)"


デフォルトでShow error dialogチェックボックスをオンにするには?

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を作成するには?

オリジナルの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がフリーズする。

GUITestRunnerを開いたまま作業していると、時々ウィンドウが反応しなくなってしまいます。また、エスケープキーを押したりしても、停止してしまいます(Windows版で確認)。他のXtraムービーでもこのような問題が起こるようです。 普通はウィンドウを閉じてもう一度開けば問題ないのですが、あるいはメッセージウィンドウで

script("WindowProxy", "LingoUnit").kill("GUITestRunner")

と入力しても、強制終了できます。


Shockwave版GUITestRunnerを作成するには?

デモ以外に使い道ないと思いますが、Shockwave版GUITestRunnerの作成手順は以下の通りです。

  1. GUITestRunner.dirを作業用のフォルダにコピーして開く。
  2. LingoUnit.cstをリンクする。
  3. LingoUnitTest.cst等テストで使用するキャストや、sw/empty1.cst等のプレースホルダー用のキャストを、お好みに応じてリンクする。
  4. GUITestRunnerキャストライブラリのWindowProxyスクリプトを開いて、newハンドラでセットしているpFrameworkLinkageの値をFALSEからTRUEに変える。
  5. [...]ボタンのビヘイビアプロパティを開いて、jump toの値(ジャンプ先のマーカ)をselectからswselectに変える。
  6. パブリッシュする。

このShockwaveをローカルで実行する際は、使用する全てのファイルをdswmediaと名前をつけたフォルダに入れておく必要があります。


me.__abstruct__()ってなに?

abstructメソッドの代わりです。
オーバーライドしないとエラーになるようにという意図で、存在しないハンドラを呼ぶようにしてあります。

これは、これがよいスタイルだと主張するものではありません。


thisScriptってなに?

staticメソッドの代わりです。
オブジェクトではなくスクリプトを第一引数にして 呼ばれることがある、ということを表現するために、meではなくthisScriptと しています。たとえば、suiteハンドラは、


on suite thisScript
  ...
end

ですが、これは

aTest = script("MyTestSuite").suite()

のように呼ばれるということを表しています。

これは、これがよいスタイルだと主張するものではありません。


Koseki Kengo <kengo@tt.rim.or.jp >