2008-12-04 15 views
13

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

यूनिट परीक्षण की सड़क पर शुरू करने के लिए मुझे थोड़ा मुश्किल लगता है क्योंकि मुझे यह सुनिश्चित करना है कि मेरे डेटाबेस को चलाने के लिए मेरे डेटाबेस को ठीक से शुरू किया गया है।

इस संबंध में मदद करने के लिए आम प्रथाएं क्या हैं?

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

मैं जानता हूँ कि मैं एक बना सकते हैं के साथ है पारित करने के लिए अपने परीक्षण के लिए सेटअप स्क्रिप्ट, databas आदि विश्राम के लिए कुछ

मैं अपने पूरे समय खर्च मेरी परीक्षण को बनाए रखने और अपने डेटाबेस सुनिश्चित खत्म नहीं करना चाहती sych

में है या यह है कि यूनिट टेस्टिंग की लागत/TDD?

उत्तर

6

यदि आप एक से अधिक इकाइयों का परीक्षण कर रहे हैं तो यह यूनिट परीक्षण नहीं है।

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

फिर आप डेटा परत के लिए अन्य यूनिट परीक्षण (और एकीकरण परीक्षण) विकसित करने के लिए स्वतंत्र हैं ताकि यह सुनिश्चित किया जा सके कि यह सही है (डेटाबेस में लिख रहा है)।

+1

इसके साथ मेरी समस्या यह है कि आप अपने मॉक डाटलियर को लिखने और डिबग करने और बनाए रखने के लिए जितना समय बिताते हैं, वैसे ही आप अपने असली डेटालियर को बनाए रखते हैं, और बिना किसी भुगतान के। –

+0

मैं असहमत हूं, और मुझे अभ्यास में यह समस्या नहीं है। मुझे लगता है कि यह आपकी डेटा परत के आकार पर निर्भर करता है। मैं एक डीएओ दृष्टिकोण का उपयोग करना पसंद करता हूं, जहां मेरे पास डोमेन ऑब्जेक्ट में एक डीएओ है; ऑपरेशन तब बहुत छोटे होते हैं (प्राप्त करें, जोड़ें, हटाएं, आदि)। अधिकांश समय मैं कुछ लोगों में मॉक क्लास को कार्यान्वित कर सकता हूं ... –

+0

.. मिनट, बस एक ऐसी कक्षा बनाकर जो एक सूची से बाहर हो जाता है जिसे कॉलर कन्स्ट्रक्टर के माध्यम से पास कर सकता है। लेकिन आप सही हैं कि ऐसा लगता है कि आप परीक्षण का समर्थन करने के लिए कोड लिख रहे हैं - लेकिन मुझे लगता है कि परीक्षण डेटाबेस प्रबंधित करने से बेहतर है, सुनिश्चित करें कि डेटा मौजूद है, आदि –

1

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

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

+0

मेरे अधिकांश कोड, बहुत utils के अलावा, डेटाबेस का उपयोग करें। तो अगर मुझे पता है कि अगर मेरे पास डीबी में 5 ऑब्जेक्ट हैं, तो मुझे परिणाम संख्या 3 के रूप में होना चाहिए। और यूनिट टेस्ट में मैं "3" की जांच कर सकता हूं। लेकिन इस तरह के मामले में मजाक करने के साथ क्या? –

7

समाधान मॉकिंग है। कनेक्शन "प्रतिस्थापित" मोक्स। परीक्षण के तहत इकाई मॉक को "कनेक्ट" करेगी और इसके बयान को निष्पादित करेगी। मॉक सामान्य परिणाम o.s.e देता है।

परीक्षण के बाद, नकली आप सभी तरीकों, कि परीक्षण के अंतर्गत इकाई द्वारा कहा जाता था की एक सूची दे सकते हैं। Easymock.org

जैसा कि दूसरे ने कहा: डीबी कनेक्शन यूनिट परीक्षण नहीं है। तो इसे छोड़ दें और मॉकिंग ऑब्जेक्ट्स

5

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

0

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

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

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

और इसी तरह ... यूनिट परीक्षण/टीडीडी की लागत बस समय के साथ पिलिंग रखती है।

2

ऐसा लगता है कि आप वास्तव में कार्यात्मक/एकीकरण परीक्षण चाहते हैं। वेब अनुप्रयोगों के लिए मैं आपको सलाह देता हूं कि आप Selenium या Canoo WebTest देखें।

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

1

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

इस तरह मैंने अपने मॉडल और डेटा एक्सेस का परीक्षण किया है ताकि यह सुनिश्चित किया जा सके कि उनके प्रश्न सही तरीके से बने हैं।

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

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