gpt4 book ai didi

python - 在 python 单元测试中使用 QApplication 的单个实例

转载 作者:行者123 更新时间:2023-12-01 04:44:36 25 4
gpt4 key购买 nike

如何创建 QApplication 的单个实例?

背景:

我正在单元测试中测试几个实现QWidget的小部件。为此,我必须创建一个 QApplication 实例。第二次调用 QApplication 的构造函数会导致异常。

它有以下缺点:

  • 小部件和QApplicationsetUpClass(cls)中创建,标记为@classmethod。对于测试的创建和维护来说,这是一个痛苦的事情,因为每个测试都必须处理同一个小部件实例。
  • 一旦我必须执行多个测试用例,就会创建多个 QApplication 实例,并且我将再次面临 RuntimeError...

我的第一个工作想法是用 try except 包围对 QApplication() 的每次调用。但我对此并不满意......

我尝试调用 app.quit(),设置 self.app = Nonegc.collect()。它们都不起作用。

技术事实:

  • Python 3.4
  • PySide
  • 模块单元测试
  • 在 PyCharm 和控制台/脚本中执行

最佳答案

对测试脚本中的所有单元测试使用相同的 QApplication 实例。
要使用相同的 QApplication 实例,请在单元测试脚本的全局范围内实例化 QApplication

为每个单元测试使用唯一的QWidget
要使用唯一的 QWidget 实例,请在 unittest.TestCase.setUp()

中实例化 QWidget

这是从控制台运行的完整测试脚本示例。
我的环境与您的类似,只是我使用的是:

  • PyQt5 代替 PySide
  • Jupyter QtConsole 而不是 PyCharm
#! /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()

关于python - 在 python 单元测试中使用 QApplication 的单个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com