如何在使用 pytest-qt 测试 PyQt5 应用程序时显示 GUI?

per*_*kin 2 python user-interface pytest pyqt5

我是新来PyQt的,但我要使用pytestpytest-qt插件来测试我PyQt5的应用程序。我有一些使用SWTBot和 的Java GUI 测试经验RCPTT,在那里我可以实时查看在测试期间控件和整个 GUI 发生的情况。我想用我的新 python 工具有这样的行为,但似乎pytest-qt以某种背景方式测试 GUI。所有代码都按我的预期工作,但在测试期间我看不到 GUI。代码很简单,如教程中所示:

from tests.test import MyApp
from time import sleep
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *


def test_myapp(qtbot):
    app = QApplication([])
    window = MyApp()
    # window.show()
    # app.exec_()
    qtbot.addWidget(window)
    qtbot.mouseClick(window.buttonBox.buttons()[0], Qt.LeftButton)
    sleep(5)
    assert window.label.text() == 'accept'
Run Code Online (Sandbox Code Playgroud)

如果我取消注释该window.show()行(他们在教程中这样做),我会看到一个奇怪的窗口,其中包含冻结的背景:

奇怪的窗口

我想理论上可以显示界面,因为我知道 PyQt5 从 python shell ( more ) 工作:

例如,您可以从 Python shell 提示创建小部件,与它们交互,并且仍然能够输入其他 Python 命令

但我不知道如何用 pytest-qt 实现它

per*_*kin 5

这段代码按我的要求工作,它正确显示了界面。关键是qtbot.waitForWindowShown(window)线。

from tests.test import MyApp
from time import sleep
from PyQt5.QtCore import *


def test_myapp(qtbot):
    window = MyApp()
    qtbot.addWidget(window)
    window.show()
    qtbot.waitForWindowShown(window)
    sleep(3)
    qtbot.mouseClick(window.buttonBox.buttons()[0], Qt.LeftButton)
    assert window.label.text() == 'accept'
    qtbot.stopForInteraction()
Run Code Online (Sandbox Code Playgroud)