क्या यह इकाई परीक्षण विधियों के लिए उपयोगी है जहां एकमात्र तर्क गार्ड है?


12

कहो कि मेरे पास एक तरीका है:

public void OrderNewWidget(Widget widget)
{
   if ((widget.PartNumber > 0) && (widget.PartAvailable))
   {
        WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber);
   }
}

मेरे पास मेरे कोड (async वेब सेवा कॉल के सामने आधा) में कई ऐसे तरीके हैं।

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

मेरे हिस्से में कहा गया है "सुनिश्चित करें कि आप उन्हें परीक्षण कर सकते हैं, लेकिन यह समय के लायक नहीं है" (मैं एक परियोजना पर हूं जो पहले से ही कार्यक्रम के पीछे है)।

लेकिन मेरे दूसरे पक्ष का कहना है, अगर आप यूनिट का परीक्षण नहीं करते हैं, और कोई व्यक्ति गार्ड बदलता है, तो समस्या हो सकती है।

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

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

मैं दोनों तरीकों से पेशेवरों और विपक्षों को देखता हूं। इसलिए मैंने सोचा कि मैं पूछूंगा कि दूसरों ने क्या किया है।


17
आप अनुरक्षकों के लिए "अधिक काम" नहीं कर रहे हैं। यदि वे तर्क बदलते हैं, तो उन्हें संबंधित इकाई परीक्षणों को बदलना होगा। यह वैसे काम करता है। मुझे आपका विपक्ष दिखाई नहीं देता: यदि आपकी इकाई परीक्षण को बदलने की आवश्यकता नहीं है, तो यह कुछ भी परीक्षण नहीं करेगा, क्या यह होगा? आप यह भी सवाल कर सकते हैं कि क्या इकाई परीक्षण उपयोगी है।
एंड्रेस एफ।

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

2
@ मट्टू बहुत अच्छी बात है। यह फ़ंक्शन झूठ है। नामकरण आपको बताता है कि यह कुछ ऑर्डर करने वाला है। और तब यह नहीं होता है लेकिन आप कभी भी नहीं जान पाएंगे, जब तक कि आप उसी तर्क को लागू नहीं करते हैं जैसा कि अंदर है, जो कि DRY को दर्शाता है। दूसरे शब्दों में: यदि डिज़ाइन को और अधिक सही करने के लिए बदल दिया जाता है, तो यह सवाल शायद पहली जगह में नहीं पूछा जाएगा।
21

2
but it is not worth the time" (I am on a project that is already behind schedule).हम सॉफ्टवेयर डेवलपर हैं। केवल समय हम समय पर कर रहे हैं जब हम मर चुके हैं :) है
maple_shaft

जवाबों:


26

मेरे हिस्से में कहा गया है "सुनिश्चित करें कि आप उन्हें परीक्षण कर सकते हैं, लेकिन यह समय के लायक नहीं है" (मैं एक परियोजना पर हूं जो पहले से ही कार्यक्रम के पीछे है)।

यह तीन बहुत छोटे परीक्षण हैं। आपने खुद को सवाल पूछने में ज्यादा समय दिया।

लेकिन मेरे दूसरे पक्ष का कहना है, अगर आप यूनिट का परीक्षण नहीं करते हैं, और कोई व्यक्ति गार्ड बदलता है, तो समस्या हो सकती है।

इस पक्ष को सुनो।

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

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

आप का पहला हिस्सा सिर्फ सादा गलत है। दूसरे हिस्से को पीठ पर थपथपाएं और इसके बारे में सोचना बंद करें।


+1 आत्महत्या के लिए भले ही मैंने एक उत्तर लिखा हो, वह भी
जिमी होफा

3
+1। हां, यदि आवश्यकताएं बदलती हैं, तो कुछ परीक्षणों को अनुकूलित करना होगा।
ओलिवियर जैकोट-डेसकॉम्ब्स

जबकि मुझे पसंद है कि आप क्या कहते हैं, मेरे पास इस तरह के कॉल के कई उदाहरण हैं मेरे कोड में (एक async कॉल के सामने आधा)। तो यह सिर्फ 3 इकाई परीक्षण नहीं है। फिर भी, अगर यह "सही" तरीका है तो मैं उन्हें पूरा करना चाहता हूं।
21

@Vaccano: उनमें से आपको जितना अधिक लिखना है, उतने अधिक तार्किक पथ आपके लिए परीक्षण नहीं हैं और उन्हें लिखना जितना आवश्यक है।
पीडी

9

अगर गार्ड लॉजिक और वास्तविक ऑर्डरिंग अलग तरीके थे तो यह यूनिट टेस्टिंग को आसान बना देगा।

में Widgetवर्ग

public bool IsReadyForOrdering { get { return PartNumber > 0 && PartAvailable; } }

या समकक्ष विधि कहीं और

public bool IsWidgetReadyForOrdering(Widget widget)
{
    return widget.PartNumber > 0 && widget.PartAvailable;
}

