【问题标题】:How to properly tear down a QApplication after every unit test in pyqt5?pyqt5 中的每个单元测试后如何正确拆除 QApplication?
【发布时间】:2022-11-04 03:34:48
【问题描述】:

我正在尝试为 pyqt5 应用程序进行一些单元测试。问题是我不能在一个测试套件中运行多个测试,因为我没有正确清理应用程序和每个测试的结束。


class MainWindowTest(QMainWindow):

    def __init__(self, widgetTypeUnderTest=None, model=None):
        super().__init__()
        self.widgetTypeUnderTest = widgetTypeUnderTest
        self.model = model

        # setting title
        self.setWindowTitle("AccosTest")
        self.setGeometry(100, 100, 500, 600)

        self.mainWindowLayout = QHBoxLayout()

        # container widget for everything else
        widget = QWidget()
        widget.setLayout(self.mainWindowLayout)
        self.setCentralWidget(widget)

        self.show()


class Tests(unittest.TestCase):

    def setUp(self) -> None:
        self.app = QApplication(sys.argv)

    def tearDown(self) -> None:
        self.app.exit()

    def test(self):
        mainWindow = MainWindowTest()

    def test2(self):
        mainWindow = MainWindowTest()


单独运行 Tests.test1Tests.test2 会执行所需的操作,尽管这可能是因为第二个 QApplication 尚未启动。当同时运行两个测试时,我得到一个段错误。

是否有人知道在每次测试后正确拆除QApplication 的正确命令,因为self.app.exit() 似乎没有起到作用。谢谢!

编辑

你认为更好的策略是有两个线程。一个会启动主循环sys.exit(self.app.exec()),另一个会等待一段时间然后调用exit?

【问题讨论】:

  • 不...更好的策略是在测试套件期间保持相同的应用程序打开

标签: qt unit-testing user-interface pyqt5


【解决方案1】:

通常不需要重新创建 QApplication,即使是为了测试(除非你需要对应用程序启动或退出时程序的行为进行多次测试)。

您可以使用instance() 获取当前现有的 QApplication:

    def setUp(self) -> None:
        self.app = QApplication.instance() or QApplication.(sys.argv)

在您确实需要重新启动应用程序的极少数情况下,您需要确保之前的应用程序已真的被退出。由于这假定 exec() 已被调用,因此您可以销毁 app 引用并重新创建它。

请注意,您不能在主线程之外(或者,准确地说,在创建第一个应用程序的线程之外)创建另一个应用程序。

【讨论】:

    猜你喜欢
    • 2011-06-20
    • 2019-01-28
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多