2010-11-30 17 views
9

मेरे पास कई कक्षाएं हैं जो कुछ आविष्कार साझा करती हैं और एक आम इंटरफ़ेस है, और मैं स्वचालित रूप से उनमें से प्रत्येक के लिए एक ही परीक्षण चलाने के लिए चाहता हूं।विभिन्न कक्षाओं के लिए एक ही परीक्षण-केस कैसे चलाएं?

उदाहरण के तौर पर, मान लीजिए कि मेरे पास कई कक्षाएं हैं जो डेटा सेट को विभाजित करने के लिए विभिन्न दृष्टिकोण लागू करती हैं। यहां आम आविष्कार होगा, कि इन सभी वर्गों के लिए सभी विभाजनों पर संघ मूल डेटा-सेट के बराबर होना चाहिए।

class PartitionerInvariantsTests(unittest.TestCase): 
    def setUp(self): 
     self.testDataSet = range(100) # create test-data-set 

    def impl(self, partitioner): 
     self.assertEqual(self.testDataSet, 
         chain.from_iterable(partitioner(self.testDataSet)) 

तो मुझे लगता है कि कक्षाओं में मुझे लगता है कि वर्ग का एक उदाहरण के साथ परीक्षण करना चाहते से प्रत्येक के लिए impl कॉल एक अलग समारोह जोड़ें:

कुछ इस तरह दिखता मैं वर्तमान में क्या कर सकते है। एक से अधिक परीक्षण-समारोह के लिए ऐसा करने पर समस्या के साथ समस्या स्पष्ट हो जाती है। मान लीजिए मेरे पास 5 टेस्ट-फ़ंक्शंस और 5 कक्षाएं हैं जिन्हें मैं परीक्षण करना चाहता हूं। यह 25 कार्यों को बनाएगा जो सभी परीक्षणों का आह्वान करने के लिए लगभग समान दिखते हैं।

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

तो, आपके सुझाव क्या हैं?

पी.एस .: मैं उपयोग कर रहा हूँ अजगर 2.6

+1

बेस क्लास को चलाने की कोशिश नहीं करेगा यदि यह 'unittest.TestCase' से प्राप्त नहीं होता है? – nmichaels

+0

@ नाथन: अब जब आप इसे कहते हैं, मैंने अभी तक कोशिश नहीं की है। –

+0

@ नाथन, अगर आप अपने विचार को उत्तर के रूप में पोस्ट करना चाहते हैं, तो मैं खुशी से मेरा हटा दूंगा। – unutbu

उत्तर

11

आप एक से अधिक इस्तेमाल कर सकते हैं:

Nathon की टिप्पणी पर बाद, आप इसे object से केवल वारिस होने से परीक्षण किया जा रहा से आधार वर्ग रोका जा सकता है विरासत।

class PartitionerInvariantsFixture(object): 
    def setUp(self): 
     self.testDataSet = range(100) # create test-data-set 
     super(PartitionInvariantsFixture, self).setUp() 

    def test_partitioner(self): 
     TestCase.assertEqual(self.testDataSet, 
        chain.from_iterable(self.partitioner(self.testDataSet)) 

class MyClassTests(TestCase, PartitionerInvariantsFixture): 
    partitioner = Partitioner 
+0

चेन इटरेटर को सूची (चेन ...) – kevpie

+3

का उपयोग करके पुनरावृत्त किया जाना चाहिए, हमें सेटअप में सुपर कॉल करने की आवश्यकता क्यों है? – dylam

+0

+1 मेरा जबड़ा गिरा दिया गया है। एसओ पर दर्जनों समान प्रश्न हैं (कोर ऑब्जेस्ट के साथ अलग-अलग ऑब्जेक्ट्स पर एक ही परीक्षण चला रहे हैं), लेकिन यह निश्चित रूप से मुझे मिला सबसे अच्छा जवाब है। मुझे यह भी पता नहीं था (या याद नहीं था) कि पाइथन के पास एकाधिक विरासत थी। –

0

उपवर्ग PartitionerInvariantsTests:

class PartitionerInvariantsTests(unittest.TestCase): 
    def test_impl(self): 
     self.assertEqual(self.testDataSet, 
         chain.from_iterable(self.partitioner(self.testDataSet)) 

class PartitionerATests(PartitionerInvariantsTests): 
प्रत्येक विभाजनर वर्ग आप परीक्षण करना चाहते के लिए

। फिर test_impl विरासत के आधार पर, प्रत्येक विभाजन वर्ग के लिए चलाया जाएगा।

import unittest 

class Test(object): 
    def test_impl(self): 
     print('Hi') 

class TestA(Test,unittest.TestCase): 
    pass 

class TestB(Test,unittest.TestCase): 
    pass 

if __name__ == '__main__': 
    unittest.sys.argv.insert(1,'--verbose') 
    unittest.main(argv = unittest.sys.argv)  

रनिंग test.py पैदावार

test_impl (__main__.TestA) ... Hi 
ok 
test_impl (__main__.TestB) ... Hi 
ok 

---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

OK 
+2

हां, लेकिन बेस-क्लास भी चलाया जाएगा, और असफल हो जाएगा। क्या उप-वर्ग चलाने के लिए कोई रास्ता है, लेकिन बेस-क्लास नहीं? –

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