यदि आप टीडीडी (या उच्च परीक्षण कवरेज के साथ कोई अन्य परीक्षण दृष्टिकोण) और ईएफ का उपयोग करना चाहते हैं तो आपको एकीकरण या अंत-टू-एंड परीक्षण लिखना होगा। यहां समस्या यह है कि या तो संदर्भ या भंडार का मजाक करने वाला कोई भी दृष्टिकोण सिर्फ परीक्षण बनाता है जो आपके ऊपरी परत तर्क (जो उन मॉक्स का उपयोग करता है) का परीक्षण कर सकता है लेकिन आपका आवेदन नहीं।
सरल उदाहरण:
public interface IGenericRepository<TEntity>
{
IQueryable<TEntity> GetQuery();
...
}
और कुछ व्यापार विधि लिखने की सुविधा देता है:
public IEnumerable<MyEntity> DoSomethingImportant()
{
var data = MyEntityRepo.GetQuery().Select((e, i) => e);
...
}
अब अगर आप भंडार नकली आप Linq-हैं- उपयोग करेगा
के सामान्य भंडार को परिभाषित करते हैं ऑब्जेक्ट्स और आपके पास एक हरा परीक्षण होगा, लेकिन यदि आप लिंक-टू-एंटिटीज के साथ एप्लिकेशन चलाते हैं तो आपको अपवाद मिलेगा क्योंकि इंडेक्स के साथ ओवरलोड का चयन L2E में समर्थित नहीं है।
यह एक साधारण उदाहरण था लेकिन प्रश्नों और अन्य सामान्य गलतियों में विधियों का उपयोग करने के साथ ही ऐसा ही हो सकता है। इसके अलावा यह आमतौर पर भंडार पर प्रकट किए गए जोड़ें, अद्यतन, हटाए गए तरीकों को भी प्रभावित करता है। यदि आप एक नकली नहीं लिखते हैं जो ईएफ संदर्भ और संदर्भित अखंडता के व्यवहार को अनुकरण करेगा, तो आप अपने कार्यान्वयन का परीक्षण नहीं करेंगे।
कहानी का एक और हिस्सा आलसी लोडिंग के साथ समस्याएं हैं जो मोक्स के खिलाफ यूनिट परीक्षणों के साथ शायद ही कभी पता लगाया जा सकता है।
इसके कारण आपको एकीकरण या अंत-टू-एंड परीक्षण भी पेश करना चाहिए जो असली ईएफ संदर्भ एनी एल 2 ई का उपयोग करके वास्तविक डेटाबेस के खिलाफ काम करेगा। Btw। टीडीडी का सही उपयोग करने के लिए एंड-टू-एंड परीक्षणों का उपयोग करना आवश्यक है। एएसपी.नेट एमवीसी में एंड-टू-एंड टेस्ट लिखने के लिए आप WatiN और संभावित रूप से SpecFlow बीडीडी के लिए भी कर सकते हैं लेकिन यह वास्तव में बहुत सारे काम को जोड़ देगा लेकिन आपके आवेदन में वास्तव में परीक्षण किया जाएगा। यदि आप टीडीडी के बारे में अधिक पढ़ना चाहते हैं तो मैं this book की सिफारिश करता हूं (केवल नुकसान यह है कि उदाहरण जावा में हैं)।
यदि आप जेनेरिक रिपोजिटरी का उपयोग नहीं करते हैं और आप कुछ कक्षाओं में अपने प्रश्न छुपाते हैं तो IQueryable
का पर्दाफाश नहीं करेंगे लेकिन सीधे डेटा लौटाएंगे, लेकिन एकीकरण परीक्षण समझ में आता है।
उदाहरण:
public interface IMyEntityRepository
{
MyEntity GetById(int id);
MyEntity GetByName(string name);
}
अब आप सिर्फ इस भंडार के कार्यान्वयन का परीक्षण करने क्योंकि प्रश्नों इस वर्ग में छिपे हुए हैं और ऊपरी परत के संपर्क में नहीं एकीकरण परीक्षण लिख सकते हैं। लेकिन इस प्रकार के भंडार को किसी भी तरह से संग्रहीत प्रक्रियाओं के साथ पुराने कार्यान्वयन के रूप में माना जाता है। आप इस कार्यान्वयन के साथ बहुत सारी ओआरएम सुविधाओं को खो देंगे या आपको बहुत अधिक काम करना होगा - उदाहरण के लिए ऊपरी परत में क्वेरी को परिभाषित करने में सक्षम होने के लिए specification pattern जोड़ें।
एएसपी.नेट एमवीसी में आप आंशिक रूप से नियंत्रक स्तर पर एकीकरण परीक्षण के साथ अंत-से-अंत परीक्षणों को प्रतिस्थापित कर सकते हैं।
संपादित करें टिप्पणी के आधार पर:
है मैं यह नहीं है कि आप इकाई परीक्षण, एकीकरण परीक्षण और एंड-टू-एंड परीक्षण की जरूरत है। मैं कहता हूं कि परीक्षण किए गए अनुप्रयोगों को और अधिक प्रयास की आवश्यकता है। आवश्यक परीक्षणों की राशि और प्रकार आपके आवेदन की जटिलता, आवेदन के अपेक्षित भविष्य, आपके कौशल और अन्य टीम के सदस्यों के कौशल पर निर्भर हैं।
छोटे स्ट्रैफफोर्ड परियोजनाओं को बिना किसी परीक्षण के बनाया जा सकता है (ठीक है, यह एक अच्छा विचार नहीं है, लेकिन हम सभी ने इसे किया और अंत में यह काम किया) लेकिन एक बार एक परियोजना कुछ सीमा पार हो जाने पर आप नई सुविधाओं को पेश कर सकते हैं या परियोजना को बनाए रखना बहुत कठिन है क्योंकि आप कभी भी सुनिश्चित नहीं होते हैं कि यह कुछ ऐसा करता है जो पहले से ही काम करता है - जिसे रिग्रेशन कहा जाता है। प्रतिगमन के खिलाफ सबसे अच्छा बचाव स्वचालित परीक्षणों का अच्छा सेट है।
- यूनिट परीक्षण आपको विधि का परीक्षण करने में मदद करते हैं। इस तरह के परीक्षण आदर्श रूप से विधि में सभी निष्पादन पथ को कवर करना चाहिए। ये परीक्षण बहुत छोटे और लिखने में आसान होना चाहिए - जटिल भाग पर निर्भरता (मैक्स, फाकेट्स, स्टब्स) स्थापित करना हो सकता है।
- एकीकरण परीक्षण आपको कई परतों में कार्यक्षमता का परीक्षण करने और आमतौर पर एकाधिक प्रक्रियाओं (एप्लिकेशन, डेटाबेस) में परीक्षण करने में मदद करता है। आपको उन्हें सबकुछ के लिए रखने की आवश्यकता नहीं है, यह चुनने के अनुभव के बारे में अधिक है कि वे कहां सहायक हैं।
- एंड-टू-एंड परीक्षण उपयोग केस/उपयोगकर्ता कहानी/सुविधा के सत्यापन की तरह कुछ हैं। उन्हें आवश्यकता के पूरे प्रवाह को कवर करना चाहिए।
कई बार भ्रूण का परीक्षण करने की आवश्यकता नहीं है - यदि आपको पता है कि सुविधा को अंत तक परीक्षण में परीक्षण किया गया है तो आपको एक ही कोड के लिए एकीकरण परीक्षण लिखने की आवश्यकता नहीं है। इसके अलावा यदि आप जानते हैं कि विधि में केवल एक निष्पादन पथ है जो एकीकरण परीक्षण द्वारा कवर किया गया है तो आपको इसके लिए इकाई परीक्षण लिखने की आवश्यकता नहीं है। यह टीडीडी दृष्टिकोण के साथ बहुत बेहतर काम करता है जहां आप एक बड़े परीक्षण (अंत-टू-एंड या एकीकरण) से शुरू होते हैं और यूनिट परीक्षणों के लिए गहरे जाते हैं।
आपके विकास दृष्टिकोण के आधार पर आपको शुरुआत से कई प्रकार के परीक्षण शुरू करने की ज़रूरत नहीं है लेकिन आप उन्हें बाद में पेश कर सकते हैं क्योंकि आपका आवेदन अधिक जटिल हो जाएगा। अपवाद टीडीडी/बीडीडी है जहां आपको कम से कम एंड-टू-एंड और यूनिट परीक्षणों का उपयोग शुरू करना चाहिए, इससे पहले कि आप अन्य कोड की एकल पंक्ति भी लिखें।
तो आप गलत सवाल पूछ रहे हैं। सवाल यह नहीं है कि क्या आसान है? सवाल यह है कि अंत में आपकी क्या मदद करेगा और आपके आवेदन में कौन सी जटिलता फिट बैठती है? यदि आप आसानी से यूनिट परीक्षण एप्लिकेशन और व्यवसाय तर्क चाहते हैं तो आपको कुछ अन्य वर्गों में ईएफ कोड लपेटना चाहिए जिसे मजाक किया जा सकता है। लेकिन एक ही समय में आपको यह सुनिश्चित करने के लिए अन्य प्रकार के परीक्षण शुरू करना चाहिए कि ईएफ कोड काम करता है।
मैं तुम्हें नहीं कह सकता कि दृष्टिकोण अपने वातावरण/परियोजना/टीम/आदि फिट होगा लेकिन मैं अपने अतीत परियोजना से उदाहरण व्याख्या कर सकते हैं:
मैं दोनों के साथ लगभग 5-6 महीने के लिए परियोजना पर काम सहकर्मियों। यह परियोजना एएसपी.नेट एमवीसी 2 + jQuery + ईएफवी 4 पर आधारित थी और इसे वृद्धिशील और पुनरावृत्त तरीके से विकसित किया गया था। इसमें बहुत जटिल व्यवसाय तर्क और बहुत जटिल डेटाबेस प्रश्न थे। हमने जेनेरिक रिपॉजिटरीज और उच्च कोड कवरेज के साथ यूनिट परीक्षण + एकीकरण परीक्षण मैपिंग को मान्य करने के लिए शुरू किया (डालने, हटाने, अद्यतन करने और इकाई का चयन करने के लिए सरल परीक्षण)। कुछ महीनों के बाद हमने पाया कि हमारा दृष्टिकोण काम नहीं करता है। हमारे पास 1.200 यूनिट परीक्षण, कोड कवरेज लगभग 60% (जो बहुत अच्छा नहीं है) और बहुत सारी प्रतिक्रियाएं हैं।ईएफ मॉडल में कुछ भी बदलना उन हिस्सों में अप्रत्याशित समस्याओं का परिचय दे सकता है जो कई हफ्तों तक छुआ नहीं थे। हमने पाया कि हम अपने आवेदन तर्क के लिए एकीकरण परीक्षण या अंत-टू-एंड परीक्षण खो रहे हैं। एक ही निष्कर्ष एक अन्य परियोजना पर काम करने वाली समांतर टीम पर किया गया था और एकीकरण परीक्षण का उपयोग नई परियोजनाओं के लिए सिफारिश के रूप में माना जाता था।
तुमने कहा खजाने अपने आवेदन करने के लिए 'जटिलता' जोड़ा है, लेकिन मैं कहूंगा कि कि वे एक प्रारंभिक 'ओवरहेड' हैं जो परीक्षण को आसान बनाता है। कुछ रिपॉजिटरीज़ का मज़ाक उड़ाकर पूरे डेटा संदर्भ का मज़ाक करना आसान है। – Omar
हां, लेकिन मैं अपने वर्तमान मामले में प्रारंभिक ओवरहेड नहीं चाहता हूं। मैं जल्दी से आवेदन के साथ प्रगति करना चाहता हूँ। मैं पहले से ही किसी भी वास्तविक प्रगति के बिना बहुत अधिक समय खो दिया है। भंडार जोड़ना आईओसी, डी इत्यादि जैसी चीजें लाता है .. और मुझे पहले देखने के पहले मुझे ज़िलियन परीक्षण लिखना होगा। मुझे पता है कि यह सही समाधान हो सकता है, लेकिन मैं "सही" की तलाश नहीं कर रहा हूं। मैं सरल (जबकि अभी भी टेस्टेबल) समाधान की तलाश में हूं। – Damb