एकीकरण और इकाई परीक्षणों के बीच अंतर क्या है?


307

मैं इकाई परीक्षणों और एकीकरण परीक्षणों की तथाकथित पाठ्यपुस्तक परिभाषा जानता हूं। जब मैं इकाई परीक्षणों को लिखने का समय होता हूं, तो मैं उत्सुक हूं ... मैं उन्हें कक्षाओं के कई सेटों को कवर करने के लिए लिखूंगा।

उदाहरण के लिए, यदि मेरे पास एक Wordवर्ग है , तो मैं कक्षा के लिए कुछ इकाई परीक्षण लिखूंगा Word। फिर, मैं अपनी Sentenceकक्षा लिखना शुरू करता हूं , और जब उसे Wordकक्षा के साथ बातचीत करने की आवश्यकता होती है , तो मैं अक्सर अपनी इकाई परीक्षण लिखूंगा जैसे कि वे दोनों का परीक्षण करते हैं Sentenceऔर Word... कम से कम उन जगहों पर जहां वे बातचीत करते हैं।

क्या ये परीक्षण अनिवार्य रूप से एकीकरण परीक्षण बन गए हैं क्योंकि वे अब इन 2 वर्गों के एकीकरण का परीक्षण करते हैं, या क्या यह केवल एक इकाई परीक्षण है जो २ वर्गों को फैलाता है?

सामान्य तौर पर, इस अनिश्चित रेखा के कारण, मैं शायद ही कभी एकीकरण परीक्षण लिखूंगा ... या क्या यह देखने के लिए तैयार उत्पाद का उपयोग कर रहा हूं कि क्या सभी टुकड़े वास्तविक एकीकरण परीक्षणों को ठीक से काम करते हैं, भले ही वे मैनुअल हैं और शायद ही कभी दायरे से परे दोहराए जाते हैं। प्रत्येक व्यक्ति की विशेषता?

क्या मैं एकीकरण परीक्षणों की गलतफहमी है, या एकीकरण और इकाई परीक्षणों के बीच वास्तव में बहुत कम अंतर है?

जवाबों:


300

मेरे लिए महत्वपूर्ण अंतर यह है कि एकीकरण परीक्षण से पता चलता है कि कोई विशेषता काम कर रही है या टूट गई है, क्योंकि वे वास्तविकता के करीब एक परिदृश्य में कोड को तनाव देते हैं। वे एक या एक से अधिक सॉफ्टवेयर विधियों या विशेषताओं को लागू करते हैं और यदि वे अपेक्षित रूप से कार्य करते हैं तो परीक्षण करते हैं।

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

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

आप इस तरह से कहीं एक विधि है कहते हैं:

public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  Log.TrackTheFactYouDidYourJob();
  return someResults;
}

DoSomethingआपके ग्राहक के लिए बहुत महत्वपूर्ण है: यह एक विशेषता है, केवल एक चीज जो मायने रखती है। आप करना चाहते हैं: यही कारण है कि आप आमतौर पर एक ककड़ी विनिर्देश यह जोर देते हुए लिखना है सत्यापित करने और संवाद सुविधा या काम नहीं कर रहा।

Feature: To be able to do something
  In order to do something
  As someone
  I want the system to do this thing

Scenario: A sample one
  Given this situation
  When I do something
  Then what I get is what I was expecting for

इसमें कोई संदेह नहीं है: यदि परीक्षा पास हो जाती है, तो आप दावा कर सकते हैं कि आप एक काम कर रहे हैं। इसे आप बिजनेस वैल्यू कह सकते हैं ।

यदि आप एक इकाई परीक्षण लिखना चाहते हैं, तो आपको DoSomething(कुछ मोक्स का उपयोग करके) दिखावा करना चाहिए कि बाकी कक्षाएं और विधियां काम कर रही हैं (अर्थात: वह, जो सभी निर्भरताएं विधि का सही तरीके से उपयोग कर रही हैं) और आपकी विधि काम कर रही है।

व्यवहार में, आप कुछ ऐसा करते हैं:

public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  FakeAlwaysWorkingLog.TrackTheFactYouDidYourJob(); // Using a mock Log
  return someResults;
}

