Qtブログ(日本語)

【Squishノウハウ】snooze()を回避し、時間可変の同期を使用する

作成者: Qt Group 日本オフィス|Mar 24, 2023 12:00:00 AM

この記事はAvoiding snooze(): Favoring Variable-Time Synchronizationの抄訳です。

GUITテスト自動化ツールSquishでは、固定時間同期(snooze)または可変時間同期(waitFor、waitForObject、waitForObjectExists)を使用して、テストケースをテスト対象アプリケーション(AUT)に同期することが可能です。しかし、固定時間同期は可能であれば避け、可変時間同期を優先する必要があります。その理由は以下の通りです:

  • あるシステムでの動作にかかる正しい時間は、別のシステムでの同じ動作にかかる正しい時間ではないかもしれません。
  • 固定時間のスヌーズは、特にループで発生する場合、テスト実行時間全体を増加させます。
  • 固定時間スヌーズは人工的なものであり、同じシステムで発生する可能性のあるアプリケーションの変動性能を反映したり適応したりするものではありません。

ここでは、固定時間同期のみを使用するスクリプトの例と、それを可変時間同期を使用するスクリプトに再設計する3つのユースケースを紹介します。これらの例は、Squish GUI Testerフレームワークで作成されたGUIテストスクリプトを使用して同期を実現しています。

同期とは何か、なぜ必要なのか?

アプリケーションとテストスクリプトの同期は、テスト(およびそれを実行するツール)の実行速度が速すぎて、アプリケーションのツールキットがついていけなくなることを防ぐために必要です。同期をとることで、AUTはスクリプトの次の行に移る前に、イベントを処理するのに必要な時間を確保することができます。

snooze()ステートメントの挿入は、AUTとスクリプトを同期させる最も簡単な方法ですが、上記の理由から、堅牢なテストを作成するには不十分であることがよくあります。それでは、いくつかの例を見てみましょう。

ユースケース1:オブジェクトの出現を待つ

Pythonのサンプルスクリプトの例:
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に置き換えたものです。

ユースケース2:データの読み込みや処理の待ち時間

データの読み込みや処理が必要な複雑なオブジェクトを待っている場合は、waitForObjectの後に短いsnooze()を使うかもしれませんが、データが完全に読み込まれた後にAUTで変化する別の条件やプロパティがある場合は、代わりにwaitFor(that)を使うことができます。以下はその例です:

clickButton(waitForObject(names.open_PushButton))
webView = waitForObject(names.webView, 30000)
waitFor(lambda: webView.loadProgress == 100, 10000)

ユースケース3:オブジェクトがユーザーとのインタラクションの準備ができていないことを確認する

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)

Conclusion

可変時間同期アプローチは、特にクロスプラットフォームのGUIテストにおいて、その堅牢性と柔軟性のために推奨されています。ここでは、スクリプトにハードコードされた遅延を回避するために、Squishがどのような方法を提供しているかを見てきました。snooze()による固定時間同期を回避することで、テストの全体的な実行時間を改善し、結果をより早く得ることができます。

おわりに

以上が、記事の内容となります。

SquishをはじめとするQtのQA(品質保証)ツールにご興味がおありの方は、Qt JapanのEメールアドレスjapan@qt.ioまでお気軽にご連絡ください。

概要のご説明から詳細な技術的相談、また無償のツールトライアルのご案内も行っております。