क्रम विधि

public void OrderNewWidget(Widget widget)
{
   if (IsWidgetReadyForOrdering(widget)) {
        WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber);
   }
}

अब परीक्षण IsWidgetReadyForOrderingआसान हो गया। एक लंबे समय के बारे में किसी भी अधिक नहीं लगता है। झसे आज़माओ!


1
Oof, किसी प्रॉपर्टी में स्टेटफुल लॉजिक .. -1 जो ​​कि एक तरीका होना चाहिए और इसे पार्टनंबर, पार्टअवलेप लेना चाहिए क्योंकि यह सादगी है। अगर यह सार्वजनिक एपीआई का हिस्सा नहीं बल्कि संपत्ति नहीं है, तो इसे संरक्षित करें। इसके अलावा मैं आमतौर पर असहमत हूं। विधि के अंदर गार्ड तर्क पूरी तरह से ठीक है, और मेरी नज़र में बेहतर है क्योंकि यह एक ऐसी छोटी विधि है जिससे आप कक्षा को पहले से ही छोटी विधि को छोटा बनाने के लिए प्रदूषण कर रहे हैं। इसे इस मामले में कक्षा में जोड़ें जब यह दोहरावदार तर्क हो।
जिमी हॉफ

1
सबसे पहले, यह सवाल का जवाब नहीं है। दूसरा, यह असत्य है। आपको तीन तरह से परीक्षण लिखने की आवश्यकता है। तीसरा, यह अनावश्यक रूप से कॉलिंग कोड के कार्यान्वयन विवरणों को उजागर करता है।
पीडीआर

8
@ जिमीहॉफ: आपको उस संपत्ति में कोई भी राज्य संबंधी तर्क कहाँ दिखाई देता है? वास्तव में, उदाहरण दिखाता है कि राज्य-बदलते लॉजिक (ऑर्डरन्यूविजेट) को गैर-स्टेटिंग लॉजिक (रेडीफ़ोरऑर्डरिंग) से कैसे अलग किया जाए। और मैं एक मजबूत आस्तिक हूं जो कि छोटे कार्यों को निकालने पर भी कोड में सुधार करेगा, और इसे खराब नहीं करेगा, जैसा कि आप कहते हैं। तो +1।
डॉक्टर ब्राउन

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

2
@ जिमीहॉफ: वास्तव में, "स्टेटलेस" की आपकी परिभाषा का अर्थ है "स्टैटिक" इन सी #। इस प्रकार, आप जो कहते हैं, "गुणों को किसी वस्तु की स्थिति तक नहीं पहुंचना चाहिए"। लेकिन यहां तक ​​कि गूंगा प्राप्त करने वालों को राज्य चर तक पहुंच मिलती है, इसलिए इसका मतलब होगा "केवल स्थिर गुण लिखना" - जो बहुत अधिक समझ में नहीं आता है।
डॉक्टर ब्राउन

6

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

कहा कि, गार्ड के बयानों के परीक्षण के आपके सामान्य प्रश्न के लिए; हाँ! बिल्कुल गार्ड के बयानों का परीक्षण करें! उन है कि विधि, आप एक बग ठीक कर किसी को गलत समझा कुछ पता लगाने के लिए नहीं करना चाहते हैं और अपने गार्ड को निकालने या बदलने होता के व्यवहार के महत्वपूर्ण हिस्से हैं &&एक करने के लिए ||क्या तुम करोगी? इकाई परीक्षण यह सुनिश्चित करेगा कि क) आपको वास्तव में अपने गार्ड पर तर्क सही और बी मिला है) कोई भी उस तर्क के बिना बाद में कोई शिकायत प्राप्त नहीं करता है जब वे इकाई परीक्षण चलाते हैं, तो उन्हें यह बताना चाहिए कि यह किसी कारण से ऐसा होना चाहिए।


0

ऊपर कुछ उत्कृष्ट उत्तर हैं, और उनके द्वारा बनाए गए बिंदु बहुत महत्वपूर्ण हैं। लेकिन ऐसा लगता है कि याद किया गया है कि आप में यूनिट परीक्षणों का एक व्यापक सेट है, वे कोड के एक अत्यंत विस्तृत विनिर्देश की तरह पढ़ते हैं। यदि आप परीक्षण सत्यापन को केवल इसलिए छोड़ देते हैं क्योंकि कोड इतना आसान है कि यह देखना मुश्किल है कि यह कैसे गलत हो सकता है, तो आपके विनिर्देश का हिस्सा गायब है। अगर मैं ऐसी टीम में आया था जहाँ ये परीक्षण छूट गए थे, तो मैं वास्तव में मान सकता हूँ कि आपकी सेवा अपने तर्कों को मान्य नहीं कर रही थी।


-5

कोड है। परीक्षण करते समय आपको 100% कवरेज प्राप्त करने का प्रयास करना चाहिए। यदि यह महत्वपूर्ण नहीं होता तो यह नहीं होता।

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