आप इसे डिपेंडेंसी इंजेक्शन, या कुछ फैक्ट्री मेथड या किसी मॉक फ्रेमवर्क के साथ कर सकते हैं या सिर्फ टेस्ट के तहत क्लास को बढ़ा सकते हैं।

मान लीजिए कि एक बग है Log.DoSomething()। सौभाग्य से, गेरकिन कल्पना इसे ढूंढ लेगी और आपके एंड-टू-एंड परीक्षण विफल हो जाएंगे।

सुविधा काम नहीं करेगी, क्योंकि Logटूटी हुई है, इसलिए नहीं कि [Do your job with someInput]अपना काम नहीं कर रही है। और, वैसे, [Do your job with someInput]उस पद्धति के लिए एकमात्र जिम्मेदारी है।

इसके अलावा, मान लिया Logजाता है कि 100 अन्य सुविधाओं में, 100 अन्य वर्गों के 100 अन्य तरीकों में।

हां, 100 फीचर्स फेल हो जाएंगे। लेकिन, सौभाग्य से, 100 अंत-टू-एंड परीक्षण असफल हो रहे हैं और समस्या का खुलासा कर रहे हैं। और, हाँ: वे सच कह रहे हैं

यह बहुत उपयोगी जानकारी है: मुझे पता है कि मेरे पास एक टूटा हुआ उत्पाद है। यह बहुत भ्रमित करने वाली जानकारी है: यह मुझे बताता है कि समस्या कहां है। यह मुझे लक्षण बताता है, मूल कारण नहीं।

फिर भी, DoSomethingइकाई परीक्षण हरा है, क्योंकि यह एक नकली का उपयोग कर रहा है Log, कभी नहीं तोड़ने के लिए बनाया गया है। और, हाँ: यह स्पष्ट रूप से झूठ है । यह एक टूटी हुई सुविधा का संचार कर रहा है। यह कैसे उपयोगी हो सकता है?

(यदि मैं DoSomething()इकाई परीक्षण विफल रहता है, तो सुनिश्चित करें: [Do your job with someInput]कुछ कीड़े हैं।)

मान लीजिए कि यह एक टूटे हुए वर्ग के साथ एक प्रणाली है: टूटे हुए वर्ग के साथ एक प्रणाली

एक एकल बग कई सुविधाओं को तोड़ देगा, और कई एकीकरण परीक्षण विफल हो जाएंगे।

एक एकल बग कई सुविधाओं को तोड़ देगा, और कई एकीकरण परीक्षण विफल हो जाएंगे

दूसरी ओर, एक ही बग केवल एक इकाई परीक्षण को तोड़ देगा।

एक ही बग केवल एक इकाई परीक्षण को तोड़ देगा

अब, दो परिदृश्यों की तुलना करें।

एक ही बग केवल एक इकाई परीक्षण को तोड़ देगा।

  • टूटी हुई का उपयोग कर आपकी सभी विशेषताएं Logलाल हैं
  • आपके सभी यूनिट परीक्षण हरे हैं, केवल इकाई परीक्षण Logलाल है

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

अंतर

एकीकरण परीक्षण बताते हैं कि क्या काम नहीं कर रहा है। लेकिन वे अनुमान लगाने में किसी काम के नहीं हैं कि समस्या कहाँ हो सकती है।

यूनिट परीक्षण एकमात्र परीक्षण हैं जो आपको बताते हैं कि वास्तव में बग कहां है। इस जानकारी को आकर्षित करने के लिए, उन्हें एक नकली वातावरण में विधि को चलाना चाहिए, जहाँ अन्य सभी निर्भरताएँ सही ढंग से काम करने वाली हों।

इसलिए मुझे लगता है कि आपका वाक्य "या यह सिर्फ एक इकाई परीक्षण है जो 2 वर्गों तक फैला है" किसी तरह विस्थापित हो गया है। एक यूनिट टेस्ट में कभी भी 2 कक्षाएं नहीं होनी चाहिए।

