किसी एप्लिकेशन की CRUD परत पर यूनिट टेस्ट बनाना, मैं परीक्षणों को स्वतंत्र कैसे बना सकता हूं?


14

इसलिए मैं अपनी यूनिट टेस्ट को पुस्तक के अनुसार संभव बनाने की कोशिश कर रहा हूं, लेकिन जब मैं कुछ सरल ऐड / डिलीट विधियों का परीक्षण कर रहा हूं तो यह परेशानी का सबब बन जाता है।

ऐड मेथड के लिए, मुझे मूल रूप से एक डमी ऑब्जेक्ट बनाना है और इसे जोड़ना है, फिर टेस्ट सफल होने के बाद, मुझे डमी ऑब्जेक्ट को हटाना होगा।

और डिलीट टेस्ट के लिए, मुझे स्पष्ट रूप से एक डमी ऑब्जेक्ट बनाना होगा ताकि मैं इसे हटा सकूं।

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

एक ऐसी प्रणाली के साथ जहां आपको एक परीक्षण लिखने की आवश्यकता होगी कि "कैंसिल्स अ ऑर्डर" ... पहले रद्द करने के लिए अच्छी तरह से कुछ डमी ऑर्डर की आवश्यकता होगी, क्या यह यूनिट परीक्षण के दिशानिर्देशों के खिलाफ नहीं जाता है?

इस तरह के मामलों को कैसे संभाला जाना चाहिए?


आप इस प्रश्न पर भी एक नज़र डालना चाहते हैं: प्रोग्रामर.स्टैकएक्सचेंज.
com

जवाबों:


13

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

ऐसा करने का एक शानदार तरीका इन-मेमोरी डेटाबेस के विरुद्ध परीक्षण चलाना है।

अपने ऐड टेस्ट में, एक खाली डेटाबेस बनाएं, ऑब्जेक्ट जोड़ें, और दावा करें कि यह वास्तव में जोड़ा गया है।

अपने डिलीट टेस्ट में, उस ऑब्जेक्ट से डेटाबेस बनाएं जिसे आप पहले से हटा रहे हैं। ऑब्जेक्ट हटाएं, और दावा करें कि इसे हटा दिया गया है।

अपने आंसू-डाउन कोड में डेटाबेस को उड़ा दें।


इन-मेमोरी डेटाबेस केवल तेज (मेमोरी में) और सरल (प्रोसेस में) है। आप किसी भी डेटा स्टोर के साथ ऐसा कर सकते हैं।
पॉल ड्रेपर

3

लेनदेन का उपयोग करें।

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

हां, एक ऑर्डर को रद्द करने के लिए आपको पहले एक बनाना होगा। कोई बात नहीं। परीक्षण पहले एक आदेश बनाएगा, फिर उसे रद्द कर देगा, फिर सत्यापित करेगा कि आदेश रद्द हो गया है।


इस विचार से प्यार करो। आज बड़े प्रभाव से इसे लागू किया।
'20:

3

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


2

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

मुझे लगता है कि आप एक ऐसी स्थिति में हैं जहां आपने यूनिट परीक्षणों के लिए कुछ मार्गदर्शन देखा है जो कि चीजों को कहते हैं

  • प्रत्येक परीक्षण स्टैंड-अलोन होना चाहिए, और अन्य परीक्षणों से प्रभावित नहीं होना चाहिए
  • प्रत्येक इकाई परीक्षण को एक चीज का परीक्षण करना चाहिए, और केवल एक चीज का
  • यूनिट परीक्षणों को डेटाबेस को हिट नहीं करना चाहिए

और इसी तरह। और वे सभी सही हैं, इस पर निर्भर करता है कि आप 'यूनिट टेस्ट' को कैसे परिभाषित करते हैं

मैं एक 'यूनिट टेस्ट' को कुछ इस तरह परिभाषित करूंगा: "एक परीक्षण जो कोड की एक इकाई के लिए कार्यक्षमता का एक टुकड़ा, अन्य आश्रितों से अलग किया जाता है"।

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

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

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

लेकिन सबसे ज्यादा, यह समझें कि कई तरह के सॉफ्टवेयर टेस्ट (यूनिट टेस्ट, सिस्टम टेस्ट, इंटीग्रेशन टेस्ट, एक्सप्लोसिव टेस्ट इत्यादि) होते हैं, और अन्य सभी के लिए एक प्रकार के मार्गदर्शन को लागू करने की कोशिश नहीं करते हैं।


तो क्या आप कह रहे हैं कि आप डेटाबेस से इकाई परीक्षण को नष्ट नहीं कर सकते ?
ChrisF

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

लेकिन बात यह है कि कुछ लोग 'यूनिट टेस्ट' को अलग तरह से परिभाषित कर सकते हैं, इसलिए 'यूनिट टेस्ट' गाइडेंस लागू करते समय हमें सावधान रहना चाहिए, क्योंकि गाइड हमारे सोचने के तरीके पर लागू नहीं हो सकता है।
एरिक किंग

1

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

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


1

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

इसलिए?

... क्या यह इकाई परीक्षण के दिशानिर्देशों के विरुद्ध नहीं है?

नहीं।

इस तरह के मामलों को कैसे संभाला जाना चाहिए?

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

यूनिट परीक्षणों को सटीक रूप से कक्षाओं के रूप में परिभाषित किया गया है ताकि वे कोड को आसानी से साझा कर सकें, जैसे कि अपडेट और डिलीट टेस्ट करने के लिए उपयोग किए जाने वाले एक सामान्य डमी रिकॉर्ड।


1

आप एक मॉक फ्रेमवर्क का उपयोग कर सकते हैं या इन-मेमोरी डेटाबेस के साथ 'वातावरण' का उपयोग कर सकते हैं। अंतिम एक वर्ग है जहां आप टेस्ट रन बनाने से पहले आपको वह सब कुछ बना सकते हैं जो आपको टेस्ट पास करने के लिए चाहिए।

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


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