Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python单元测试中使用QApplication的一个实例_Python_Pyqt_Pyside_Python Unittest - Fatal编程技术网

在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()