यह उत्तर मूल रूप से मेरे द्वारा यहां लिखे गए का एक सारांश है: यूनिट परीक्षण झूठ बोलते हैं, इसलिए मैं उनसे प्यार करता हूं


6
एक बहुत अच्छा जवाब! हालाँकि मैं सिर्फ यह जोड़ना चाहता हूं कि केवल यूनिट टेस्ट के लिए मॉकिंग नहीं है। यह बहुत सारे एकीकरण परीक्षण मामलों में भी उपयोगी हो सकता है।
एन। सत्वंग

1
बहुत बढ़िया जवाब! मैं सिर्फ दो बिंदुओं से काफी सहमत नहीं हूं: 1) एकीकरण परीक्षण "यह अनुमान लगाने में कोई फायदा नहीं है कि समस्या कहां हो सकती है"; और 2) कि "एक इकाई परीक्षण को कभी भी 2 वर्ग नहीं करना चाहिए"। मैंने बहुत सारे एकीकरण परीक्षण बनाए, और जब वे टूटते हैं तो आमतौर पर समस्या के स्रोत को इंगित करना मुश्किल नहीं होता है, बशर्ते आपको एक पूर्ण स्टैक ट्रेस मिले, या एकल विफल अभिकथन (जिस स्थिति में स्रोत को खोजना कठिन हो, लेकिन इतना नहीं, क्योंकि एकीकरण परीक्षण डिबगिंग के लिए एक निहित संदर्भ प्रदान करता है)। (जारी है)
रोजेरियो

5
इकाई परीक्षण कई वर्गों का उपयोग कर सकते हैं, बशर्ते वे सार्वजनिक वर्ग न हों जिनकी अपनी अलग इकाई परीक्षण होना चाहिए। एक मामला तब है जब एक सार्वजनिक परीक्षण वर्ग अन्य गैर-सार्वजनिक सहायक वर्गों का उपयोग करता है जो केवल सार्वजनिक वर्ग का समर्थन करने के लिए मौजूद होते हैं; इस मामले में, "यूनिट" में दो या अधिक वर्ग शामिल हैं। एक और मामला यह है कि अधिकांश वर्ग तृतीय-पक्ष कक्षाओं (स्ट्रिंग / स्ट्रिंग वर्ग, संग्रह कक्षाएं, आदि) का उपयोग करते हैं, जो कि नकली या अलग-थलग होने का कोई मतलब नहीं है; हम बस उन्हें स्थिर और विश्वसनीय निर्भरता के रूप में मानते हैं जो परीक्षण के दायरे से बाहर हैं।
रोजेरियो

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

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

62

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

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


43

मेरे 10 बिट: डी

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

इंटीग्रेशन टेस्ट अगला कदम है, इसके एक या एक से अधिक घटकों को लेना और यह सुनिश्चित करना कि वे एक साथ काम करें जैसे कि उन्हें करना चाहिए .. आप फिर चिंता की जटिलताओं से ऊपर हैं कि घटक व्यक्तिगत रूप से कैसे काम करते हैं, लेकिन जब आप HTML को अपने HtmlEdititontrol में दर्ज करते हैं , तो यह किसी तरह जादुई अपने वैध या नहीं पता है ..

इसकी एक वास्तविक चल लाइन हालांकि .. मैं पूर्ण बंद ^ _ ^ काम करने के लिए लानत कोड प्राप्त करने पर अधिक ध्यान केंद्रित करूंगा


23

यूनिट टेस्ट में मोक्स का इस्तेमाल होता है

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


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

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

17

मुझे लगता है कि जब आप एकीकरण परीक्षणों के बारे में सोचना शुरू करते हैं, तो आप तार्किक परतों के बजाय भौतिक परतों के बीच एक क्रॉस के अधिक बोल रहे हैं।

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

तकनीकी रूप से आप वैसे भी सिर्फ एक-श्रेणी का परीक्षण नहीं कर सकते। क्या होगा यदि आपकी कक्षा कई अन्य वर्गों के साथ बनाई गई है? क्या यह स्वतः इसे एक एकीकरण परीक्षण बनाता है? मुझे ऐसा नहीं लगता।


