2015-11-03 5 views
5

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

from unittest import TestCase 

class TestPotato(TestCase): 
    def test_in_parent(self): 
     print 'in parent' 

class TestSpud(TestPotato): 
    def test_in_child(self): 
     print 'in child' 

परीक्षण इस मॉड्यूल दो बार test_in_parent चलाता है।

$ python -m unittest example 
in parent 
.in child 
.in parent 
. 
---------------------------------------------------------------------- 
Ran 3 tests in 0.000s 

OK 

क्यों? क्या यह डिजाइन द्वारा है? क्या यह एक निश्चित तरीके से परीक्षण धावक को कॉन्फ़िगर करके अक्षम किया जा सकता है?

मैं एक गैर-खोजी कक्षा में सेटअप को स्थानांतरित करके इस मुद्दे को हल कर सकता हूं, और फिर एकाधिक उत्तराधिकारी का उपयोग कर सकता हूं, लेकिन ऐसा लगता है कि यह थोड़ा हैकी और अनावश्यक है।

ध्यान दें: एक ही समस्या इस तरह के नाक (nosetests -s example.py) और pytest (py.test example.py)

+2

क्योंकि वे अपने माता-पिता का परीक्षण तरीकों के वारिस है, तो (या '__dict__' या जो कुछ भी यह करता है) 'test_' से शुरू होने वाली विधियों के लिए यह विरासत में भी पाता है। मुझे नहीं लगता कि इसे हल करने के लिए * एकाधिक * विरासत की आवश्यकता है; अमूर्त दोनों को तीसरे, अनदेखा वर्ग की आवश्यकता नहीं है, जिसमें 'test_' विधियां नहीं हैं और इन दोनों को इसका वारिस है। – jonrsharpe

+0

एक उप-वर्ग का आत्मनिरीक्षण जिसमें अभिभावक वर्ग है जिसमें परीक्षण द्वारा उपसर्ग किए गए तरीके शामिल हैं, वे विधियों के साथ सबक्लास दिखाएंगे। यह अजगर ओओपी है। मुझे नहीं लगता कि मिश्रित करने के लिए सेटअप विधियों को ले जाना या एक अलग बेस क्लास के रूप में हैकी लगता है, और शायद DRYer – dm03514

+0

परीक्षणों के विभिन्न "समूहों" के लिए मिश्रणों के लिए एक महान उपयोग केस की तरह लगता है ताकि आपको आवश्यक सटीक परीक्षण को गतिशील रूप से बनाया जा सके। ..्री-विरासत यहां सही मॉडल की तरह नहीं दिखता है। – Shashank

उत्तर

3

टेस्ट धावकों test के साथ शुरू सभी तरीकों के ऊपर देखो के रूप में अन्य धावकों में होता है। बाल वर्ग में विरासत विधियां मौजूद हैं - इसलिए उन्हें चलाने के लिए परीक्षण के रूप में पहचाना जाता है। इससे बचने के लिए आपको मूल कक्षा में सामान्य कोड निकालना चाहिए और किसी भी वास्तविक परीक्षण का वारिस नहीं करना चाहिए।

from unittest import TestCase 

class PotatoTestTemplate(TestCase): 
    def setUp(): 
     pass 

class PotatoTest1(PotatoTestTemplate): 
    def test1(self): 
     pass 

class PotatoTest2(PotatoTestTemplate): 
    def test1(self): 
     pass 
+0

हाँ, मैं इस कामकाज से अवगत हूं और इसे अतीत में इस्तेमाल किया है। लेकिन मुझे यह पसंद नहीं है! – wim

+0

मैं इस तरह के पैटर्न पर बस गया हूं - 'PotatoTestTemplate' के बजाय मैं' PotatoSetup (ऑब्जेक्ट) 'का उपयोग करता हूं। यह 'टेस्टकेस' नहीं है, यह एक मिश्रण की तरह है। फिर यदि मुझे इसकी ज़रूरत है तो परीक्षण में अतिरिक्त सेटअप के साथ मैं 'आलूटेस्ट (आलू सेटअप, टेस्टकेस)' और 'स्पडटेस्ट (आलू सेटअप, टेस्टकेस)' का उपयोग करता हूं। – wim

1

एक और वैकल्पिक हल मैंने देखा है लोगों का उपयोग करें कि नेस्टेड कक्षाएं अभ्यस्त जैसे nosetests का हिस्सा के रूप में चलाने मिलता है

from unittest import TestCase 
class NotTested: 
    class TestPotato(TestCase): 
     def test_in_parent(self): 
      print 'in parent' 

class TestSpud(NotTested.TestPotato): 
    def test_in_child(self): 
     print 'in child' 

का संभावित हल मैं असफल कोशिश की तो TestPotato वर्ग वस्तु प्रदान करता है और TestSpud testcase और TestPotato उदा से विस्तार करता है एकाधिक वंशानुक्रम का उपयोग किया गया

from unittest import TestCase 

class TestPotato(object): 
    def test_in_parent(self): 
     # still gets ran twice because 
     # nosetests runs anything that starts with test_* :(
     print 'in parent' 

class TestSpud(TestCase, TestPotato): 
    def test_in_child(self): 
     print 'in child' 

लेकिन यह वास्तव में मेरे लिए काम नहीं किया, मैं चाहता क्योंकि आप कोड का जोड़ा घोंसले की जरूरत नहीं होगी यह किया ... लेकिन यह multiple inheritance is bad anyway

1

तो स्थापना परीक्षण से का उपयोग कर की तरह लग रहा एक अलग परीक्षण वर्ग आप सभी की जरूरत है, तो आप ऐसा कर सकता है है: जब `unittest` उनके` dir` के माध्यम से लग रहा है

from unittest import TestCase 

class TestPotato(TestCase): 
    def setUp(self): 
     print('fixtures here') 

    def test_in_parent(self): 
     print 'in parent' 


class TestSpud(TestCase): 
    def setUp(self): 
     TestPotato.setUp(self) 

    def test_in_child(self): 
     print 'in child' 
संबंधित मुद्दे