__init__ unittest.TestCase के लिए


122

मैं कुछ चीजों को जोड़ना चाहता हूं जो कि unittest.TestCaseक्लास को इनिशियलाइज़ किए जाने पर करता है लेकिन मैं यह नहीं कर सकता कि यह कैसे करना है।

अभी मैं यह कर रहा हूँ:

#filename test.py

class TestingClass(unittest.TestCase):

    def __init__(self):
        self.gen_stubs()

    def gen_stubs(self):
        # Create a couple of tempfiles/dirs etc etc.
        self.tempdir = tempfile.mkdtemp()
        # more stuff here

मैं चाहूंगा कि सभी स्टब्स केवल एक बार परीक्षण के इस पूरे सेट के लिए उत्पन्न हों। मैं उपयोग नहीं कर सकता setUpClass()क्योंकि मैं अजगर 2.4 पर काम कर रहा हूं (मैं अजगर 2.7 पर भी काम करने में सक्षम नहीं हूं)।

मुझसे यहां क्या गलत हो रहा है?

मुझे यह त्रुटि मिली:

 `TypeError: __init__() takes 1 argument (2 given)` 

... और अन्य त्रुटियां जब मैं स्टब कोड के सभी को स्थानांतरित करता __init__हूं, जब मैं इसे कमांड के साथ चलाता हूं python -m unittest -v test


@ नीरज मुझे लगता है कि मेरा सवाल प्री-डेट है?
ffledgling

@ अभिजीत से यह सवाल 2013 में पूछा गया था, जिस लिंक को आप 2016 में पूछा गया था, और उसके जवाब और प्रवचन कम हैं, हो सकता है कि आपको दूसरे प्रश्न को डुप्लिकेट के रूप में चिह्नित करना चाहिए? जवाब अजगर 3 संबंधित और अजगर 2. के बारे में इस सवाल का वार्ता है
ffledgling

इस बात का खेद है कि मेरा बुरा हुआ।
अभिजीत

जवाबों:


166

इसे इस्तेमाल करे:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

आप अधिभावी कर रहे हैं TestCaseकी __init__है, तो आप आप के लिए आधार वर्ग संभाल तर्क यह बताने के लिए चाहते हो सकता है।


+1 हालांकि मैं किसी भी ऑब्जेक्ट विधि को कॉल करने से पहले बेस क्लास को इनिशियलाइज़ करूँगा।
जोआचिम इस्कसन

यह मेरे लिए काम नहीं कर रहा है। Gen_stub के अंदर का सामान निष्पादित नहीं किया जा रहा है। वास्तव में ऐसा लगता है कि gen_stub को बिल्कुल भी नहीं बुलाया जा रहा है ... मैं बता सकता हूं क्योंकि जो आत्मप्रतिष्ठा मौजूद है, उसे कक्षा के अन्य तरीकों से एक्सेस नहीं किया जा सकता है। मुझे एक गुण मिलता है: 'टेस्टिंगक्लास' ऑब्जेक्ट में कोई विशेषता नहीं है 'टेम्पर्ड'
झगड़े में

22
क्या आपको setUpओवरराइड करने के बजाय इसे कॉल नहीं करना चाहिए __init__?
कार्तिक

2
@Kikikr मैं सभी परीक्षणों के लिए एक बार स्टब्स उत्पन्न करना चाहता हूं बजाय उन्हें हर परीक्षण के लिए फिर से बनाना। कुछ परीक्षणों द्वारा कुछ स्टब्स का उपयोग भी नहीं किया जाएगा। मैं setUpClass का उपयोग करता हूं, लेकिन मुझे नहीं लगता कि अजगर 2.4 इसका समर्थन करता है।
ffledgling

2
आप इस मामले में थोड़ा और अधिक स्पष्ट हो सकते हैं (जो मेरी राय में पठनीयता के साथ मदद करता है) और उपयोग करें: के unittest.TestCase.__init__(self,*args,**kwargs)बजायsuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo

22

बस init फ़ंक्शन को ओवरराइड करने के बारे में कुछ स्पष्टीकरण जोड़ना चाहते थे

unittest.TestCase

आपके परीक्षण वर्ग में प्रत्येक विधि से पहले फ़ंक्शन को बुलाया जाएगा। कृपया ध्यान दें कि यदि आप कुछ महंगी संगणनाएँ जोड़ना चाहते हैं, जिन्हें सभी परीक्षण विधियों को चलाने से पहले एक बार किया जाना चाहिए, तो कृपया SetUpClass classmethod का उपयोग करें

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

इस फ़ंक्शन को कक्षा के सभी परीक्षण तरीकों से पहले एक बार बुलाया जाएगा । setUpएक ऐसी विधि के लिए देखें जिसे प्रत्येक परीक्षण विधि से पहले कहा जाता है।


4

Unittest2 स्थापित करें और उस पैकेज के unittest का उपयोग करें।

import unittest2 

और फिर विशेष आरंभीकरण तर्क के लिए setupModule / tearDownModule या setupClass / tearDown वर्ग का उपयोग करें

अधिक जानकारी: http://www.voidspace.org.uk/python/articles/unittest2.shtml

इसके अलावा सबसे अधिक संभावना है कि आपके एकीकरण एक unittest से अधिक एकीकरण परीक्षण बना रहे हैं। टेस्ट के लिए एक अच्छा नाम चुनें उन्हें अलग करें या एक अलग कंटेनर मॉड्यूल में डालें।


प्रलेखन लिंक के लिए धन्यवाद।
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.