क्या आप एक ही परियोजना या किसी अन्य परियोजना में इकाई परीक्षण करते हैं?


137

क्या आप सुविधा के लिए एक ही परियोजना में इकाई परीक्षण करते हैं या क्या आप उन्हें एक अलग विधानसभा में रखते हैं?

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

जवाबों:


100

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

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

मैं वास्तव में किसी भी पेशेवरों के बारे में नहीं जानता। एक अतिरिक्त परियोजना (या 10) होने से एक कोन नहीं है।

संपादित करें: बिल्ड और शिपिंग पर अधिक जानकारी

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

संक्षेप में, यहां दैनिक निर्माण और बिट्स और अन्य फाइलों के परीक्षण और शिपिंग के लिए सामान्य विचार दिया गया है:

  1. प्रोडक्शन बिल्ड रन, प्रोडक्शन फाइल को एक विशिष्ट "प्रोडक्शन" डायरेक्टरी में रखता है।
    1. केवल उत्पादन परियोजनाओं का निर्माण।
    2. संकलित बिट्स और अन्य फ़ाइलों को एक "उत्पादन" निर्देशिका में कॉपी करें।
    3. एक रिलीज उम्मीदवार निर्देशिका में बिट्स और अन्य फ़ाइलों की प्रतिलिपि बनाएँ, एक क्रिसमस रिलीज़ निर्देशिका "रिलीज़20081225" होगी।
  2. यदि उत्पादन बिल्ड सफल होता है, तो यूनिट टेस्ट बिल्ड रन होता है।
    1. उत्पादन कोड को "परीक्षण" निर्देशिका में कॉपी करें।
    2. "परीक्षण" निर्देशिका के लिए इकाई परीक्षण बनाएँ।
    3. इकाई परीक्षण चलाएं।
  3. डेवलपर्स को बिल्ड सूचनाएं और यूनिट परीक्षण परिणाम भेजें।
  4. जब एक रिलीज़ उम्मीदवार (जैसे रिलीज़20081225) को स्वीकार किया जाता है, तो इन बिट्स को शिप करें।

15
IMO आपके द्वारा सूचीबद्ध सूची हमेशा लागू नहीं होती है। एक ही-प्रोजेक्ट के लिए एक प्रो टेस्टेड क्लास + टेस्ट्स की आसान ग्रुपिंग है - टेस्ट लिखते समय ये छोटी-छोटी प्रॉब्लम बहुत आगे जाती हैं। व्यक्तिगत प्राथमिकता यहां जीतती है, और कभी-कभी आपके बिंदु प्रासंगिक होते हैं, बस हर समय नहीं।
orip

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

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

4
उत्पादन कोड में इकाई परीक्षणों को हटाने के लिए "अलग प्रोजेक्ट" दृष्टिकोण के विकल्प के रूप में, एक कस्टम प्रतीक और संकलक निर्देशों का उपयोग करने पर विचार करें #if। इस कस्टम प्रतीक को आपके CI सॉफ्टवेयर स्क्रिप्ट में कंपाइलर कमांड-लाइन मापदंडों का उपयोग करके टॉगल किया जा सकता है। Msdn.microsoft.com/en-us/library/4y6tbswk.aspx देखें ।
रिच सी

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

112

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

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

यदि आपको उत्पादन कोड के आंतरिक सदस्यों तक पहुंच की आवश्यकता है, तो InternalsVoubleTo का उपयोग करें ।


+1: मैंने मुख्य परियोजना के रूप में एक ही परियोजना में इकाई परीक्षणों का सामना किया है और असली कोड के बीच परीक्षणों को खोजना मुश्किल है - भले ही एक नामकरण सम्मेलन का पालन किया गया हो।
फेंटन

32
कम अनुभवी पाठक के लिए इसका मतलब है कि आप [assembly:InternalsVisibleTo("UnitTestProjectName")]अपनी परियोजना AssemblyInfo.csफ़ाइल में जोड़ें ।
मार्गस

