我建立一个基于1.1.0-PySide应用,并一直在寻找好的例子来看看在单元测试和功能测试我的应用程序。 我想能够做到(模拟的点击次数,键按压等)的用户界面的功能测试,该改变UI(推测使用的局部嘲笑发送器和接收器)的布局UI时隙单元测试,以及单元的代码测试涉及小部件,但不要求任何窗口中呈现。
作为一个实例,我动态在菜单栏创建一个菜单的子菜单,当一个项目被添加到该数据提供给一个QTreeView则一个模型(化QAbstractItemModel派生对象)。 该模型和子菜单必须保持同步,所以我希望能够写一个单元测试,提交数据到管理模型和子控制器,并声称这两个模型和子菜单进行适当的更新。
我宁愿没有建立一个QApplication的在我的测试代码,如果我能避免它。 我也想没有显示任何窗口时,我只在乎验证数据结构中的小部件,而不是他们的可视化。
我无法找到合适的值钱的东西http://www.pyside.org或在我的谷歌搜索。 任何人都不会有好的示例代码,我应该看任何经验或知识?
我一直在玩弄了一下现在的单元测试代码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。
就我而言,我得到了一个错误“的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)
希望这可以帮助