2011-01-07 6 views
9

हमारी टीम टीडीडी में आसानी लाने और यूनिट परीक्षणों के लिए सर्वोत्तम प्रथाओं के साथ संघर्ष करने की प्रक्रिया में है। परीक्षण के तहत हमारा कोड निर्भरता इंजेक्शन का उपयोग करता है। हमारे परीक्षण आम तौर पर व्यवस्था-एक्ट-एसेर्ट प्रकार का लेआउट का पालन करते हैं जहां हम Moq के साथ व्यवस्था अनुभाग में निर्भरता का नकल करते हैं।पुन: प्रयोज्य मैक्स बनाम प्रत्येक परीक्षण में मजाक कर रहे हैं

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

सरल उदाहरण पर विचार करें:

  • XRepository.Save यह हस्ताक्षर और व्यवहार है है/अनुबंध बदल दिया है।
  • XController.Save XRepository का उपयोग करता है। इसलिए इसे नए इंटरफ़ेस का उपयोग करने के लिए दोबारा प्रतिक्रिया दी जाती है। लेकिन बाहरी रूप से यह सार्वजनिक अनुबंध नहीं बदला है।

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

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

हमारे पास और अधिक परीक्षणों के लिए यह प्रतिक्रिया करने के लिए तेजी से कठिन हो जाता है! या अधिक सटीक रूप से, हम एक बार इंटरफ़ेस का मज़ाक उड़ाते हैं।

तो मेरे सवालों का:

  1. ऑन-द-मक्खी का उपयोग कर के लिए कोई वरीयता प्रत्येक परीक्षा प्रत्येक इंटरफेस के लिए एक पुन: प्रयोज्य हाथ से तैयार नकली बनाने बनाम में मजाक उड़ाता है?

  2. मेरी कहानी को देखते हुए, क्या मुझे कुछ सिद्धांत याद आ रहा है या एक आम गड़बड़ी में पड़ रहा है?

धन्यवाद!

+2

जब भी आपको कुछ मजाक करने की ज़रूरत होती है, तो पहले सोचें कि क्या आप हाथ से मॉक बना सकते हैं। आप अक्सर पाएंगे कि ऑन-द-फ्लाई मॉक आम तौर पर अत्यधिक जटिलता की गंध देता है। यदि ऐसा है तो मैन्युअल मैक्स बनाएं और ऑन-द-फ्लाई मैक्स –

+1

पर विचार करें: http://en.wikipedia.org/wiki/Interface_segregation_principle – TrueWill

उत्तर

9

आपके पास कोई सिद्धांत नहीं है, लेकिन यह एक आम समस्या है। मुझे लगता है कि प्रत्येक टीम इसे अपने तरीके से हल करती है (या नहीं)।

साइड इफेक्ट्स

आप जो दुष्प्रभाव किसी भी समारोह के साथ इस मुद्दे के लिए जारी रहेगा। मैं पक्ष प्रभाव कार्यों मैं परीक्षण है कि कुछ या सभी को आश्वस्त करने के लिए मिल गया है निम्नलिखित:

  • कि यह किया गया था/आमंत्रित नहीं किया गया
  • समय की संख्या में यह कहा जाता था
  • क्या तर्क थे इसे पास किया गया
  • कॉल का ऑर्डर।

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

पुन: प्रयोज्य Mocks

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

स्वीकृति TDD

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

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

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

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

  • डेटाबेस सही ढंग से अद्यतन किया गया था
  • सही HTTP स्थिति कोड
  • वापस आ गया था एक पृष्ठ वापस आ गया था कि:
    • वैध HTML 4.01 था सख्त
    • जानकारी हम भेजना चाहते थे निहित उपयोगकर्ता को वापस

हम कम बग्स समाप्त हो गया। विशेष रूप से लगभग सभी एकीकरण बग, और बड़े रिफैक्टरों के कारण बग लगभग पूरी तरह से गायब हो गए।

व्यापार-बंद थे। यह सिर्फ पेशेवरों को बाहर की स्थिति के लिए विपक्ष से दूर कर दिया। विपक्ष:

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

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

1

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

  1. वहाँ परीक्षण जहां सार्वजनिक इंटरफेस का प्रयोग कर रहे हैं, ये बहुत महत्वपूर्ण है कि अगर हम विश्वास के साथ refactor करने के लिए कर रहे हैं, वे साबित होता है कि हम अपने ग्राहकों के लिए हमारे अनुबंध का सम्मान। इन परीक्षणों को हाथ से तैयार किए गए पुन: प्रयोज्य मॉक द्वारा सबसे अच्छी तरह से परोसा जाता है जो परीक्षण डेटा के एक छोटे से सबसेट से संबंधित है।
  2. "कवरेज" परीक्षण हैं। ये साबित होते हैं कि निर्भरता गलत व्यवहार करते समय हमारा कार्यान्वयन सही तरीके से व्यवहार करता है। ये मुझे लगता है कि विशेष कार्यान्वयन पथ को उत्तेजित करने के लिए फ्लाई मैक्स पर आवश्यकता है।
+0

टिप्पणी के लिए धन्यवाद। यह मेरे कुछ विचारों को मान्य करता है। मुझे लगता है कि मैं अनुबंध परीक्षणों पर अधिक ध्यान केंद्रित करने की कोशिश कर रहा था और सोच रहा था कि क्या कोड पथ अनुबंध के हिस्से की सेवा नहीं करता है, यह अनिवार्य था। लेकिन शायद हमें और अधिक व्यावहारिक होना चाहिए। –

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