क्या प्रत्येक इकाई परीक्षण को अन्य परीक्षणों से स्वतंत्र रूप से चलाने में सक्षम होना चाहिए?


24

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

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

यदि आप दूसरे विकल्प के साथ गए हैं, तो आपको वास्तव में एक अच्छा विचार होगा कि दो विधियां एक साथ अच्छी तरह से खेलती हैं, हालांकि, यदि 1 परीक्षण विफल हो गया, तो सभी परीक्षण विफल होने के बाद, बग्स को अधिक तेज़ी से अलग करने में मदद करने का परीक्षण लाभ लेना।

यदि आप पहले विकल्प के साथ गए थे, तो प्रत्येक विधि को अलग-थलग किया जाएगा और स्वतंत्र रूप से परीक्षण किया जाएगा, लेकिन आप वास्तव में कभी नहीं जान पाएंगे कि वे वास्तव में ठीक से काम कर सकते हैं।

यहां बेहतर विकल्प कौन सा है? क्या किसी प्रकार का विकल्प है जैसे हार्डकोडिंग के साथ प्रत्येक अलग-थलग विधि के लिए एक ही परीक्षण, और फिर बड़े परीक्षण जिसमें एक में दोनों विधियाँ होती हैं?


2
मैं वास्तव में चाहता हूं कि मैं यूनिट परीक्षणों के क्रम को आसानी से हर बार चलाऊं। अभी वे कुछ अज्ञात में चलते हैं, यद्यपि अपेक्षाकृत निश्चित क्रम से।
जॉब

जवाबों:


11

यदि आप पहले विकल्प के साथ गए थे, तो प्रत्येक विधि को अलग-थलग किया जाएगा और स्वतंत्र रूप से परीक्षण किया जाएगा, लेकिन आप वास्तव में कभी नहीं जान पाएंगे कि वे वास्तव में ठीक से काम कर सकते हैं।

यदि आपके तरीके वास्तव में स्वतंत्र हैं तो यह बात नहीं होनी चाहिए। आपकी दूसरी विधि होनी चाहिए:

क) मान्य डेटा के साथ प्रस्तुत किए जाने पर सही ढंग से काम करें।

ख) अमान्य डेटा के साथ प्रस्तुत किए जाने पर लगातार और लगातार विफल।

उतनी ही आपकी पहली विधि भी उतनी ही करनी चाहिए। इसलिए जब तक आप त्रुटि मामलों को संभालेंगे, वे ठीक से एक साथ काम करेंगे।

यदि आप परीक्षण करना चाहते हैं कि विधियाँ सही ढंग से एक साथ काम करती हैं तो यह एकीकरण परीक्षण है, इकाई परीक्षण नहीं।


27

यदि परीक्षण स्वतंत्र रूप से नहीं चल सकते हैं तो वे इकाई परीक्षण नहीं हैं।

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

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


@ इस उदाहरण में, क्या आप कहेंगे: विधि 1 के लिए एक परीक्षण, विधि 2 के लिए एक परीक्षण और उसी परीक्षण में 1 और 2 चलाने वाला एक परीक्षण?
मॉर्गन हेरलॉकर

2
हाँ। पहले दो यूनिट टेस्ट होंगे, तीसरा इंटीग्रेशन टेस्ट जैसा होगा।
स्टीव

यदि आपके पास ग्राहक मॉड्यूल है और ऑर्डर मॉड्यूल और ऑर्डर ग्राहक के संबंध के बिना नहीं बनाया जा सकता है। आप इसे ग्राहक मॉड्यूल से कैसे स्वतंत्र रूप से परखेंगे: sql (ग्राहक में डालें) के साथ डेटाबेस में ग्राहक रिकॉर्ड बनाएं या Customer.createCustomer () का उपयोग करें। और IMHO दूसरे का उपयोग करना बेहतर है, क्योंकि आपको परीक्षण में किसी भी तर्क की आवश्यकता नहीं है, लेकिन यह केवल तभी काम करता है जब आपका टेस्ट ग्राहकों को पास करने पर हो।
Dainius

@Dainius। एक इकाई परीक्षण परिदृश्य में आप आमतौर पर नकली वस्तुओं का उपयोग करते हैं, इसलिए आप अपने ऑर्डर मॉड्यूल में एक नकली ग्राहक को पास करेंगे। आप सही हैं कि आप इस मामले में sql का उपयोग नहीं करना चाहेंगे।
स्टीव

ऐसा लगता है कि किसी भी परिदृश्य में जहां विधि B विधि A पर निर्भर करता है, वहां लगभग हमेशा एक विधि C होगी जो A को कॉल करती है, तब B को कॉल करता है। चूंकि यह मामला है, आप स्वतंत्र रूप से A, B और C का परीक्षण कर सकते हैं।
मॉर्गन हरलॉकर 16

9

मुझे यकीन है कि अभी यूनिट टेस्ट बी होना ठीक है, जो कि यूनिट टेस्ट बी द्वारा छोड़ी गई अवस्था पर निर्भर करता है। लेकिन अब से एक साल पहले विचार करें जब आपके पास एक हजार यूनिट टेस्ट हों। क्या आप वास्तव में अपने पूरे परीक्षण सूट के लिए दस मिनट तक इंतजार करना चाहते हैं ताकि आपको हर बार बदलाव करने की आवश्यकता हो?

यह निश्चित रूप से आपकी विकास शैली पर निर्भर करता है, लेकिन यदि आप सभ्य परीक्षण संचालित विकास की कोई उम्मीद चाहते हैं, जिसमें आप एक विशेषता विकसित करते समय कई बार व्यक्तिगत परीक्षण चला सकते हैं, तो मेरा सुझाव है कि आप प्रत्येक परीक्षा को अकेले खड़े होने की क्षमता दें।


1
+1 रस्कोलनिकोव, मैंने इस तथ्य पर विचार नहीं किया कि यह बाद में बड़ा समय होगा जब मैंने लाइन के नीचे "सभी परीक्षण चलाए"।
मॉर्गन हेरलॉकर

3

ऐसा लगता है कि आप परीक्षण सेटअप के बारे में बात कर रहे हैं, जिसे कई तरीकों से किया जा सकता है। आप प्रत्येक परीक्षण के लिए परीक्षण डेटा (जिसे फ़िक्चर कहते हैं) की एक साफ़ प्रतिलिपि चाहते हैं, इसलिए उनमें से प्रत्येक को एक दूसरे पर निर्भर नहीं होना चाहिए।

ऐसे कई ढांचे हैं जो इस प्रकार के परीक्षण की अनुमति देते हैं, और DBUnit जैसे उपकरण जो आपको परीक्षण और परीक्षण सूट के प्रारंभ और अंत में डेटा संरचनाओं को जल्दी से बनाने और फाड़ने की अनुमति देते हैं।

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