unit testing - इकाई परीक्षण/टीडीडी के लिए उपयोगी डिजाइन पैटर्न?




unit-testing design-patterns (6)

मुझे एहसास हुआ है कि अगला कदम यह समझ रहा है कि इसे टेस्ट करने योग्य बनाने के लिए कोड को कैसे जोड़ा जाए।

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

सही पर! SOLID वह है जिसे आप ढूंढ रहे हैं (हां, वास्तव में)। मैं इन 2 ईबुक की सिफारिश करता रहता हूं, विशेष रूप से इस मुद्दे के लिए सोलिड पर एक।

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

समय के साथ यह एक बड़े दायरे में बढ़ता है, लेकिन यह मौजूदा कोड बेस के आकार, टीम के आकार और वास्तव में समस्या को जोड़ने के बजाय इसे कितने कर रहा है पर निर्भर करता है।

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

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

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

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


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

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

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

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


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


निर्भरता इंजेक्शन / आईओसी। स्प्रिंगफ्रेमवर्क और Google-guice जैसे निर्भरता इंजेक्शन ढांचे पर भी पढ़ें। वे टेस्टेबल कोड लिखने का लक्ष्य भी लक्षित करते हैं।


मैं कहूंगा कि आपको परीक्षण करने के लिए मुख्य रूप से दो चीजें चाहिए, और वे हाथ में हैं:

  • इंटरफेस, इंटरफेस, इंटरफेस
  • निर्भरता अन्तःक्षेपण; यह इंटरफेस के संयोजन के साथ आप उन मॉड्यूल को अलग करने के लिए भागों पर स्वैप करने में मदद करेंगे, जिन्हें आप परीक्षण करना चाहते हैं। आप अपने क्रॉन-जैसी प्रणाली का परीक्षण करना चाहते हैं जो अन्य सेवाओं को नोटिफिकेशन भेजता है? इसे सही करें और सही इंटरफ़ेस का पालन करने वाले घटकों द्वारा अन्य सभी चीज़ों के लिए अपने वास्तविक-कोड कार्यान्वयन को प्रतिस्थापित करें, लेकिन जिस तरह से आप परीक्षण करना चाहते हैं उसमें प्रतिक्रिया करने के लिए हार्ड-वायर्ड: मेल अधिसूचना? जांच करें कि क्या होता है जब smtp सर्वर अपवाद फेंक कर नीचे होता है

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


यहां माइक क्लिफ्टन 2004 से 24 परीक्षण पैटर्न का वर्णन करता है। यूनिट परीक्षणों को डिजाइन करते समय यह एक उपयोगी ह्युरिस्टिक है।

http://www.codeproject.com/Articles/5772/Advanced-Unit-Test-Part-V-Unit-Test-Patterns

पास / विफल पैटर्न

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

  • सरल परीक्षण पैटर्न
  • कोड-पथ पैटर्न
  • पैरामीटर-रेंज पैटर्न

डेटा लेनदेन पैटर्न

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

  • सरल-डेटा-I / O पैटर्न
  • प्रतिबंध-डेटा पैटर्न
  • रोलबैक पैटर्न

संग्रह प्रबंधन पैटर्न

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

  • संग्रह-आदेश पैटर्न
  • गणना पैटर्न द
  • संग्रह-संयम पैटर्न
  • संग्रह-सूचक पैटर्न

प्रदर्शन पैटर्न

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

  • प्रदर्शन-परीक्षण पैटर्न

प्रक्रिया पैटर्न

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

  • प्रक्रिया-अनुक्रम पैटर्न
  • प्रक्रिया-राज्य पैटर्न
  • प्रक्रिया-नियम पैटर्न

सिमुलेशन पैटर्न

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

  • मॉक-ऑब्जेक्ट पैटर्न
  • सेवा-सिमुलेशन पैटर्न
  • बिट-त्रुटि-सिमुलेशन पैटर्न
  • घटक-सिमुलेशन पैटर्न

मल्टीथ्रेडिंग पैटर्न

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

  • सिग्नल पैटर्न
  • डेडलॉक-रेज़ोल्यूशन पैटर्न

तनाव परीक्षण पैटर्न

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

  • थोक-डेटा-तनाव-परीक्षण पैटर्न
  • संसाधन-तनाव-परीक्षण पैटर्न
  • लोडिंग-टेस्ट पैटर्न

प्रस्तुति परत पैटर्न

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

  • व्यू-स्टेट टेस्ट पैटर्न
  • मॉडल-स्टेट टेस्ट पैटर्न




tdd