8
"तकनीकी तौर पर आप वैसे भी सिर्फ एक-वर्ग का परीक्षण नहीं कर सकते। यदि आपकी कक्षा कई अन्य वर्गों से बनी हो तो क्या होगा?" ठीक है, एक "सख्त" इकाई परीक्षण सभी निर्भरताओं का सिर्फ मजाक / ठूंसा जाएगा। हालांकि, यह बहस का विषय है कि क्या यह हमेशा व्यावहारिक है ...
sleske

2
यह सच है - एक महत्वपूर्ण न्यूनतम करने के लिए निर्भरता रखने में सक्षम होने के लिए महत्वपूर्ण बिट है।
जॉन लीमजाप ऑक्ट

-1, एक इकाई परीक्षण किसी एकल सुविधा का परीक्षण नहीं करता है, लेकिन एक एकल सॉफ्टवेयर फ़ंक्शन या वर्ग, अर्थात यह सॉफ्टवेयर की तार्किक इकाई का परीक्षण करता है।
चार्ल्स बीपी

12

एकल जिम्मेदारी डिजाइन का उपयोग, इसके काले और सफेद। 1 से अधिक जिम्मेदारी, इसका एकीकरण परीक्षण।

बत्तख परीक्षण (लग रहा है, क्वैक, वाडल्स, इसकी एक बत्तख) द्वारा, इसकी सिर्फ 1 इकाई है जिसमें 1 से अधिक नए ऑब्जेक्ट हैं।

जब आप mvc में जाते हैं और इसका परीक्षण करते हैं, तो नियंत्रक परीक्षण हमेशा एकीकरण होते हैं, क्योंकि नियंत्रक में एक मॉडल इकाई और एक दृश्य इकाई दोनों होते हैं। उस मॉडल में परीक्षण तर्क, मैं एक इकाई परीक्षण कहूंगा।


10

आपके परीक्षणों की प्रकृति

मॉड्यूल X की एक इकाई परीक्षण एक ऐसा परीक्षण है जो केवल मॉड्यूल X में समस्याओं की अपेक्षा करता है (और जांचता है)।

एक एकीकरण परीक्षण कई मॉड्यूल का एक परीक्षण है कि उम्मीद है कि समस्याओं सहयोग से उत्पन्न होती हैं है के बीच मॉड्यूल ताकि इन समस्याओं मुश्किल इकाई परीक्षण अकेले का उपयोग कर खोजने के लिए किया जाएगा।

निम्नलिखित शब्दों में अपने परीक्षणों की प्रकृति के बारे में सोचें:

  • जोखिम में कमी : यही परीक्षण है। केवल यूनिट परीक्षणों और एकीकरण परीक्षणों का एक संयोजन आपको पूर्ण जोखिम में कमी दे सकता है, क्योंकि एक ओर इकाई परीक्षण स्वाभाविक रूप से मॉड्यूल के बीच उचित बातचीत का परीक्षण नहीं कर सकते हैं और दूसरी ओर एकीकरण परीक्षण केवल एक गैर-तुच्छ मॉड्यूल की कार्यक्षमता का उपयोग कर सकते हैं। एक छोटी सी डिग्री के लिए।
  • लेखन लेखन का प्रयास : एकीकरण परीक्षण प्रयास को बचा सकते हैं क्योंकि आपको तब स्टब्स / फेक / मोक्स लिखने की आवश्यकता नहीं हो सकती है। लेकिन यूनिट परीक्षण प्रयास को भी बचा सकते हैं, लागू करते समय (और बनाए रखने के लिए!) उन स्टब्स / फेक / मोक्स के बिना परीक्षण सेटअप को कॉन्फ़िगर करने की तुलना में अधिक आसान होता है।
  • परीक्षण निष्पादन में देरी : हेवीवेट संचालन (जैसे डीबी या रिमोट सर्वर जैसी बाहरी प्रणालियों तक पहुंच) सहित एकीकरण परीक्षण धीमा (एर) हो जाते हैं। इसका मतलब है कि यूनिट परीक्षणों को अधिक बार निष्पादित किया जा सकता है, जो कुछ भी विफल होने पर डिबगिंग के प्रयास को कम कर देता है, क्योंकि आपके पास एक बेहतर विचार है कि आप इस बीच क्या बदल गए हैं। यह विशेष रूप से महत्वपूर्ण हो जाता है यदि आप परीक्षण-संचालित विकास (टीडीडी) का उपयोग करते हैं।
  • डिबगिंग का प्रयास : यदि एक एकीकरण परीक्षण विफल हो जाता है, लेकिन यूनिट परीक्षणों में से कोई भी नहीं करता है, तो यह बहुत असुविधाजनक हो सकता है, क्योंकि इसमें बहुत अधिक कोड शामिल होता है जिसमें समस्या हो सकती है। यह एक बड़ी समस्या नहीं है यदि आपने पहले केवल कुछ पंक्तियों को बदल दिया है - लेकिन जैसा कि एकीकरण परीक्षण धीरे-धीरे चलते हैं, आपने शायद उन्हें इतने कम अंतराल में नहीं चलाया ...

