如何创建QApplication
的单个实例?
背景:
我正在测试在单元测试中实现QWidget
的几个小部件。为此,我必须创建QApplication
的实例。第二次调用QApplication
的构造函数会导致异常。
它有以下缺点:
QApplication
在setUpClass(cls)
中创建,标记为@classmethod
。对于测试的创建和维护,这是一个痛苦的原因,每个测试都必须处理小部件的相同实例。QApplication
个实例,并且我再次遇到RuntimeError ...... 我的第一个工作想法是将QApplication()
的每个电话都围绕try except
。但我对此并不满意......
我尝试拨打app.quit()
,设置self.app = None
和gc.collect()
。他们都没有工作。
技术事实:
unittest
答案 0 :(得分:1)
对测试脚本中的所有单元测试使用相同的QApplication
实例
要使用相同的QApplication
实例,请在单元测试脚本的全局范围内实例化QApplication
。
为每个单元测试使用唯一的QWidget
要使用唯一的QWidget
实例,请在QWidget
unittest.TestCase.setUp()
以下是从控制台运行的完整测试脚本示例 我的环境与你的环境类似,除了我正在使用:
#! /usr/bin/env python
import sys
import unittest
from PyQt5.QtWidgets import QApplication
"""All tests use the same single global instance of QApplication."""
from PyQt5.QtWidgets import QWidget
"""The tests individually instantiate the top-level window as a QWidget."""
# Create an application global accessible from all tests.
app= QApplication( sys.argv )
# Define setUp() code used in all tests.
class PyQt_TestFixture( unittest.TestCase ):
def create_application_window( self ):
w= QWidget()
return w
def setUp( self ):
self.window= self.create_application_window()
class TestPyQt( PyQt_TestFixture ):
"""Suite of tests. See test fixture for setUp()."""
def test_QWidget_setWindowTitle( self ):
"""Test that PyQt setWindowTitle() sets the title of the window."""
# Operate.
self.window.setWindowTitle( 'Test setWindowTitle' )
# Check.
self.assertEqual( self.window.windowTitle(), 'Test setWindowTitle' )
def test_eachTestUsesUniqueQWidgets( self ):
"""Test that the other test of PyQt setWindowTitle() is not affecting this test."""
# Check.
self.assertNotEqual( self.window.windowTitle(), 'Test setWindowTitle' )
"""The windowTitle() is an empty string '' if setWindowTitle() is not called."""
def test_QWidget_resize( self ):
"""Another example: test that PyQt resize() resizes the window."""
# Operate.
self.window.resize( 123, 456 )
# Check.
from PyQt5.QtCore import QSize
size= QSize( 123, 456 )
self.assertEqual( self.window.size(), size )
if __name__ == '__main__':
unittest.main()