在python单元测试中使用QApplication的一个实例
如何创建在python单元测试中使用QApplication的一个实例,python,pyqt,pyside,python-unittest,Python,Pyqt,Pyside,Python Unittest,如何创建QApplication的单个实例 背景: 我正在单元测试中测试两个实现QWidget的小部件。为此,我必须创建QApplication的实例。第二次调用QApplication的构造函数会导致异常 它有以下缺点: 小部件和QApplication在setUpClass(cls)中创建,标记为@classmethod。对于测试的创建和维护,这是一个痛苦的原因,因为每个测试都必须处理同一个小部件实例 一旦我必须执行多个测试用例,就会创建多个QApplication实例,我又面临运行时错误
QApplication
的单个实例
背景:
我正在单元测试中测试两个实现QWidget
的小部件。为此,我必须创建QApplication
的实例。第二次调用QApplication
的构造函数会导致异常
它有以下缺点:
- 小部件和
在QApplication
中创建,标记为setUpClass(cls)
。对于测试的创建和维护,这是一个痛苦的原因,因为每个测试都必须处理同一个小部件实例@classmethod
- 一旦我必须执行多个测试用例,就会创建多个
实例,我又面临运行时错误QApplication
QApplication()
的每次调用使用try except
。但是我不满意
我尝试调用app.quit()
,设置self.app=None
和gc.collect()
。他们都没有工作
技术事实:
- Python 3.4
- 皮塞德
- 模块
unittest
- 在PyCharm和控制台/脚本中执行
QApplication
实例。要使用相同的
QApplication
实例,请在单元测试脚本的全局范围内实例化QApplication
对每个单元测试使用唯一的QWidget
。要使用唯一的
QWidget
实例,请在unittest.TestCase.setUp()中实例化QWidget
下面是从控制台运行的完整测试脚本示例。
我的环境与您的环境相似,但我使用的是:
- PyQt5而不是PySide
- Jupyter QtConsole而不是PyCharm
#/usr/bin/env python
导入系统
导入单元测试
从PyQt5.QtWidgets导入QApplication
“”“所有测试都使用QApplication的同一个全局实例。”“”
从PyQt5.QtWidgets导入QWidget
“”“这些测试分别将顶级窗口实例化为QWidget。”“”
#创建可从所有测试访问的全局应用程序。
app=QApplication(sys.argv)
#定义所有测试中使用的setUp()代码。
类PyQt_TestFixture(unittest.TestCase):
def创建应用程序窗口(自):
w=QWidget()
返回w
def设置(自):
self.window=self.create\u application\u window()
类TestPyQt(PyQt_TestFixture):
“”“测试套件。请参阅设置()的测试夹具。”
def test_QWidget_setWindowTitle(自):
“”“测试PyQt setWindowTitle()是否设置窗口的标题。”“”
#操作。
self.window.setWindowTitle('Test setWindowTitle')
#检查。
self.assertEqual(self.window.windowTitle(),'Test setWindowTitle')
def测试\u每个测试使用IQueqWidgets(自身):
“”“测试PyQt setWindowTitle()的其他测试是否不影响此测试。”“”
#检查。
self.assertNotEqual(self.window.windowTitle(),'Test setWindowTitle')
“”“如果未调用setWindowTitle(),则windowTitle()为空字符串。”“”
def测试_QWidget_调整大小(自):
“”“另一个示例:测试PyQt resize()是否调整窗口大小。”“”
#操作。
self.window.resize(123456)
#检查。
从PyQt5.QtCore导入QSize
尺寸=QSize(123456)
self.assertEqual(self.window.size(),size)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
unittest.main()