याद रखें कि एक एकीकरण परीक्षण अभी भी अपनी कुछ निर्भरता को दूर / नकली / नकली कर सकता है । यह यूनिट परीक्षणों और सिस्टम परीक्षणों (सबसे व्यापक एकीकरण परीक्षण, सिस्टम के सभी परीक्षण) के बीच बहुत सारे मध्य मैदान प्रदान करता है।

दोनों का उपयोग करने के लिए व्यावहारिक दृष्टिकोण

तो एक व्यावहारिक दृष्टिकोण होगा: लचीलेपन से एकीकरण परीक्षणों पर उतना ही भरोसा करें जितना आप समझदारी से कर सकते हैं और यूनिट परीक्षणों का उपयोग कर सकते हैं जहां यह बहुत जोखिम भरा या असुविधाजनक होगा। सोचने का यह तरीका यूनिट परीक्षणों और एकीकरण परीक्षणों के कुछ हठधर्मी भेदभाव से अधिक उपयोगी हो सकता है।


10

यूनिट टेस्ट में आप प्रत्येक भाग को अलग-थलग करते हैं: यहां छवि विवरण दर्ज करें

एकीकरण परीक्षण में आप अपने सिस्टम के कई मॉड्यूल का परीक्षण करते हैं:

यहां छवि विवरण दर्ज करें

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

यहां छवि विवरण दर्ज करें

स्रोत: source1 source2


आपके पास तीन चित्र हैं लेकिन केवल दो स्रोत हैं।
जेरिट

1
@gerrit पहले स्रोत पर एक नज़र - दो तस्वीरें वहाँ से हैं
Michu93

1
इस उत्तर से प्यार करें this
19-22 को डीजेनिस एच।

8

मेरी राय में इसका जवाब "यह क्यों होता है?"

क्या यह इसलिए है क्योंकि इकाई परीक्षण कुछ आप करते हैं और एकीकरण परीक्षण कुछ आप नहीं हैं? या ठीक इसके विपरीत? बेशक, आपको दोनों करने की कोशिश करनी चाहिए।

क्या यह इसलिए है क्योंकि यूनिट परीक्षणों को फास्ट, पृथक, दोहराने योग्य, स्व-वैध और समय पर करने की आवश्यकता है और एकीकरण परीक्षण नहीं होना चाहिए? बेशक, सभी परीक्षण ये होने चाहिए।

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

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

इसका कोई महत्व नहीं है।

परीक्षण महत्वपूर्ण है, FIRST महत्वपूर्ण है, परिभाषाओं के बारे में बालों को विभाजित करना समय की बर्बादी है जो केवल नए लोगों को परीक्षण के लिए भ्रमित करता है।


5
-1 परिभाषा वह है जो लोगों को बिना बताए समान शब्दों का उपयोग करने में सक्षम बनाती है, जो उनका मतलब है और सहयोग के लिए आवश्यक है। जैसे कि दोनों धारणाओं के बीच के अंतर को समझना आवश्यक है।
चार्ल्स जुएल

