我正在使用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()
等待必须是同步的,所以一个事件循环是可行的,但它不能用于多个信号。当然可以等待多个条件中的任何一个,但不是等待多个条件/信号全部发生。有什么建议可以继续吗?在
我在考虑一个helper类,它统计接收到的信号数,然后在达到所需计数后发出ready()-信号。但这真的是最好的方法吗?助手还必须检查每个发送方,以便只考虑特定信号的一个“实例”。在
我个人会把所有必要的信号连接到相应的信号处理程序,也就是aka。插槽。在
他们都会标记他们的发射是“完成”的,并且可能会检查整体情况是否“完成”,在每个信号处理程序设置自己的“完成”之后,可能会有一个全局“完成”检查,如果这足够,他们将发出“全局完成”信号。在
然后,您还可以最初连接到“全局完成”信号,当相应的信号处理程序被触发时,您将知道该操作已完成,除非同时条件发生更改。在
理论设计完成后,你会得到这样的东西(伪代码)
您可能还可以通过只有两个信号和插槽来简化,即:一个用于根据传递的参数“标记”本地信号完成的本地done操作,然后还有“global done”信号和插槽。在
不同的是语义,是使用带一个信号和时隙的参数,还是使用没有参数的多个信号和时隙的参数,但原理上是相同的。在
有一组(object,signal index)对,您希望得到信号。
在等待开始之前复制集合。
在插槽中,从复制的列表中删除(sender(),senderSignalIndex())元素。如果列表是空的,你就知道你完成了。
该解决方案的好处是可移植性:该方法在PysEnEm和 C++中都有效。在
在C++中,^ {registerSignal
时跳过此方法代码,因为它需要一个原始方法名。在由于在
registerSignal
中调用的indexOfMethod
需要一个规范化的签名,connect
方法将其规范化。在我最终实现了一个相当简单的helper类。它有一组用于等待信号,另一组用于接收信号。每个可等待的信号都连接到一个插槽。插槽将
sender()
添加到就绪集合,一旦集合大小匹配,就发出ready
信号。在如果有人感兴趣,我最后要做的是:
clear
函数几乎没有必要,但允许重用类实例。在相关问题 更多 >
编程相关推荐