单元测试和功能测试基于PySide的应用程序?(Unit and functional testin

2019-06-25 16:30发布

我建立一个基于1.1.0-PySide应用,并一直在寻找好的例子来看看在单元测试和功能测试我的应用程序。 我想能够做到(模拟的点击次数,键按压等)的用户界面的功能测试,该改变UI(推测使用的局部嘲笑发送器和接收器)的布局UI时隙单元测试,以及单元的代码测试涉及小部件,但不要求任何窗口中呈现。

作为一个实例,我动态在菜单栏创建一个菜单的子菜单,当一个项目被添加到该数据提供给一个QTreeView则一个模型(化QAbstractItemModel派生对象)。 该模型和子菜单必须保持同步,所以我希望能够写一个单元测试,提交数据到管理模型和子控制器,并声称这两个模型和子菜单进行适当的更新。

我宁愿没有建立一个QApplication的在我的测试代码,如果我能避免它。 我也想没有显示任何窗口时,我只在乎验证数据结构中的小部件,而不是他们的可视化。

我无法找到合适的值钱的东西http://www.pyside.org或在我的谷歌搜索。 任何人都不会有好的示例代码,我应该看任何经验或知识?

Answer 1:

我一直在玩弄了一下现在的单元测试代码pyside来到该组合Python的结论unittest与Qt的模块QTest模块的工作原理相当不错。

你必须有一个QApplication对象实例化,但你并不需要运行其exec_方法,因为你不需要事件循环运行做。

下面是我如何测试一个例子QCheckBox在对话框中做的事情是应该做的:

class Test_PwsAddEntryDialog(TestCase):
    """Tests the class PwsAddEntryDialog."""

    def test_password_strength_checking_works(self):
        """Tests if password strength checking works, if the corresponding check
        box is checked.
        """
        d = PwsAddEntryDialog()
        # test default of internal flag
        self.assertFalse(d.testPasswordStrength)
        # type something
        QTest.keyClicks(d.editSecret, "weak", 0, 10)
        # make sure that entered text is not treated as a password
        self.assertEqual(d.labelPasswordStrength.text(), "")
        # click 'is password' checkbox
        QTest.mouseClick(d.checkIsPassword, Qt.LeftButton)
        # test internal flag changed
        self.assertTrue(d.testPasswordStrength)
        # test that label now contains a warning
        self.assertTrue(d.labelPasswordStrength.text().find("too short") > 0)
        # click checkbox again
        QTest.mouseClick(d.checkIsPassword, Qt.LeftButton)
        # check that internal flag once again changed
        self.assertFalse(d.testPasswordStrength)
        # make sure warning disappeared again
        self.assertEqual(d.labelPasswordStrength.text(), "")

这完全适用关屏,包括点击小部件,并在键入文本QLineEdit

这里是我测试(很简单) QAbstractListModel

class Test_SectionListModel(TestCase):
    """Tests the class SectionListModel."""

    def test_model_works_as_expected(self):
        """Tests if the expected rows are generated from a sample pws file
        content.
        """
        model = SectionListModel(SAMPLE_PASSWORDS_DICT)
        l = len(SAMPLE_PASSWORDS_DICT)
        self.assertEqual(model.rowCount(None), l)
        i = 0
        for section in SAMPLE_PASSWORDS_DICT.iterkeys():
            self.assertEqual(model.data(model.index(i)), section)
            i += 1

我希望这有助于littlebit。



Answer 2:

就我而言,我得到了一个错误“的QPixmap:一个以前的QPaintDevice必须构造一个QApplication的”。

如果你需要为你的测试一个QApplication的实例(例如使用的QPixmap),这里是做到这一点的方法之一。 只要创建一个单身,让你保证有一个且只有一个QApplication的实例。

这是因为埋在PySide源测试的辅助工具。

import unittest

from PySide.QtGui import QApplication
_instance = None

class UsesQApplication(unittest.TestCase):
    '''Helper class to provide QApplication instances'''

    qapplication = True

    def setUp(self):
        '''Creates the QApplication instance'''

        # Simple way of making instance a singleton
        super(UsesQApplication, self).setUp()
        global _instance
        if _instance is None:
            _instance = QApplication([])

        self.app = _instance

    def tearDown(self):
        '''Deletes the reference owned by self'''
        del self.app
        super(UsesQApplication, self).tearDown()

然后子类UsesQApplication

from PySide import QtGui

class Test(UsesQApplication):

    def setUp(self):
        #If you override setup, tearDown, make sure
        #to have a super call
        super(TestFilterListItem, self).setUp()

    def tearDown(self):
        super(TestFilterListItem, self).tearDown()

    def testName(self):
        pix = QtGui.QPixmap(20,20)
        self.assertTrue(True)

希望这可以帮助



文章来源: Unit and functional testing a PySide-based application?