2008-10-14 12 views
13

कभी-कभी मुझे एक अच्छी चीज होने के लिए बहुत brittle test मिलती है क्योंकि जब मैं परीक्षण के तहत कोड का इरादा बदलता हूं, तो मैं यह सुनिश्चित करना चाहता हूं कि मेरा यूनिट टेस्ट ब्रेक हो ताकि मुझे रिफैक्टर करने के लिए मजबूर किया जा सके ... क्या यह दृष्टिकोण अनुशंसित नहीं है जब रिग्रेशन परीक्षण का एक बड़ा सूट बनाते हैं?भंगुर इकाई परीक्षण हमेशा एक बुरी चीज हैं?

उत्तर

8

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

मैं कहूंगा कि आपको हमेशा कम से कम भंगुर परीक्षणों का लक्ष्य रखना चाहिए जो आप अपने कार्य/मॉड्यूल का पूरी तरह से परीक्षण कर सकते हैं, लेकिन यदि आपके पास 1 या 2 भंगुर हैं तो आपको ज्यादातर मामलों में ठीक होना चाहिए।

6

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

बस यह सुनिश्चित करें कि आपके परीक्षण वास्तव में आपके ऐप कोड के हर पहलू को कवर करते हैं। (कारण के भीतर)।

12

इकाई परीक्षण भंगुर होना चाहिए - यह उन्हें तोड़ने के लिए आसान होना चाहिए। यदि वे तोड़ते नहीं हैं, तो वे यूनिट परीक्षण नहीं हैं; वे कोड टिप्पणियां हैं।

...

या क्या मुझे प्रश्न का मुद्दा याद आ रहा है?


संपादित करें: मैं अपने पहले जवाब स्पष्ट करना चाहिए।

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

+0

मैं असहमत हूं, भंगुर परीक्षणों को ठीक करने का मतलब बहुत से बनाए रखना है। इकाई परीक्षण के प्रयोजनों में से एक बनाए रखने को कम करना है। यूनिटटेस्ट में विफल होने के लिए केवल एक तार्किक कारण होना चाहिए। – Restuta

+1

@Restuta यूनिट परीक्षण का उद्देश्य यह लागू करना है कि वे व्यवहार या विधियां सुसंगत रहती हैं। बग के खिलाफ स्थिरता गार्ड लागू करना। इन बगों को पकड़ने से कम रखरखाव होता है। प्रभाव के साथ उद्देश्य भ्रमित मत करो। – ArtB

+0

@Restuta मुझे लगता है कि भंगुर लेखक का मतलब है कि यूनिट परीक्षण गलत कारणों से तोड़ता है। परीक्षणों को तोड़ना चाहिए यदि आपकी परीक्षण विधि गलत व्यवहार करती है, यदि परीक्षण अन्य परिवर्तन/निर्भरताओं के कारण आसानी से टूट जाते हैं तो वे "भंगुर" होते हैं। –

5

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

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

एक यादृच्छिक रूप से भंगुर परीक्षण की एक निश्चित "गंध" एक परीक्षण में नींद() फ़ंक्शन का उपयोग है।

+0

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

+0

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

3

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

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

3

कोड में कोई बदलाव एक वर्ग के लिए "आंतरिक" (यानी एपीआई बदल नहीं) होना है, विफल एक परीक्षण का कारण बनता है, वहाँ दो संभावनाएं हैं:

  1. कोड एक नया बग है, या
  2. कोड सही है, परीक्षण फिक्सिंग # 2 को कम करने के

प्रयास की जरूरत है। वे 'भंगुर' परीक्षण हैं।

0

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

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

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

उस समस्या से बचने का सबसे अच्छा तरीका उन वर्गों को लिखने से बचाना है जिन्हें बदलने की जरूरत है। सॉलिड सिद्धांतों का पालन करते समय यह वास्तव में आसान लगता है।

+1

* ब्लैंटेंट स्व-पदोन्नति: * मेरे पास इस ब्लॉग पर मेरे ब्लॉग पर एक श्रृंखला है। भाग 1 यहां है: http://www.readytorocksd.com/the-brittleness-of-unit-tests/। –

संबंधित मुद्दे