2010-10-19 15 views
5

हताशा का महीनों के बाद और पिछले डेवलपर्स मैंने तय की वूडू गुड़िया में सुई डालने बेहतर विरासत कोड refactor करने के लिए कोशिश है कि में बिताए समय की।UnitTesting एक वर्ग है कि एक जटिल डाटासेट रिटर्न

मैं पहले से ही Micheal Feather's book आदेश दिया, मैं Fowler's refactoring में हूँ और मैं DUnit साथ कुछ नमूना परियोजनाओं बनाया है।

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

लगभग 100% यूआई में फंस व्यापार तर्क है, इसके अलावा सभी प्रक्रियात्मक प्रोग्रामिंग (कुछ कुछ अपवादों के साथ) है। आवेदन & गंदे के रूप में शुरू हुआ और इस तरह जारी रहा।

सभी आवेदन के लिए अब लेखन परीक्षण मेरे मामले में एक अर्थहीन काम है, लेकिन मैं unittest कुछ है कि मैं refactor करने के लिए की जरूरत करने की कोशिश करना चाहते हैं।

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

इसलिए एक बड़ी प्रतिलिपि और पेस्ट ऑपरेशन से बचने के लिए मुझे नई कक्षा की आवश्यकता है।

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

के बाद से refactor छोटे कदम पर पर होता है और परीक्षण refactor करने के लिए की जरूरत है बेहतर मैं थोड़ा आगे बढ़ने के उलझन में हूँ।

निम्नलिखित बातों मेरे लिए स्पष्ट नहीं हैं:

1) कैसे एक जटिल डेटासेट परीक्षण करने के लिए? क्या मुझे वर्किंग एप्लिकेशन चलाया जाना चाहिए, एक परिणाम सेट को एक्सएमएल में सहेजना चाहिए, और एक टेस्ट लिखना चाहिए जहां मैं उस एक्सएमएल डेटा वाले TClientDataSet का उपयोग करता हूं?

2) मुझे TSchedulerData के बारे में कितना ख्याल रखना है? मेरा मतलब है कि मैं 100% निश्चित नहीं हूं कि मैं टीएसड्यूलरडाटा का उपयोग करूंगा, हो सकता है कि मैं डेटासेट के साथ रहूंगा, वैसे भी जटिल परीक्षण बनाने की सोच जो कि 2 सप्ताह में छोड़ा जाएगा, एक डुनिनेट न्यूबी के लिए अपील नहीं कर रहा है। वैसे भी शायद यह इस तरह काम करता है। मैं उन बगों की संख्या की कल्पना नहीं कर सकता जो मुझे परीक्षण के बिना सामना करना पड़ेगा।

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

उत्तर

2

आपका अंतिम लक्ष्य UI, डेटा संग्रहण और व्यावसायिक तर्क को अलग-अलग परतों में अलग करना है।

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

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

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

for I:=0 to List.Count - 1 do 
begin 
    //HERE 
end; 

if /*HERE if its a complex condition*/ then 
begin 
    //HERE 
end 
else 
begin 
    //HERE 
end 

Answer := Var1/Var2 + Var1 * Var3; //HERE 

आप इन निकासी बिंदुओं में से एक में आते हैं

  1. तय करें कि आप अपने नए विधि के लिए की तरह लग रहे करने के लिए विधि हस्ताक्षर हैं: विधि नाम, पैरामीटर, वापसी मूल्य।
  2. एक परीक्षण लिखें जो इसे कॉल करता है और अपेक्षित परिणाम की जांच करता है।
  3. विधि निकालें।

यदि सब ठीक हो जाए तो आपके पास कम से कम एक गुजरने वाली इकाई परीक्षण के साथ एक नई निकाली गई विधि होगी।

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

अपने टेस्ट स्वीट के रूप में बढ़ता है तो आप यह सुनिश्चित करने के लिए अपने नवीनतम परिवर्तन कहीं कुछ टूटा नहीं किया गया है प्रत्येक परिवर्तन के बाद उन्हें चलाने के लिए चाहता हूँ।

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

2

मैं कहूंगा कि ध्यान केंद्रित बच्चे के चरणों में इसका दृष्टिकोण लें।

चरण # 1: - सुरक्षा तंत्र उर्फ ​​प्रतिगमन परीक्षण हमेशा आक्रमण TForm के अपने क्षेत्र के आसपास कुछ परीक्षण पाने के लिए होना चाहिए। आपके मामले में, समझें कि ऐप क्या कर रहा है। जो मैंने पढ़ा है, उससे डेटा ट्रांसफार्मर लगता है।इसलिए इनपुट डेटा और संबंधित आउटपुट शेड्यूल के संयोजन सभी को समझने के लिए समय व्यतीत करें (या सबसे महत्वपूर्ण यदि सभी संभव नहीं हैं)। उन्हें परीक्षण के रूप में लिखें। सुनिश्चित करें कि सभी परीक्षण पास हो जाते हैं।

चरण # 2: अब अपने रिफैक्टरिंग का प्रयास करें। कोड के ब्लॉक को समेकित कक्षाओं में ले जाएं आदि सभी को रिग्रेशन नेट की सुरक्षा के तहत।

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

+0

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

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