बहुत उपयोगी इसके अतिरिक्त मार्गस। इस संदर्भ में इंटरनैल्सविजनलटीओ का उल्लेख करने के लिए जॉन का धन्यवाद।
ब्योर्न ओट्टो वासबोटन

1
@jropella: यदि आप ठेस विधानसभा पर हस्ताक्षर कर रहे हैं, तो आप केवल वैसे भी हस्ताक्षरित विधानसभाओं को दिखाई दे सकते हैं। और निश्चित रूप से अगर आप किसी भी कोड को पूरे भरोसे के साथ चला रहे हैं, तो उनके पास प्रतिबिंब के माध्यम से पहुंच है ...
जॉन स्कीट

2
@jropella: प्रतिबिंब InternalsVisibleTo के बारे में वैसे भी परवाह नहीं करता है ... लेकिन आप को देखा है नहीं होगा एक पर हस्ताक्षर किए विधानसभा एक पर भरोसा अहस्ताक्षरित , विधानसभा InternalsVisibleTo का उपयोग कर, क्योंकि वह संकलन समय पर रोका गया है।
जॉन स्कीट

70

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

मैं अपने परीक्षणों को C # /। NET / Visual Studio 2008 में उसी परियोजना में रखना चाहूंगा, लेकिन मैंने अभी भी इसे प्राप्त करने के लिए इस पर्याप्त जांच नहीं की है।

Foo.cs को FooTest.cs के समान प्रोजेक्ट में रखने का एक बड़ा लाभ यह है कि डेवलपर्स को लगातार याद दिलाया जाता है जब एक कक्षा एक भाई परीक्षा याद कर रहा है! यह बेहतर परीक्षण संचालित कोडिंग प्रथाओं को प्रोत्साहित करता है ... छेद अधिक स्पष्ट हैं।


17
मैं देख सकता हूं कि एकीकरण परीक्षणों से कैसे मूल्यवान होगा, लेकिन इकाई परीक्षणों के लिए? यदि आप उन्हें सही ढंग से लिखते हैं तो उन्हें मशीन पर कोई निर्भरता नहीं होनी चाहिए।
जोएल मैकबेथ

+1 मैं सहमत हूं। जैसा कि मैं ज्यादातर .NET कर रहा हूं, उत्पादन कोड के साथ शिपिंग परीक्षण का भी संकलन और परीक्षण के निरंतर एकीकरण चरण को कम करने का अच्छा साइड इफेक्ट है: 1) मुख्य अनुप्रयोग के स्थान पर सभी परीक्षण असेंबलियों के निर्माण के लिए केवल 2 परियोजनाएं) इसलिए आपके परीक्षण धावक को पैरामीटर बनाना आसान है। मावेन का उपयोग करते समय यह तर्क पकड़ में नहीं आता है। अंत में, मेरे ग्राहक अधिक तकनीकी लोग हैं और वे वास्तव में परीक्षण चलाने में सक्षम होना पसंद करते हैं क्योंकि यह कल्पना के खिलाफ वर्तमान स्थिति का दस्तावेजीकरण कर रहा है।
10

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

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

19

बेहतर एनकैप्सुलेशन प्राप्त करने के लिए कोड के रूप में एक ही परियोजना में यूनिट परीक्षण रखें।

आप आसानी से आंतरिक विधियों का परीक्षण कर सकते हैं, जिसका अर्थ है कि आप उन तरीकों को सार्वजनिक नहीं करेंगे जो आंतरिक होने चाहिए थे।

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

