Python unittest में setUp () और setUpClass () के बीच अंतर क्या है?


99

पायथन ढांचे के बीच setUp()और अंतर क्या है ? सेटअप को एक विधि से दूसरे पर क्यों संभाला जाएगा?setUpClass()unittest

मैं यह समझना चाहता हूं कि सेटअप का क्या कार्य setUp()और setUpClass()कार्यों में किया जाता है , साथ ही साथ tearDown()और tearDownClass()

जवाबों:


147

जब आप अपनी कक्षा में एक से अधिक परीक्षण विधि रखते हैं तो यह अंतर स्वयं प्रकट होता है। setUpClassऔर tearDownClassपूरी कक्षा के लिए एक बार चलाए जाते हैं; setUpऔर tearDownप्रत्येक परीक्षण विधि से पहले और बाद में चलाए जाते हैं।

उदाहरण के लिए:

class Example(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    def setUp(self):
        print("setUp")

    def test1(self):
        print("test1")

    def test2(self):
        print("test2")

    def tearDown(self):
        print("tearDown")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")

जब आप यह परीक्षण चलाते हैं, तो यह प्रिंट करता है:

setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass

(डॉट्स ( .) कर रहे हैं unittestके डिफ़ॉल्ट उत्पादन जब एक परीक्षण गुजरता है।) है कि ध्यान से देखें setUpऔर tearDownपहले और बाद में दिखाई देते हैं test1 और test2 , जबकि setUpClassऔर tearDownClassकेवल एक बार दिखाई देते हैं, शुरुआत और पूरे परीक्षण मामले के अंत में।


क्या यह आदेश नहीं होना चाहिए? : setUpClass setUp test1 teardown .setUp test2 .tearDown tearDownClass
जय शर्मा

ध्यान दें "।" अश्रु के सामने और "की अनुपस्थिति।" आंसू के सामनेDownClass
जय शर्मा

आह, क्षमा करें, यह हाजिर नहीं हुआ। नहीं, unittestजब तक कि यह tearDownघटना के बिना पूरा नहीं हो जाता है , तब तक एक परीक्षण पर विचार नहीं करता है ।
बेंजामिन हॉजसन

तो प्रत्येक मेथड टेस्ट १ और टेस्ट २ में सेटअप और टियरडाउन का अपना सेट होना चाहिए, है ना? आपके उत्तर में, test1 में कोई भी आंसू विधि नहीं है और इस प्रकार इसे डिफ़ॉल्ट आउटपुट (के साथ) मुद्रित करना चाहिए। यदि मैं गलत हूं तो मुझे सही करों।
जय शर्मा

1
उत्तर में आउटपुट सही है। मैंने इसे सीधे unittest के आउटपुट से चिपकाया। setUpऔर tearDownप्रत्येक हर के लिए एक बार चलाए जा रहे हैं test(इस उदाहरण में कुल में तो दो बार) विधि लेकिन setUpClassऔर tearDownClassबस हर एक बार चलाए जा रहे हैं।
बेंजामिन हॉजसन

15

पायथन ढांचे के बीच setUp()और अंतर क्या है ?setUpClass()unittest

मुख्य अंतर (जैसा कि बेंजामिन हॉजसन द्वारा जवाब में कहा गया है) यह setUpClassकेवल एक बार कहा जाता है और सभी परीक्षणों से पहले होता है, जबकि setUpप्रत्येक और प्रत्येक परीक्षण से तुरंत पहले कहा जाता है। (एनबी: यही बात अन्य एक्सयूनाइट टेस्ट फ्रेमवर्क में समकक्ष विधियों पर लागू होती है, न कि केवल पायथन के लिए unittest)।

से unittest प्रलेखन :

setUpClass()

एक वर्ग विधि जिसे व्यक्तिगत वर्ग में परीक्षण से पहले बुलाया जाता है, चलाया जाता है। setUpClass को केवल तर्क के रूप में कक्षा के साथ बुलाया जाता है और उसे एक वर्गमाथ () के रूप में सजाया जाना चाहिए:

@classmethod
def setUpClass(cls):
    ...

तथा:

setUp()

पद्धति परीक्षण स्थिरता तैयार करने के लिए कहती है। परीक्षण विधि को कॉल करने से तुरंत पहले इसे कहा जाता है; एसेरियनएयर या स्किपटेस्ट के अलावा, इस पद्धति द्वारा उठाए गए किसी भी अपवाद को एक परीक्षण विफलता के बजाय एक त्रुटि माना जाएगा। डिफ़ॉल्ट कार्यान्वयन से कुछ भी नहीं होता है।

सेटअप को एक विधि से दूसरे पर क्यों संभाला जाएगा?

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

setUpClassविधि महंगा तत्वों के लिए है यदि आपको केवल इस तरह के एक डेटाबेस कनेक्शन आदि खोलने, फाइल सिस्टम पर एक अस्थायी फ़ाइल खोलने, परीक्षण के लिए एक साझा लाइब्रेरी लोड हो रहा है, ऐसी बातें करने से पहले प्रत्येक परीक्षा को धीमा के रूप में, एक बार ऐसा करने के लिए होता है कि परीक्षण सूट बहुत अधिक है, इसलिए हम इसे सभी परीक्षणों से पहले एक बार करते हैं। यह परीक्षणों की स्वतंत्रता में थोड़ी गिरावट है लेकिन कुछ स्थितियों में एक आवश्यक अनुकूलन है। यकीनन, किसी को यूनिट परीक्षणों में ऐसी चीजें नहीं करनी चाहिए क्योंकि आमतौर पर डेटाबेस / फाइलसिस्टम / लाइब्रेरी / जो भी वास्तविक चीज का उपयोग किए बिना मॉक करना संभव है। जैसे, मुझे लगता है कि setUpClassशायद ही कभी जरूरत है। हालांकि, उपरोक्त उदाहरणों (या समान) का परीक्षण करते समय यह उपयोगी है।

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