2011-04-13 10 views
7

क्या कक्षा में परीक्षण विधियों को उसी कक्षा में डालने में कुछ गड़बड़ है, जिस कक्षा में आप परीक्षण कर रहे हैं?क्या आप जिस कक्षा में परीक्षण कर रहे हैं उसमें परीक्षण विधियों को डालने में कुछ गड़बड़ है?

तो प्रत्येक वर्ग में [टेस्टफिक्चर] विशेषता जोड़ें और वास्तविक विधियों के साथ [टेस्ट] विधि जोड़ें।

मुझे यह विचार पसंद है। सब कुछ एक ही स्थान पर रखता है।

लेकिन क्या, यदि कोई है, तो इसके लिए डाउनसाइड्स हैं?

/मैं नुनिट और सी # का उपयोग करता हूं।

+0

अत्यधिक प्रोग्रामिंग? – Arseny

+2

हां- मैं चरम हूं। धन्यवाद – arkina

+0

यदि आप निजी तरीकों का परीक्षण करना चाहते हैं, तो उन्हें आंतरिक रूप से चिह्नित करें और उन्हें कॉल करने के लिए, अपनी परीक्षण विधियों को अनुमति देने के लिए 'आंतरिक दृश्यमान' का उपयोग करें, जो कि एक अलग असेंबली में अभी भी हैं। यह सफेद-बॉक्स परीक्षण के लिए उपयोगी है। – Brian

उत्तर

20

हां यह टालने के लिए एक पैटर्न है। टेस्ट में कम से कम निम्न कारणों

  • एक अलग विधानसभा में परीक्षण करने के बाद सुनिश्चित करें कि आप एक प्रयोग करने योग्य एपीआई है के रूप में वे private/protected निर्माणों के माध्यम से धोखा नहीं कर सकते मदद के लिए आपके शिपिंग कोड से एक पूरी तरह से अलग इकाई होना चाहिए। इसके बजाए उन्हें सार्वजनिक एपीआई अंक
  • के माध्यम से जाने के लिए मजबूर होना पड़ता है, उसी असेंबली में परीक्षण होने का मतलब है कि आपके उत्पादन कोड में आपका टेस्ट कोड भी शामिल है। ग्राहक को कोड भेजने का कोई कारण नहीं है कि वे वास्तव में
  • असेंबली पर निर्भरता लेने के लिए उत्पादन कोड का कारण बनते हैं (नुनिट, xunit, आदि ...)
  • कई परीक्षण ढांचे के लिए परीक्षण विधियों की आवश्यकता होती है सार्वजनिक होने के कारण यह आपके एपीआई की सार्वजनिक सतह पर परीक्षण चलाता है।
  • उन्हें एक ही विधानसभा में होने खोलता उत्पादन कोड के लिए दरवाजा गलती से परीक्षण कोड में बुला और इसलिए मज़ा उत्पादन वातावरण
+1

अच्छा बिंदु। – RQDQ

+1

कुछ भी अच्छे कारण नहीं हैं। उसके लिए ++। सभी कारणों के कारण: चिंताओं को अलग करना। – Steven

4

सबसे बड़ा नकारात्मक पक्ष: आपको अपने परीक्षणों को शिप करना होगा, और वे संभावित रूप से आपके सार्वजनिक एपीआई का हिस्सा बन जाएंगे।

+0

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

+0

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

6

हां। यह एकल उत्तरदायित्व सिद्धांत तोड़ देगा। यह पठनीयता को कम करेगा। आप अपने परीक्षण ढांचे पर निर्भरता जोड़ते हैं।

+1

+1। निर्भरता मुद्दे पर – Steven

1

मेरे सिर के ऊपर से सबसे बड़ी समस्या यह है कि आप अपने उत्पाद परीक्षण को अंतिम उत्पाद (इसलिए निर्भरता भी) के हिस्से के रूप में अपने कोड-बेस में वितरित नहीं करना चाहते हैं।

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

क्यों नहीं यह करने के लिए से संबंधित तो मई पहलुओं रहे हैं, उत्तरों की सरणी में एक उदाहरण प्रस्तुत किया के रूप में पहले से ही में बाढ़ - बस यह मत करो।

8

यह दृष्टिकोण मेरी आत्मा grates में पॉपिंग हो पाता है।

मुझे लगता है कि यह आपके टेस्ट कोड को आपके उत्पादन कोड से अलग रखने के लिए बहुत अधिक समझ में आता है। कई कारण:

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

सभी के अधिकांश:

यह सिर्फ मैदानों का मानना ​​है/गलत बदबू आ रही है।

+0

सहमत हैं। मेरे उत्तर से बेहतर :) –

2

डाउनसाइड्स?

आपके वर्ग तकनीकी रूप से उत्पादन वातावरण में उपयोग की आवश्यकता के मुकाबले अधिक तरीके से होंगे। आपके पास nnnit के संदर्भ भी होंगे कि आपको उत्पादन वातावरण में आवश्यकता नहीं है।

आप यहां कर्तव्यों को अलग करना भी तोड़ रहे हैं। आपकी कक्षा को नौकरी करना है, आपका परीक्षण यह सत्यापित करना है कि आपकी कक्षा अपना काम कर सकती है।

2

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

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

0

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

आप सिर्फ उन्हें एक ही फाइल में डाल अपने परीक्षण अपनी कक्षा के साथ सही एक साथ होना चाहते हैं,:

public class Foo : IFoo 
{ 
    ... 
} 

[TestFixture] 
public class Foo_Tests 
{ 
    ... 
} 
+0

बेहतर, लेकिन वे अभी भी एक ही असेंबली में होंगे और फिर भी परीक्षण ढांचे पर निर्भरता का कारण बनेंगे, असेंबली आकार को फटकारेंगे, समांतर विकास में बाधा डालेंगे, आदि – RQDQ

2

शॉर्टकट लेने के लिए नहीं करना चाहती।

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

यह परीक्षण परियोजनाओं में समूह परीक्षण कक्षाओं के लिए बहुत अच्छा है। ये तब परीक्षण किए जा रहे कोड को प्रभावित नहीं करते हैं, और आपके पास कौन सा कोड है इसका अवलोकन रखना बहुत आसान है।

इसी तरह, आप यूआई और व्यापार तर्क कोड मिश्रण नहीं करते हैं।

तो कृपया, कृपया, कृपया, कृपया अपने विषयों के परीक्षण के तहत परीक्षणों को मिश्रण न करें!

1

मेरे दो सेंट में फेंक करने के लिए:

मैं पदों यहाँ के सबसे से सहमत हूँ करते हुए कहा कि परीक्षण तरीकों बनाने/परीक्षण के एकमात्र उद्देश्य के लिए काम करता है बेकार है और संभवतः, संरचनात्मक रूप से अव्यवस्थित है।

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

अब आपकी विधि कार्यात्मक और टेस्टेबल है, यानी कार्यात्मक परीक्षण।

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

मुझे उम्मीद है कि इससे मदद मिलती है। यह विकी सामान्य रूप से प्रोग्रामिंग में परीक्षण का एक अच्छा अवलोकन देता है: http://en.wikipedia.org/wiki/Software_testing

+0

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

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

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