2012-06-21 12 views
16

मैं एक पायसाइड 1.1.0-आधारित एप्लिकेशन बना रहा हूं, और यूनिट के लिए देखने और मेरे आवेदन को कार्यात्मक परीक्षण करने के लिए अच्छे उदाहरण ढूंढ रहा हूं। मैं यूआई के कार्यात्मक परीक्षण (यूआईएल के लेआउट को बदलने वाले यूआई स्लॉट्स का यूनिट परीक्षण) (जो आंशिक रूप से आंशिक रूप से मॉक प्रेषक और रिसीवर का उपयोग कर रहा है) के साथ-साथ इकाई के कार्यात्मक परीक्षण करने में सक्षम होना चाहता हूं कोड का परीक्षण जिसमें विगेट्स शामिल हैं, लेकिन बिना किसी विंडो को प्रस्तुत किए जाने की आवश्यकता है।यूनिट और कार्यात्मक परीक्षण एक पायसाइड-आधारित अनुप्रयोग?

एक उदाहरण के रूप में, जब मैं किसी मॉडल को एक मॉडल (QAbstractItemModel-derived ऑब्जेक्ट) में जोड़ा जाता है, तो मैं गतिशील रूप से मेन्यूबार में एक मेनू का सबमेनस बना देता हूं जो QTreeView को डेटा प्रदान करता है। मॉडल और सबमेनू को सिंक में रहना चाहिए, इसलिए मैं एक यूनिट टेस्ट लिखने में सक्षम होना चाहता हूं जो मॉडल और सबमेनू को प्रबंधित करने वाले नियंत्रक को डेटा सबमिट करता है, और दावा करता है कि मॉडल और सबमेनू दोनों ठीक से अपडेट किए गए थे।

यदि मैं इससे बच सकता हूं तो मैं अपने टेस्ट कोड में एक क्यूप्लिकेशंस स्थापित नहीं करना चाहूंगा। मैं भी किसी भी विंडो को प्रदर्शित नहीं करना चाहता हूं जब मैं केवल विगेट्स में डेटा संरचनाओं को सत्यापित करने की परवाह करता हूं, न कि उनके विज़ुअलाइज़ेशन।

मुझे http://www.pyside.org पर या मेरी Google खोजों में उपयुक्त मूल्य के कुछ भी नहीं मिल रहा है। क्या किसी के पास कोई अच्छा अनुभव है या अच्छा नमूना कोड पता है जिसे मुझे देखना चाहिए?

+0

मैं भी अत्यधिक इस के लिए एक समाधान में intereseted कर रहा हूँ में मदद करता है, जैसा कि मैंने ठीक उसी समस्याओं – Chris

+1

आप को देखा है का सामना करना पड़ रहा है: http : //johnnado.com/pyqt-qtest-example/ यह PyQt है, लेकिन काफी वही है। – neuronet

उत्तर

29

मैं अब यूनिट-परीक्षण पाइसाइड कोड के साथ थोड़ा सा खेल रहा हूं और निष्कर्ष पर आया कि पाइथन के unittest मॉड्यूल को क्यूटी के 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 मदद करता है।

2

मेरे मामले में, मुझे एक त्रुटि मिल रही थी 'QPixmap: QPaintDevice से पहले QApplication बनाना चाहिए'।

यदि आपको अपने परीक्षणों के लिए QAplication उदाहरण होना चाहिए (उदाहरण के लिए QPixmap का उपयोग करें), तो ऐसा करने का एक तरीका यहां है। बस एक सिंगलटन बनाएं ताकि आपको एक और केवल एक QAplication उदाहरण सुनिश्चित किया जा सके।

इसे पायसाइड स्रोत में परीक्षणों के लिए एक सहायक के रूप में दफनाया गया है।

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) 

आशा है कि यह

+7

मैं सिर्फ क्यूटीगुई अगर करता हूं।qApp == कोई नहीं: QtGui.QAplication ([]) 'QTGui का उपयोग करने वाले प्रत्येक परीक्षण मॉड्यूल की शुरुआत में। – strubbly

संबंधित मुद्दे