【发布时间】:2014-01-14 07:54:59
【问题描述】:
我正在使用 PySide 和 Qt 开发各种 GUI 测试库。到目前为止,当测试用例只需要等待一个条件发生(例如信号或超时)时,它工作得非常好,但我的问题是在继续数据验证之前必须等待多个条件发生。
测试运行器在自己的线程中工作,以免过多干扰主线程。等待信号/超时发生在一个事件循环中,这是运行良好的部分(简化示例):
# 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() 信号。但这真的是最好的方法吗?助手还必须检查每个发送者,以便只考虑特定信号的一个“实例”。
【问题讨论】:
-
"那么您有什么建议可以如何进行吗?"我相信你想mock Qt 库。更容易,你有更多的控制权。此外,您当前的测试以某种方式测试 Qt 库,而不是您的代码。
-
@LaszloPapp 例如见
unittest.mock。 -
@Bakuriu:我不确定 mock 与多信号问题有什么关系。
-
@LaszloPapp 如果您模拟 Qt 库,那么您可以简单地检查超时后通过模拟对象调用了哪些信号。
-
@Bakuriu:我一直在研究 QtMock 库,但还没有进展,所以还没有“Qt 友好”的模拟框架。更重要的是,我认为拥有一个基于 qt 事件循环的解决方案而不是一个剧烈的超时会更好。
标签: python qt pyside qt-signals qeventloop