जैसा कि @CharlesB ने उल्लेख किया है कि यह महत्वपूर्ण है इसलिए हर बार समझाने या हर किसी को भ्रम पैदा करने की एक अलग परिभाषा है। टेस्ट को अलग तरीके से लिखा जाएगा और अलग तरह से चलाया जाएगा, लेकिन इससे यह नहीं पता चलता है कि दोनों को मतभेदों को परिभाषित करने के लिए नहीं करना चाहिए।
शेन

जवाब के निष्कर्ष चरम हो सकता है, लेकिन इसकी अंक से ज्यादातर काफी मान्य हैं: यूनिट परीक्षण और एकीकरण परीक्षण कर रहे हैं ज्यादातर एक ही बात उनके विवरण के स्तर को के अलावा - और यह स्पष्ट है, जहां एक लाइन उन दोनों के बीच तैयार किया जाना चाहिए नहीं है।
लुत्ज प्रेचल

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

4

मुझे लगता है कि मैं अभी भी इंटरैक्टिंग कक्षाओं के एक जोड़े को एक यूनिट टेस्ट कहूंगा, बशर्ते कि क्लास 1 के लिए यूनिट टेस्ट क्लास 1 की विशेषताओं का परीक्षण कर रहे हों, और क्लास 2 के लिए यूनिट टेस्ट इसकी विशेषताओं का परीक्षण कर रहे हों, और यह भी कि वे डेटाबेस को नहीं मार रहे हैं।

मैं एक परीक्षण को एक एकीकरण परीक्षण कहता हूं जब यह मेरे ढेर के माध्यम से चलता है और यहां तक ​​कि डेटाबेस को हिट करता है।

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


4

मैं ऐसा ही करता हूं - मैं उन्हें सभी यूनिट परीक्षण कहता हूं, लेकिन कुछ बिंदु पर मेरे पास एक "यूनिट टेस्ट" है, जो इतना कवर करता है कि मैं अक्सर इसका नाम बदलकर "..IntegrationTest" करता हूं - केवल एक नाम बदल जाता है, और कुछ नहीं बदलता है।

मुझे लगता है कि "परमाणु परीक्षणों" (एक छोटे वर्ग, या एक विधि) से लेकर यूनिट परीक्षण (कक्षा स्तर) और एकीकरण परीक्षण - और फिर कार्यात्मक परीक्षण (जो आमतौर पर ऊपर से नीचे बहुत अधिक सामान को कवर कर रहे हैं) का एक निरंतरता है। - वहाँ एक साफ कट बंद प्रतीत नहीं होता है।

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


4

यूनिट टेस्टिंग परीक्षण का एक तरीका है जो स्रोत कोड की व्यक्तिगत इकाइयों की पुष्टि करता है कि वे ठीक से काम कर रहे हैं।

एकीकरण परीक्षण सॉफ्टवेयर परीक्षण का चरण है जिसमें व्यक्तिगत सॉफ्टवेयर मॉड्यूल को एक समूह के रूप में संयोजित और परीक्षण किया जाता है।

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


4

एकीकरण परीक्षण: डेटाबेस दृढ़ता का परीक्षण किया जाता है।
यूनिट परीक्षण: डेटाबेस एक्सेस का मज़ाक उड़ाया जाता है। कोड विधियों का परीक्षण किया जाता है।


3

यदि आप चाहें तो यूनिट परीक्षण कार्य की इकाई या कोड के ब्लॉक के खिलाफ परीक्षण कर रहा है। आमतौर पर एकल डेवलपर द्वारा प्रदर्शन किया जाता है।

एकीकरण परीक्षण से अभिप्राय उस परीक्षण से है, जो अधिमानतः एक एकीकरण सर्वर पर होता है, जब एक डेवलपर अपने कोड को स्रोत नियंत्रण भंडार में भेजता है। एकीकरण परीक्षण क्रूज नियंत्रण जैसे उपयोगिताओं द्वारा किया जा सकता है।

तो आप अपने यूनिट परीक्षण को यह सत्यापित करने के लिए करते हैं कि आपके द्वारा निर्मित कार्य की इकाई काम कर रही है और फिर एकीकरण परीक्षण यह पुष्टि करता है कि आपने रिपॉजिटरी में जो कुछ भी जोड़ा है वह कुछ और नहीं टूटा।


