测试PyQt应用程序 - QWidget:必须在QWidget之前构建QApplication

3

我有一个pyqt应用程序,想要为测试这个应用程序编写测试脚本。

在独立测试期间,我能够构建qapplication。但是,在使用pytest编写我的unittestcases时,不确定如何创建此对象。

import sys

from PyQt5.QtWidgets import QApplication, QDialog, QGridLayout, QLabel, QLineEdit


class Example(QDialog):
    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs)            
        self.initUI()

    def initUI(self):
        grid = QGridLayout(self)
        a1 = QLabel('alphanumeric characters')
        a2 = QLabel('alphanumeric characters')

        grid.addWidget(QLabel('Name'), 0, 0)
        grid.addWidget(QLineEdit(), 0, 1)
        grid.addWidget(QLabel('Street1'), 1, 0)
        grid.addWidget(QLineEdit(), 1, 1)
        grid.addWidget(QLabel('Street2'), 2, 0)
        grid.addWidget(QLineEdit(), 2, 1)
        grid.addWidget(QLabel('City'), 3, 0)
        grid.addWidget(QLineEdit(), 3, 1)

        grid.addWidget(QLabel('only alphanumeric'), 0, 2, 4, 1)

        self.setGeometry(500, 500, 500, 500)
        self.setWindowTitle('Lines')
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
#     ex.show()
    sys.exit(app.exec_())

单元测试:

    import unittest
import same_label


class Test(unittest.TestCase):


    def setUp(self):
        ex = same_label.Example()


    def tearDown(self):
        pass


    def testName(self):
        pass


if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

错误:-

QWidget: Must construct a QApplication before a QWidget

可能是重复的问题,来自QWidget的“必须在QPaintDevice之前构造QApplication”的问题。链接 - phd
1个回答

6
在创建任何小部件之前,必须创建一个QApplication,因为它处理事件循环。
import unittest
import same_label
import sys

from PyQt5.QtWidgets import QApplication

app = QApplication(sys.argv)


class Test(unittest.TestCase):
    def setUp(self):
        ex = same_label.Example()

    def tearDown(self):
        pass

    def testName(self):
        pass


if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

以下链接中有一个示例:http://johnnado.com/pyqt-qtest-example/,另一种选择是使用pytest-qt包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接