मैं एक ऐप का परीक्षण करने के लिए यूनिट टेस्ट और टीडीडी का उपयोग कैसे कर सकता हूं जो ज्यादातर डेटाबेस सीआरयूडी ऑपरेशन पर निर्भर करता है?


22

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

हमारे कीड़े के अधिकांश हिस्से में एक या दूसरे तरीके से जेपीए शामिल है।

  • उदाहरण 1: यदि आप दो बार सेव बटन पर क्लिक करते हैं, तो JPA दूसरी बार डेटाबेस में उसी इकाई को डालने का प्रयास कर सकता है, जिससे प्राथमिक कुंजी का उल्लंघन होता है।
  • उदाहरण 2: आप डेटाबेस से एक इकाई प्राप्त करते हैं, इसे संपादित करते हैं और इसके डेटा को अपडेट करने का प्रयास करते हैं। JPA पुराने को अपडेट करने के बजाय एक नया उदाहरण बनाने की कोशिश कर सकता है।

अक्सर समाधान के लिए जेपीए एनोटेशन को जोड़ने / हटाने / बदलने की आवश्यकता होती है। अन्य बार इसे DAO तर्क को संशोधित करने के साथ करना पड़ता है।

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

यूनिट परीक्षण एक खराब फिट की तरह लगते हैं क्योंकि मैं केवल रनटाइम पर इन समस्याओं की खोज कर सकता हूं और मुझे मुद्दों को पुन: पेश करने के लिए ऐप सर्वर पर तैनात करने की आवश्यकता है। आमतौर पर डेटाबेस को शामिल करने की आवश्यकता होती है जिसे मैं एक इकाई परीक्षण की परिभाषा से बाहर मानता हूं: ये एकीकरण परीक्षण हैं।

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

इस साँचे के बाहर कोड है और मैं हमेशा इकाई परीक्षण करता हूं कि जब भी मैं कर सकता हूं। लेकिन हमारे कीड़े और सबसे बड़े समय सिंक के अधिकांश हिस्से में हमेशा जेपीए या डेटाबेस शामिल होता है।


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


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

@randomA सही है, मैंने अपना प्रश्न स्पष्ट रूप से कहने के लिए संपादित किया। मुझे समझ में नहीं आ रहा है कि आप सवाल क्यों बदल रहे हैं। क्या आप विस्तार से समझा सकते हैं? मैं वहाँ में इकाई परीक्षण हिस्सा रखने के लिए, क्योंकि मैं चाहता हूँ चाहता हूँ बल्कि एकीकरण परीक्षणों से इकाई परीक्षण लेखन (हालांकि मुझे पता कर रहा हूँ कि unit testing != TDD)
डैनियल कापलान

हालांकि कुछ खास नहीं है, बस वहां टीडीडी को रखा जाए। अगर आप वहां यूनिट-टेस्ट करते हैं, तो कई लोग सोचते होंगे कि आप चीज़ को नहीं समझते, आदि .. आपके लिए अच्छा नहीं है ..
InformedA


जवाबों:


7

एक विकल्प H2 जैसे इन-मेमोरी टेस्टिंग डेटाबेस का उपयोग करना है ; यह एक मानक डिस्क का उपयोग करने वाले डेटाबेस की तुलना में लगभग 10x तेज होता है, और कम स्टार्टअप / फाड़ के समय के साथ।

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

लेकिन अगर आप पूरी प्रणाली के साथ हर एक के लिए H2 के साथ 10 रन बना सकते हैं, तो यह भुगतान कर सकता है।


यह एक अच्छा विचार है, लेकिन मुझे अभी भी ऐप सर्वर, AFAIK में तैनात करना होगा। यह 3+ मिनट का एक बहुत कुछ है। उस ने कहा, यह निश्चित रूप से करने लायक है। लेकिन परीक्षणों को चलाने के बारे में कल्पना करना अभी भी मुश्किल है क्योंकि मैं यूनिट परीक्षण चलाऊंगा और इसलिए टीडीडी का उपयोग करना विकसित करना अक्षम लगता है।
डैनियल कपलान

1
मुझे लगता है कि आमतौर पर उस आवश्यकता के आसपास तरीके होते हैं (जैसे docs.oracle.com/middleware/1212/toplink/TLADG/testingjpa.htm )। हालांकि उचित से अधिक काम होने की बहुत अधिक संभावना; एक अन्य विकल्प कुछ बीफ़ियर परीक्षण सर्वर प्राप्त करना और चीजों को समानांतर में चलाना होगा।
सोरू

1
@tieTYT gsub पर crud वेब ऐप का परीक्षण करने वाली hsqldb इकाई के साथ अवधारणा का मेरा अपना प्रमाण: TestWithHsqldb - इकाई परीक्षणों को ऐप को तैनात करने की आवश्यकता नहीं है।

3

डेटाबेस टेस्ट यूनिट टेस्ट के लिए बहुत आसान हो सकता है - आपको संग्रहीत प्रक्रियाओं और लेनदेन की आवश्यकता होती है।

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

आशा है कि यह आपको कुछ जानकारी दे सकता है कि इसे अपने ढांचे में कैसे करें।


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

हम अपने SQL के लिए DB इकाई परीक्षण चलाते थे, लेकिन तब वे सभी स्पोक में थे। वहाँ (हे, हम बिल्ड सर्वर जो था में हरे रंग की टिक मिला जबकि आप कर सकते हैं अन्य एसक्यूएल प्रक्रियाओं से इकाई परीक्षण एसक्यूएल निर्देशिका, हमारे इकाई परीक्षण रूपरेखा MSTest था तो यह समझ में बनाया उन लोगों से चलाने के लिए सबसे महत्वपूर्ण कारक है)। यदि आपके पास एक DB हमेशा बना रहता है (और हमने वैसे भी int। परीक्षण के लिए) तो सभी sql कोड अपलोड करने और बिल्ड सर्वर पर सभी यूनिट परीक्षण चलाने में आसान है। कभी-कभी आपको बस इन चीजों के बारे में व्यावहारिक होना चाहिए।
gbjbaanb

मुझे नहीं लगता कि आपने मेरे पहले वाक्य का जवाब दिया।
डैनियल कपलान

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

3

अन्य लोगों ने जवाब दिया है "अपने डीबी को बाहर करो!" - लेकिन आपकी डीबी परत का मजाक उड़ाने की क्या बात है अगर आपको वास्तव में यह परखने की आवश्यकता है कि यह आपके कोड के साथ कैसे इंटरैक्ट करता है?

आप जो खोज रहे हैं वह एकीकरण परीक्षण और / या स्वचालित UI परीक्षण है। आपने बताया कि समस्या तब होती है जब:

*If you click the save button twice*

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

आपको शायद डीबी के परीक्षण के लिए एक इकाई की आवश्यकता होगी और आपके परीक्षणों के लिए इसे उसी ओर इंगित करना होगा। दर्द को बनाए रखने के लिए लेकिन वास्तविक दुनिया में टीडीडी में आपका स्वागत है।


यह एक उत्तर की तुलना में एक शेख़ी की तरह अधिक पढ़ता है
gnat

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

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

0

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

जब आप एक इकाई परीक्षण (यानी एकीकरण / सिस्टम परीक्षण) के लिए एक अच्छा फिट नहीं होते हैं, तो आपको टीडीडी टूटना शुरू हो सकता है - यह हाल ही में टीडीडी है मृत?" केंट बेक, मार्टिन फाउलर और डेविड हेंमियर हेंसन के बीच बहस: http://martinfowler.com/articles/is-tdd-dead/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.