2

मैं यूनिट परीक्षण उन परीक्षणों को कहता हूं जो सफेद बॉक्स एक वर्ग का परीक्षण करते हैं। कोई भी निर्भरता जो वर्ग की आवश्यकता होती है, नकली (नकली) के साथ बदल दी जाती है।

एकीकरण परीक्षण वे परीक्षण हैं जहां एक ही समय में कई वर्गों और उनके इंटरैक्शन का परीक्षण किया जाता है। इन मामलों में केवल कुछ निर्भरताएं नकली / नकली हैं।

मैं कंट्रोलर के एकीकरण परीक्षणों को तब तक नहीं कहूंगा जब तक कि उनकी निर्भरता में से एक वास्तविक न हो (अर्थात फेक नहीं) (जैसे IFormsAuthentication)।

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

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


2

सादृश्य के साथ सरल व्याख्या

उपरोक्त उदाहरण बहुत अच्छा करते हैं और मुझे उन्हें दोहराने की आवश्यकता नहीं है। इसलिए मैं आपको समझने में मदद करने के लिए उदाहरणों का उपयोग करने पर ध्यान केंद्रित करूंगा।

एकीकरण टेस्ट

एकीकरण परीक्षण यह जांचते हैं कि क्या सब कुछ एक साथ काम कर रहा है। एक घड़ी में एक साथ काम करने वाले cogs की एक श्रृंखला की कल्पना करें। एक एकीकरण परीक्षण होगा: क्या घड़ी सही समय बता रही है? क्या यह अभी भी 3 दिनों में सही समय बता रहा है?

यह सब आपको बताता है कि क्या समग्र टुकड़ा काम कर रहा है। यदि यह विफल रहता है: यह आपको यह नहीं बताता कि यह कहाँ असफल हो रहा है।

यूनिट टेस्ट

ये वास्तव में विशिष्ट प्रकार के परीक्षण हैं। वे आपको बताते हैं कि क्या कोई विशिष्ट चीज काम कर रही है या असफल हो रही है। इस प्रकार के परीक्षण की कुंजी यह है कि यह केवल एक विशिष्ट चीज का परीक्षण करता है, जबकि यह मानते हुए कि बाकी सब कुछ ठीक काम कर रहा है। यही प्रमुख बिंदु है।

उदाहरण: आइए एक उदाहरण का उपयोग करके इस बिंदु पर विस्तृत करें:

  • एक उदाहरण के रूप में एक कार लेते हैं।
  • एक कार के लिए एकीकरण परीक्षण: जैसे कार Woop Woop और वापस ड्राइव करता है? यदि यह ऐसा करता है, तो आप सुरक्षित रूप से कह सकते हैं कि एक कार समग्र दृष्टिकोण से काम कर रही है। यह एक एकीकरण परीक्षण है। यदि यह विफल रहता है तो आपको पता नहीं है कि यह वास्तव में कहाँ विफल हो रहा है: क्या यह रेडिएटर, ट्रांसमिशन, इंजन, या कार्बोरेटर है? तुम्हें कुछ पता नहीं है। यह कुछ भी हो सकता है।
  • एक कार के लिए यूनिट परीक्षण : क्या इंजन काम कर रहा है? यह परीक्षण मानता है कि कार में बाकी सब कुछ ठीक काम कर रहा है। इस तरह, अगर यह विशेष इकाई परीक्षण विफल हो जाता है: आप बहुत आश्वस्त हो सकते हैं कि समस्या इंजन में निहित है - इसलिए आप समस्या को जल्दी से अलग कर सकते हैं और ठीक कर सकते हैं।

स्टब्स का उपयोग करना

  • मान लीजिए कि आपकी कार एकीकरण परीक्षण विफल हो जाता है। यह Echuca के लिए सफलतापूर्वक ड्राइव नहीं करता है। समस्या कहाँ हे?

  • अब मान लेते हैं कि आपका इंजन एक विशेष ईंधन इंजेक्शन प्रणाली का उपयोग करता है और यह इंजन इकाई परीक्षण भी विफल हो गया है। दूसरे शब्दों में, एकीकरण परीक्षण और इंजन इकाई परीक्षण दोनों विफल रहे हैं। फिर समस्या कहां है? (जवाब पाने के लिए खुद को 10 सेकंड दें।)

  • इंजन के साथ समस्या है, या ईंधन इंजेक्शन प्रणाली के साथ?

