我将为使用PyQt(或PySide)作为GUI库的pyqt应用程序开发一些功能测试。测试使用Unittest和Qttest库,如许多资源中所报告的,例如此stackoverflow问题:Unit and functional testing a PySide-based application? 对于主窗口,一切正常,代码模拟完美的键盘类型和鼠标点击和移动,但“魔鬼在细节中”...并且此方法不适用于QMessageBox。
在主窗口的类中,为了在打开文件时管理IOError
,我初始化了一个QMessageBox:
self.IOErrMsgBox = QtGui.QMessageBox()
self.IOErrMsgBox.setText("<b>Error</b>")
self.IOErrMsgBox.setInformativeText("""
<p>There was an error opening
the project file:
%s.</p>"""%(path,))
self.IOErrMsgBox.setStandardButtons(QtGui.QMessageBox.Ok)
self.IOErrMsgBox.setDefaultButton(QtGui.QMessageBox.Ok)
self.IOErrMsgBox.exec_()
为了测试它是如何工作的,在功能测试中我有:
def test__open_project(self):
self.MainWin._project_open(wrong_path, flag='c')
# the function that handles the exception
# and initializes the QMessageBox.
IOErrMsgBox = self.MainWin.IOErrMsgBox
# Reference to the initialized QMessageBox.
self.assertIsInstance(IOErrMsgBox, QMessageBox)
okWidget = self.MainWin.IOErrMsgBox.button(IOErrMsgBox.Ok)
QTest.mouseClick(okWidget, Qt.LeftButton)
或者,在altenative:
def test__open_project(self):
#... some code, exactly like previous example except for last row...
QTest.keyClick(okWidget, 'o', Qt.AltModifier)
但没有人工作......并且没有点击确定按钮,我可以用我的鼠标指针执行:(
有什么建议吗?
答案 0 :(得分:2)
问题一般是关于如何测试模态对话框。
包括QMessageBox在内的任何模态对话框在关闭之前都不会从exec_()
返回,因此第二个代码框中的测试代码可能永远不会被执行。
您可以show()
它(使其成为非模态),然后按照您的代码,但不要忘记关闭并删除对话框。
或者您使用计时器并安排点击“确定”按钮(类似于Test modal dialog with Qt Test)。这是一个例子:
from PySide import QtGui, QtCore
app = QtGui.QApplication([])
box = QtGui.QMessageBox()
box.setStandardButtons(QtGui.QMessageBox.Ok)
button = box.button(QtGui.QMessageBox.Ok)
QtCore.QTimer.singleShot(0, button.clicked)
box.exec_()