और आप संकलन टैग (IF #Debug) का उपयोग करके इकाई परीक्षणों को उत्पादन कोड से हटा सकते हैं।

ऑटोमैटिक इंटीग्रेशन टेस्ट (मैं बनाया गया) एक अलग परियोजना में होना चाहिए क्योंकि वे किसी एक परियोजना से संबंधित नहीं हैं।


1
लेकिन इसका मतलब है कि आप Releaseबिल्ड पर परीक्षण नहीं चला सकते हैं और कुछ "हाइजेनबग्स" के माध्यम से गिर सकते हैं।
hppyy

3
मित्र असेंबली ( msdn.microsoft.com/en-us/library/0tke9fxk.aspx ) के साथ InternalsVisibleToआप एक अलग टेस्ट प्रोजेक्ट से आंतरिक विधियों का परीक्षण करने की अनुमति देता है
ParoX

3
@hlpPy - आप मनमाना सशर्त संकलन प्रतीकों को कॉन्फ़िगर कर सकते हैं, और आपके पास 2 से अधिक बिल्ड कॉन्फ़िगरेशन हो सकते हैं। उदाहरण के लिए, आपके पास हो सकता है Debug, Approvalऔर Release; और सभी रिलीज अनुकूलन के साथ अनुमोदन संकलित करें। इसके अलावा, आमतौर पर यूनिट परीक्षण पहले स्थान पर (मेरे अनुभव में) हाइजेनबग्स का पता लगाने में महान नहीं हैं। आपको उन लोगों के लिए विशिष्ट एकीकरण प्रतिगमन परीक्षणों की आवश्यकता है - और आप उन साइड-बाय-साइड को अच्छी तरह से रख सकते हैं।
ईमोन नेरबोन

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

12

टाइपस्क्रिप्ट प्रोजेक्ट्स में कुछ समय बिताने के बाद, जहाँ परीक्षण अक्सर कोड के साथ एक फ़ाइल में रखे जाते हैं, वे मुझे अलग-अलग रखने पर इस दृष्टिकोण को पसंद करते हैं:

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

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

प्रोजेक्ट फ़ाइल में निम्न पंक्तियाँ डालना अब तक अच्छा काम करता हुआ प्रतीत होता है:

  <ItemGroup Condition="'$(Configuration)' == 'Release'">
    <Compile Remove="**\*.Tests.cs" />
  </ItemGroup>
  <ItemGroup Condition="'$(Configuration)' != 'Release'">
    <PackageReference Include="nunit" Version="3.11.0" />
    <PackageReference Include="NUnit3TestAdapter" Version="3.12.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
  </ItemGroup>

उपरोक्त यह सुनिश्चित करता है कि Releaseकॉन्फ़िगरेशन में नामित सभी फ़ाइलों *.Tests.csको संकलन से बाहर रखा गया है, और यह भी कि आवश्यक इकाई परीक्षण पैकेज संदर्भ हटा दिए गए हैं।

यदि आप अभी भी अपनी रिलीज़ कॉन्फ़िगरेशन में कक्षाओं का परीक्षण करने में सक्षम होना चाहते हैं, तो आप Releaseकुछ कहे जाने वाले नए कॉन्फ़िगरेशन बना सकते हैं ReleaseContainingTests


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

वीएस कोड स्क्रीनशॉट

ऐसा करने के लिए, सामग्री चिह्न थीम एक्सटेंशन का उपयोग करें और अपने VS कोड प्राथमिकताएँ JSON के साथ कुछ ऐसा जोड़ें:

"material-icon-theme.files.associations": {
  "*.Tests.cs": "test-jsx",
  "*.Mocks.cs": "merlin",
  "*.Interface.cs": "yaml",
}

वास्तव में हमने अभी क्या करना शुरू किया है
मैथ्यू स्टीपेन्स

क्या आपको यह .net मानक कक्षा पुस्तकालयों के लिए भी काम कर रहा है?
झेनुका

10

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


1
फिर आप आंतरिक कक्षाओं का परीक्षण कैसे करते हैं? या आप केवल सार्वजनिक वर्गों का परीक्षण करते हैं?
user19371

7
असेम्बली: इंटरनैल्सविजेल्टो = "टेस्टप्रोजेक्ट" /> यदि आवश्यक हो, हालांकि मैं आमतौर पर केवल सार्वजनिक इंटरफेस का परीक्षण करता हूं।
tvanfosson

@tvanfosson, आप स्पेक्स (स्पेकफ्लो) के साथ क्या करते हैं? क्या आपके पास एक अलग प्रोजेक्ट होगा या आप उन्हें यूनिट टेस्ट प्रोजेक्ट में डालेंगे? +1।
w0051977

@ w0051977 मैंने कभी भी Specflow का उपयोग नहीं किया है इसलिए मुझे नहीं पता
tvanfosson

@tvanfosson, एकीकरण परीक्षणों के बारे में क्या? क्या आप उन्हें यूनिट परीक्षणों के लिए एक अलग परियोजना में रखेंगे?
w0051977

10

यदि NUnit ढांचे का उपयोग किया जाता है, तो परीक्षणों को एक ही परियोजना में लगाने का एक अतिरिक्त कारण है। इकाई परीक्षणों के साथ मिश्रित उत्पादन कोड के निम्नलिखित उदाहरण पर विचार करें:

public static class Ext
{
     [TestCase(1.1, Result = 1)]
     [TestCase(0.9, Result = 1)]
     public static int ToRoundedInt(this double d)
     {
         return (int) Math.Round(d);
     }
}

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

अद्यतन : मुझे पता है कि TestCaseविशेषता का ऐसा उपयोग नहीं था कि NUnit के डेवलपर्स ने इरादा किया था, लेकिन क्यों नहीं?


2
मुझे यह विचार पसंद है; कोड के साथ इनपुट और अपेक्षित आउटपुट के कुछ उदाहरण हैं।
प्रेस्टन मैककॉर्मिक

3

मैं एक ही परियोजना और विभिन्न परियोजनाओं के बीच उतार-चढ़ाव करता हूं।

यदि आप उत्पादन कोड के साथ परीक्षण कोड जारी करने वाले एक पुस्तकालय को जारी कर रहे हैं, तो एक समस्या है, अन्यथा मुझे लगता है कि यह आमतौर पर नहीं है (हालांकि आप कोशिश करने से पहले एक मजबूत मनोवैज्ञानिक बाधा है)।

उसी परियोजना में परीक्षण करते समय मुझे परीक्षण और कोड के बीच स्विच करना आसान लगता है, और रिफ्लेक्टर / उन्हें स्थानांतरित करने में आसान होता है।


3

मैंने उन्हें अलग-अलग प्रोजेक्ट में रखा। असेंबली का नाम हमारे लिए एक सामान्य नियम के रूप में, नामस्थानों का दर्पण है। इसलिए यदि Company.Product.Feature.sln नामक एक परियोजना है, तो उसके पास Company.Product.Feature.dll का एक आउटपुट (असेंबली नाम) है। परीक्षण परियोजना Company.Product.Feature.Tests.sln है, Company.Product.Feature.Tests.dll उपज है।

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

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

इसके अलावा, हम XCopy ड्रॉप्स का निर्माण मशीन से करते थे। स्क्रिप्ट सिर्फ * .Tests.Dll नाम की किसी भी चीज़ की नकल करने से चूक जाएगी। यह सरल था, लेकिन काम किया।


1

मैं कहूंगा कि उन्हें अलग रखें।

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


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

0

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

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


0

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

क्यों?

सबसे पहले मैं मुख्य प्रोजेक्ट फ़ोल्डर संरचना को परीक्षण परियोजना के साथ रखने के लिए बहुत तैयार हूं। इसलिए, अगर मेरे पास एक फ़ाइल है, Providers > DataProvider > SqlDataProvider.csतो मैं अपनी इकाई परीक्षण परियोजनाओं में समान संरचना बना रहा हूंProviders > DataProvider > SqlDataProvider.Tests.cs

लेकिन परियोजना के बाद और बड़ा हो रहा है, एक बार जब आप फ़ाइलों को एक फ़ोल्डर से दूसरे फ़ोल्डर में स्थानांतरित करते हैं, या एक परियोजना से दूसरी परियोजना के लिए, तो यूनिट परीक्षण परियोजनाओं के साथ सिंक करने के लिए बहुत बोझिल काम हो रहा है।

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

हाल ही में, मैंने अभ्यास करना शुरू कर दिया है, मैंने जो प्रत्येक फ़ाइल बनाई है (उदाहरण के लिए SqlDataProvider.cs) मैं टेस्ट प्रत्यय के साथ एक और फ़ाइल बना रहा हूं, जैसेSqlDataProvider.Tests.cs

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

आप प्रोजेक्ट के माध्यम से स्कैन करने और वर्ग की पहचान करने के लिए व्यावसायिक नियम भी लिख सकते हैं। जिसमें फ़ाइल नहीं है, और उन्हें स्वामी को रिपोर्ट करें। साथ ही आप अपने टेस्ट रनर को आसानी से टार्गेट .Testsक्लास बता सकते हैं ।

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

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


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

0

जैसा कि दूसरों ने उत्तर दिया है - अलग-अलग परियोजनाओं में परीक्षण करें

एक बात जिसका उल्लेख नहीं किया गया है वह यह है कि आप वास्तव nunit3-console.exeमें किसी भी चीज के खिलाफ नहीं चल सकते हैं लेकिन .dllफाइलें।

यदि आप TeamCity के माध्यम से अपने परीक्षण चलाने की योजना बना रहे हैं, तो यह एक समस्या पैदा करेगा।

मान लीजिए कि आपके पास एक कंसोल एप्लिकेशन प्रोजेक्ट है। जब आप संकलित करते हैं, तो यह फ़ोल्डर के .exeलिए एक निष्पादन योग्य देता है bin

से nunit3-console.exeआप किसी भी परीक्षण है कि सांत्वना आवेदन में परिभाषित चलाने के लिए सक्षम नहीं होगा।

दूसरे शब्दों में, एक कंसोल एप्लिकेशन एक exeफाइल लौटाता है और एक क्लास लाइब्रेरी dllफाइल लौटाता है।

मैं बस आज इस से थोड़ा सा मिल गया और यह बेकार है :(


0

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


-2

अलग-अलग परियोजनाएं, हालांकि मैं खुद से बहस करता हूं कि क्या उन्हें एक ही svn साझा करना चाहिए। फिलहाल, मैं उन्हें अलग-अलग svn रिपॉजिटरी दे रहा हूं, जिसे एक कहा जाता है

"MyProject" - प्रोजेक्ट के लिए ही

और एक ने फोन किया

"MyProjectTests" - MyProject से जुड़े परीक्षणों के लिए।

यह काफी साफ-सुथरा है और इसमें वह फायदा है जो परियोजना के लिए होता है और परीक्षण के लिए अलग होता है। इसका मतलब यह भी है कि यदि आपको अपने परीक्षण जारी करने की आवश्यकता के बिना, परियोजना के svn को सौंप सकते हैं। इसका मतलब यह भी है कि आपके पास आपके परीक्षणों के लिए और आपकी परियोजना के लिए शाखा / ट्रंक / टैग निर्देशिका हो सकती हैं।

लेकिन मैं तेजी से निम्नलिखित की तरह कुछ करने के लिए इच्छुक हूँ, एक एकल svn भंडार में, प्रत्येक परियोजना के लिए।

मेरी परियोजना
| \ ट्रंक
| | \ कोड
| \ टेस्ट
| \ टैग
| | \ 0.1
| | | \ कोड
| | \ टेस्ट
| \ 0.2
| | \ कोड
| \ टेस्ट
\ शाखाओं
  \ MyFork
   | \ कोड
    \परीक्षा

मुझे यह जानने में दिलचस्पी होगी कि अन्य लोग इस समाधान के बारे में क्या सोचते हैं।


5
आपको परीक्षण और ऐप कोड के लिए अलग-अलग कमिट की आवश्यकता नहीं होनी चाहिए। वे हाथ से हाथ जाना चाहिए और अगर दोनों * डीडी शैली के डिजाइन का उपयोग कर रहे हैं, दोनों शामिल होंगे।
eddiegroves
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.