आप यहाँ समस्या देखते हैं? आप नहीं जानते कि वास्तव में क्या असफल हो रहा है। यदि आप अलग-अलग बाहरी निर्भरता का उपयोग करते हैं, तो उन 10 में से हर एक समस्या का कारण हो सकता है - और आपको नहीं पता होगा कि कहां से शुरू करना है। यही कारण है कि यूनिट परीक्षण यह मानने के लिए स्टब्स का उपयोग करते हैं कि बाकी सब कुछ ठीक काम कर रहा है।


1

यह सवाल थोड़ा सा अकादमिक है, है ना? ;-) मेरा नज़रिया: मेरे लिए एक एकीकरण परीक्षण पूरे भाग की परीक्षा है, न कि यदि दस में से दो भाग एक साथ चल रहे हैं। हमारे एकीकरण परीक्षण से पता चलता है, अगर मास्टर निर्माण (40 परियोजनाओं से युक्त) सफल होगा। परियोजनाओं के लिए हमारे पास कई टन यूनिट परीक्षण हैं। मेरे लिए इकाई परीक्षणों से संबंधित सबसे महत्वपूर्ण बात यह है कि एक इकाई परीक्षण किसी अन्य इकाई परीक्षण पर निर्भर नहीं होना चाहिए। तो मेरे लिए आपके द्वारा ऊपर वर्णित दोनों परीक्षण इकाई परीक्षण हैं, यदि वे स्वतंत्र हैं। एकीकरण परीक्षणों के लिए यह महत्वपूर्ण नहीं होना चाहिए।


1

क्या ये परीक्षण अनिवार्य रूप से एकीकरण परीक्षण बन गए हैं क्योंकि वे अब इन 2 वर्गों के एकीकरण का परीक्षण करते हैं? या यह केवल एक इकाई परीक्षण है जो 2 वर्गों तक फैला है?

मुझे लगता है कि हां और हां। आपकी इकाई परीक्षण जो 2 वर्गों तक फैला है, एक एकीकरण परीक्षण बन गया।

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

वास्तविक अंतर का निर्गमन 1 निम्नलिखित हो सकता है) 1,000,000 तत्वों का सरणी आसानी से परीक्षण किया और ठीक काम करता है। 2) बबलोर्ट आसानी से 10 तत्वों की नकली सरणी पर परीक्षण की गई इकाई है और ठीक 3 भी काम करता है) एकीकरण परीक्षण से पता चलता है कि कुछ इतना ठीक नहीं है।

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


1

इसके अलावा, यह याद रखना महत्वपूर्ण है कि दोनों यूनिट परीक्षण और एकीकरण परीक्षण स्वचालित और लिखित रूप से उपयोग किए जा सकते हैं, उदाहरण के लिए, JUnit। JUnit एकीकरण परीक्षणों में, org.junit.Assumeपर्यावरण तत्वों (जैसे, डेटाबेस कनेक्शन) या अन्य स्थितियों की उपलब्धता का परीक्षण करने के लिए वर्ग का उपयोग किया जा सकता है ।


0

यदि आप एक टीडीडी शुद्धतावादी हैं, तो उत्पादन कोड लिखने से पहले आप परीक्षण लिखते हैं। बेशक, परीक्षण संकलित नहीं करेंगे, इसलिए आप पहले परीक्षण संकलन करते हैं, फिर परीक्षण पास करते हैं।

आप इसे यूनिट परीक्षणों के साथ कर सकते हैं, लेकिन आप एकीकरण या स्वीकृति परीक्षणों के साथ नहीं कर सकते। यदि आपने एक एकीकरण परीक्षण के साथ प्रयास किया है, तो कुछ भी कभी भी संकलित नहीं होगा जब तक आप समाप्त नहीं कर लेते!

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