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

时间:2015-04-21 16:03:29

标签: python pyqt pyside python-unittest

如何创建QApplication的单个实例?

背景:

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

它有以下缺点:

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

我的第一个工作想法是将QApplication()的每个电话都围绕try except。但我对此并不满意......

我尝试拨打app.quit(),设置self.app = Nonegc.collect()。他们都没有工作。

技术事实:

  • Python 3.4
  • PySide
  • 模块unittest
  • 在PyCharm和控制台/脚本中执行

1 个答案:

答案 0 :(得分:1)

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

为每个单元测试使用唯一的QWidget 要使用唯一的QWidget实例,请在QWidget

中实例化unittest.TestCase.setUp()

以下是从控制台运行的完整测试脚本示例 我的环境与你的环境类似,除了我正在使用:

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