PySide と Qt を使用して、ある種の GUI テスト ライブラリを開発しています。これまでのところ、テスト ケースで 1 つの条件 (シグナルやタイムアウトなど) が発生するのを待つ必要がある場合は非常にうまく機能しますが、私の問題は、データ検証に進む前に複数の条件が発生するのを待たなければならないことです。
テスト ランナーは、メイン スレッドをあまり妨害しないように、独自のスレッドで動作します。シグナル/タイムアウトの待機はイベント ループで発生します。これはうまく機能する部分です (簡略化された例)。
# Create a simple event loop and fail timer (to prevent infinite waiting)
loop = QtCore.QEventLoop()
failtimer = QtCore.QTimer()
failtimer.setInterval(MAX_DELAY)
failtimer.setSingleShot(True)
failtimer.timeout.connect(loop.quit)
# Connect waitable signal to event loop
condition.connect(loop.quit) # condition is for example QLineEdit.textChanged() signal
# Perform test action
testwidget.doStuff.emit() # Function not called directly, but via signals
# Wait for condition, or fail timeout, to happen
loop.exec_()
# Verify data
assert expectedvalue == testwidget.readValue()
待機は同期的でなければならないため、イベント ループが有効ですが、複数のシグナルに対しては機能しません。もちろん、複数の条件のいずれかを待つことは可能ですが、複数の条件/シグナルがすべて発生するのを待つことはできません。それで、これをどのように進めるかについて何かアドバイスはありますか?
受信したシグナルの数をカウントし、必要な数に達すると ready() シグナルを発行するヘルパー クラスについて考えていました。しかし、これは本当に最善の方法でしょうか?ヘルパーは、特定のシグナルの「インスタンス」が 1 つだけ考慮されるように、各送信者もチェックする必要があります。