2010-11-28 14 views
7

के लिए काम नहीं कर रहा है मेरे पास यह कक्षा है जिसे मैं टीडीडी का उपयोग करना चाहता हूं, लेकिन मैं असफल रहा। यह SubMissions नामक एक सुंदर मूल वर्ग है, और यह सब कुछ करता है कि यह SQL डेटाबेस से कुछ डेटा प्राप्त करता है।टेस्ट-संचालित विकास मेरी कक्षा

तो यह getSubMissionForPage(), getSubMissionFromId() आदि जैसे तरीकों ..

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

मुझे पता है कि आपका परीक्षण विफल करने के बारे में जानने में पहला कदम है, लेकिन वास्तव में परीक्षण करने में विफल होने का कोई तरीका नहीं है तो आप क्या करते हैं?

+1

इन परिस्थितियों में, आप विशिष्ट डेटा के साथ डेटाबेस को प्री-लोड कर सकते हैं जिसे आप वापस लौटने की उम्मीद करते हैं। इसके बाद आप यह सुनिश्चित कर सकते हैं कि आपको लगभग सही डेटा – obfuscation

उत्तर

8

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

डीबी से कनेक्ट करने वाले परीक्षण कक्षाएं HelloWorld.java का परीक्षण करने से थोड़ा अधिक कठिन है, क्योंकि आपको mock the DB पर कुछ रास्ता चाहिए। आप Mock Objects here के बारे में अधिक जान सकते हैं।

संक्षिप्त उत्तर, आपके परीक्षण/सॉफ्टवेयर हमेशा असफल हो सकते हैं। यदि आपको नहीं लगता कि आपका परीक्षण विफल हो सकता है, तो आप समस्या स्थान के बारे में काफी कठिन नहीं सोच रहे हैं।

+0

+1 मॉकिंग या फ़ोकिंग के लिए tdd –

+0

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

2

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

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

  • बोर्ड
  • स्क्वायर
  • स्थान (पंक्ति, बोर्ड पर वर्ग की col)

मैं के बाद से स्थान के साथ शुरू होगा इसकी कोई निर्भरता नहीं है, फिर स्क्वायर क्योंकि यह केवल स्थान पर निर्भर करता है, फिर बोर्ड क्योंकि यह केवल स्क्वायर पर निर्भर करता है।

3

टीडीडी की सुंदरता यह है कि यदि आपको लिखने के लिए कठिन परीक्षा मिल रही है, तो यह डिजाइन में संभावित समस्या को इंगित करता है। इस मामले में, आपके डेटा एक्सेस तर्क का अमूर्तता।

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

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

+0

मिल रहा है, उदाहरण के तौर पर, मैं एक फर्जी रिपोजिटरी बना सकता हूं जो एक आईडी, या एक सरणी दिया गया एक नकली रिकॉर्ड देता है पेज, इत्यादि - इस तरह आप पहले दो कार्यों का परीक्षण कर सकते हैं, और निर्भरता इंजेक्शन के लिए –

+0

+1 जैसी चीज़ों पर विचार करें कि आपकी रिपॉजिटरी को अवैध आईडी कैसे संभालनी चाहिए। यह वास्तव में छोटे उत्तर के लिए –

+0

+1 के साथ हाथ में जा रहा है। – JeffH

0

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

इस JUnit पूछे जाने वाले प्रश्न पर एक नज़र डालें: http://junit.sourceforge.net/doc/faq/faq.htm#best_3

0
  1. किसी भी क्रम अपवाद फेंक और देखते हैं कि परीक्षण में विफल रहता है के लिए अपने वर्ग को संशोधित।
  2. अपवाद की उम्मीद के लिए अपने परीक्षण mofify और देखते हैं कि परीक्षण में विफल रहता है

(1) और (2) थे सिर्फ अभ्यास है कि आप यह सुनिश्चित करें कि परीक्षण काम कर रहा है होना करने के लिए मदद करनी चाहिए।

अब खुद से पूछें प्रश्न: परीक्षण विफलता का कारण क्या हो सकता है? मुझे लगता है कि आपके मामले में कारणों सूची लगता है: 1. 2. गलत डीबी स्कीमा 3. असंगत डेटा

यहां कुछ ऐसे तरीके इन कारणों अनुकरण करने के लिए कर रहे हैं डीबी कोई संबंध नहीं: 1. अपने डीबी शट डाउन या कनेक्ट करने के लिए उपयोग कर रहे क्रेडेंशियल्स/जेडीबीसी यूआरएल को बदलें। 2. दिलचस्प कॉलम ड्रॉप करें या इसके कॉलम का नाम बदलें। 3. डेटा असंगत बनाने के लिए थोड़ा मुश्किल है। यह आमतौर पर तब होता है जब डीबी बाधाओं को सही तरीके से परिभाषित नहीं किया जाता है। कभी-कभी लोग स्कीमा को अधिक सामान्य बनाने के लिए करते हैं। यदि यह आपका मामला नहीं है तो बस # 3 भूल जाओ।

टीडीडी के साथ शुभकामनाएं! मेरा मानना ​​है कि भविष्य में आपके परीक्षण परिदृश्य अधिक परिष्कृत हो जाएंगे।

1

'getSubMissionPage' को किसी भी डेटा को वापस नहीं करना चाहिए - यह एक विशिष्ट अनुरोध करना है और फिर अनुरोध के आधार पर कुछ करना है।

आपको नकली डेटा स्रोत का उपयोग करने के लिए 'सबमिशन' कॉन्फ़िगर करने की आवश्यकता है और फिर परीक्षण करें कि कक्षा इसके सुधार अनुरोध करता है और डेटा को सही ढंग से वस्तुओं में मैप करता है।

+0

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

+0

वापस लौटने के साथ शुरू करें। फिर जांचें कि आवश्यक कुंजी मानचित्र में मौजूद हैं। –

3

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

फिर परीक्षण को हरा करने के लिए, बस फेंकने की बजाय विधि वापस शून्य करें।

किसी अतिरिक्त परीक्षण या दो बल तक डेटाबेस से कनेक्ट होने से परेशान न हों।

+0

'नया रनटाइम अपवाद ("असफल") फेंकें;' आमतौर पर अच्छी तरह से करेंगे। –

+0

+1 मैं आमतौर पर 'नए असमर्थित ऑपरेशन अपवाद();' का उपयोग करता हूं। इस जवाब से बिल्कुल सहमत हैं। –

+0

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

5

डेटाबेस से पुनर्प्राप्ति टीडीडी के साथ शुरू करने की जगह नहीं है।

नेट पर टीडीडी के कुछ उदाहरण देखने के लिए आपको अच्छा लगेगा। बॉब मार्टिन का bowling game scoring शुरू करने के लिए एक मजेदार जगह है।

कहा जा रहा है ...

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

उद्देश्य डेटा वापस नहीं करना है, लेकिन सही डेटा वापस करने के लिए है।

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

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

लेकिन आप डेटाबेस सामान से शुरू नहीं कर रहे हैं।

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