この記事はAvoiding snooze(): Favoring Variable-Time Synchronizationの抄訳です。
GUITテスト自動化ツールSquishでは、固定時間同期(snooze)または可変時間同期(waitFor、waitForObject、waitForObjectExists)を使用して、テストケースをテスト対象アプリケーション(AUT)に同期することが可能です。しかし、固定時間同期は可能であれば避け、可変時間同期を優先する必要があります。その理由は以下の通りです:
ここでは、固定時間同期のみを使用するスクリプトの例と、それを可変時間同期を使用するスクリプトに再設計する3つのユースケースを紹介します。これらの例は、Squish GUI Testerフレームワークで作成されたGUIテストスクリプトを使用して同期を実現しています。
アプリケーションとテストスクリプトの同期は、テスト(およびそれを実行するツール)の実行速度が速すぎて、アプリケーションのツールキットがついていけなくなることを防ぐために必要です。同期をとることで、AUTはスクリプトの次の行に移る前に、イベントを処理するのに必要な時間を確保することができます。
snooze()ステートメントの挿入は、AUTとスクリプトを同期させる最も簡単な方法ですが、上記の理由から、堅牢なテストを作成するには不十分であることがよくあります。それでは、いくつかの例を見てみましょう。
clickButton(waitForObject(names.open_PushButton))
# webViewが表示されるまでに25~30秒かかる
snooze(25)
webView = waitForObject(names.webView)
# ウェブコンテンツの読み込みに最大10秒かかる
snooze(10)
最初のスヌーズは、次のwaitForObject()呼び出しのタイムアウトを回避するための遅延を追加し、ウェブビューが表示されてGUI操作ができるようになるのを待ちます。このスクリプトでは、ウェブビューが25秒以内に表示できるようになることを想定しています。しかし、これは堅牢でしょうか、あるいは正確と言えるでしょうか?
以下の例では、その代わりに、waitForObjectのタイムアウトを(かなり)長くすることができるようになりました。その量はミリ秒単位で、このwaitForObjectのタイムアウトは、デフォルトの20秒ではなく、30秒になりました。
clickButton(waitForObject(names.open_PushButton))
webView = waitForObject(names.webView, 30000)
# ウェブコンテンツの読み込みに最大10秒かかる
snooze(10)
これは、柔軟性に欠け、脆弱なsnooze()を、より安全なpaddingに置き換えたものです。データの読み込みや処理が必要な複雑なオブジェクトを待っている場合は、waitForObjectの後に短いsnooze()を使うかもしれませんが、データが完全に読み込まれた後にAUTで変化する別の条件やプロパティがある場合は、代わりにwaitFor(that)を使うことができます。以下はその例です:
clickButton(waitForObject(names.open_PushButton))
webView = waitForObject(names.webView, 30000)
waitFor(lambda: webView.loadProgress == 100, 10000)
findObject()の前にsnooze()を行うのは、あるGUIオブジェクトが無効か不可視かを確認する必要がある場合にあり得るかもしれません。
snooze(10)
goButton = findObject(names.goButton)
test.verify(goButton.enabled == False)
この場合、waitForObjectは、オブジェクトの可視化と有効化を必要とするため、使用できません。最初の2つの文は、タイムアウトが十分長ければ、代わりにwaitForObjectExists()で置き換えることができます:
goButton = waitForObjectExists(names.goButton)
test.verify(goButton.enabled == False)
可変時間同期アプローチは、特にクロスプラットフォームのGUIテストにおいて、その堅牢性と柔軟性のために推奨されています。ここでは、スクリプトにハードコードされた遅延を回避するために、Squishがどのような方法を提供しているかを見てきました。snooze()による固定時間同期を回避することで、テストの全体的な実行時間を改善し、結果をより早く得ることができます。
以上が、記事の内容となります。
SquishをはじめとするQtのQA(品質保証)ツールにご興味がおありの方は、Qt JapanのEメールアドレスjapan@qt.ioまでお気軽にご連絡ください。
概要のご説明から詳細な技術的相談、また無償のツールトライアルのご案内も行っております。