2008-09-20 11 views
16

आप एक बड़े एमएफसी यूआई एप्लिकेशन का परीक्षण कैसे करते हैं?यूनिट परीक्षण एमएफसी यूआई अनुप्रयोग?

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

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

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

पर्यावरण सी ++/सी/फोरट्रान, एमएसवीसी 2005, इंटेल फोरट्रान 9.1, विंडोज एक्सपी/विस्टा x86 & x64 है।

उत्तर

11

यह इस बात पर निर्भर करता है कि ऐप कैसे संरचित है। यदि तर्क और जीयूआई कोड अलग किया गया है (एमवीसी) तो तर्क का परीक्षण करना आसान है। माइकल फेदर "Humble Dialog Box" (पीडीएफ) पर एक नज़र डालें।

संपादित करें: यदि आप इसके बारे में सोचते हैं: यदि ऐप को इस तरह से संरचित नहीं किया गया है तो आपको बहुत सावधानीपूर्वक प्रतिक्रिया देनी चाहिए। तर्क का परीक्षण करने के लिए कोई और तकनीक नहीं है। लिपियों जो क्लिक अनुकरण करती हैं वे सिर्फ सतह को खरोंच कर रहे हैं।

यह वास्तव में बहुत आसान है:

अपने नियंत्रण/खिड़की/जब उपयोगकर्ता एक बटन क्लिक करता है और आप सुनिश्चित लिस्टबॉक्स क्लिक करने के बाद सही सामान शामिल हैं बनाना चाहते जो कुछ भी एक लिस्टबॉक्स की सामग्री को बदलता है मान लें।

  1. रिफैक्टर ताकि सूची बॉक्स के लिए आइटम के साथ एक अलग सूची हो। आइटम सूची में संग्रहीत होते हैं और आपके डेटा से आने वाले व्हीवर से निकाले नहीं जाते हैं। कोड जो सूचीबॉक्स सूची चीजें बनाता है केवल नई सूची के बारे में जानता है।
  2. फिर आप एक नया नियंत्रक ऑब्जेक्ट बनाते हैं जिसमें तर्क कोड होगा। बटन को संभालने वाली विधि केवल Mycontroller-> ButtonWasClicked() पर क्लिक करती है। यह सूची बॉक्स या किसी और चीज के बारे में नहीं जानता है।
  3. MyController :: ButtonWasClicked() इच्छित तर्क के लिए क्या करने की आवश्यकता है, आइटम सूची तैयार करता है और नियंत्रण को अपडेट करने के लिए कहता है। इसके लिए काम करने के लिए आपको नियंत्रण के लिए इंटरफ़ेस (शुद्ध वर्चुअल क्लास) बनाकर नियंत्रक और नियंत्रण को कम करने की आवश्यकता है। नियंत्रक केवल उस प्रकार का एक वस्तु जानता है, नियंत्रण नहीं।

यह बात करता है। नियंत्रक में तर्क कोड होता है और केवल इंटरफ़ेस के माध्यम से नियंत्रण जानता है। अब आप नियंत्रण का मज़ाक करके MyController :: ButtonWasClicked() के लिए नियमित इकाई परीक्षण लिख सकते हैं। यदि आपको पता नहीं है कि मैं किस बारे में बात कर रहा हूं, तो माइकल्स लेख पढ़ें। दो बार। और उसके बाद फिर से।
(स्वयं के लिए नोट: इतना बकवास करने के लिए नहीं सीखना चाहिए)

1

अच्छी तरह से हमारे पास कार्यस्थल पर इन भारी एमएफसी ऐप्स में से एक है। इसकी एक विशाल दर्द को बनाए रखने या विस्तार ... कीचड़ की अपनी एक विशाल गेंद अब, लेकिन यह moolah.Anyways

  • हम धुआं परीक्षण और की तरह करने के लिए Rational Robot का उपयोग में रेक करने के लिए।
  • एक और दृष्टिकोण जिसकी कुछ सफलता मिली है, एक छोटी उत्पाद-विशिष्ट भाषा और स्क्रिप्ट परीक्षण है जो वीबीस्क्रिप्ट और कुछ नियंत्रण हैंडल जासूसी जादू का उपयोग करते हैं। सामान्य क्रियाओं को कमांड में बदलें .. उदा। ओपनडेटाबेस एक कमांड होगा जो बदले में मुख्य मेनू> फ़ाइल> "ओपन ..." पर क्लिक करने के लिए आवश्यक स्क्रिप्ट ब्लॉक इंजेक्ट करेगा। फिर आप एक्सेल शीट्स बनाते हैं जो ऐसे आदेशों की श्रृंखला हैं। ये आदेश पैरामीटर भी ले सकते हैं। कुछ एफआईटी टेस्ट की तरह .. लेकिन अधिक काम। एक बार जब आपके पास सामान्य आदेशों की पहचान की जाती है और स्क्रिप्ट तैयार होती हैं। यह नए परीक्षण लिखने के लिए स्क्रिप्ट (कमांडआई द्वारा टैग की गई) को चुनता है और इकट्ठा करता है। एक परीक्षण धावक इन एक्सेल शीट्स को पार करता है, सभी छोटे स्क्रिप्ट ब्लॉक को एक टेस्ट स्क्रिप्ट में जोड़ता है और इसे चलाता है।

    1. OpenDatabase "C: \ परीक्षण \ mydb"
    2. OpenDialog "मॉडल जोड़ें"
    3. AddModel "M0001", "MyModel", 2.5, 100
    4. PressOK
    5. SaveDatabase

एचटीएच

0

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

हमारे सभी एप्लिकेशन स्क्रिप्टिंग के लिए एक COM API का समर्थन करते हैं, जिसे हम वीबी के माध्यम से परीक्षण को वापस लेते हैं, लेकिन यह एपीआई को इस तरह के एप्लिकेशन का परीक्षण नहीं करता है।

आदर्श रूप से मुझे दिलचस्पी होगी कि लोग डेवलपर स्तर पर एप्लिकेशन में सीपीपीयूनेट और इसी तरह के यूनिट परीक्षण ढांचे को कैसे एकीकृत करते हैं।

12

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

अब मैं प्रस्तावित करने जा रहा हूं निश्चित रूप से कड़ी मेहनत .. लेकिन कुछ अनुशासन और दृढ़ता के साथ आप जल्द ही लाभ देखेंगे।

  • सबसे पहले आपको कुछ समय लेने के लिए नए फ़िक्स के लिए कुछ प्रबंधन बैकिंग की आवश्यकता होगी। सुनिश्चित करें कि हर कोई क्यों समझता है।
  • अगला WELC book की एक प्रति खरीदें। यदि आपके पास समय है या यदि आप कठोर दबाए गए हैं, तो कवर करने के लिए इसे कवर करें, अपने ऐप का प्रदर्शन करने वाले लक्षण को ढूंढने के लिए इंडेक्स को स्कैन करें। इस पुस्तक में बहुत अच्छी सलाह है और मौजूदा कोड टेस्टेबल प्राप्त करने का प्रयास करते समय आपको केवल वही चाहिए। alt text http://ecx.images-amazon.com/images/I/51RCXGPXQ8L._SL160_AA115_.jpg
  • फिर प्रत्येक नए फिक्स/चेंज के लिए, कुछ समय बिताएं और उस क्षेत्र को समझें जिसे आप काम करने जा रहे हैं। वर्तमान व्यवहार का उपयोग करने के लिए अपनी पसंद के एक xUnit संस्करण (स्वतंत्र रूप से उपलब्ध) में कुछ परीक्षण लिखें।
  • सुनिश्चित करें कि सभी परीक्षण पास हो जाएं। एक नया परीक्षण लिखें जो आवश्यक व्यवहार या बग का उपयोग करता है।
  • इस अंतिम परीक्षण पास को बनाने के लिए कोड लिखें।
  • डिजाइन में सुधार के लिए परीक्षण के तहत क्षेत्र के भीतर निर्दयतापूर्वक रिफैक्टर।
  • यहां से प्रत्येक सिस्टम में आपको जो भी नया बदलाव करना है, उसके लिए दोहराएं। इस नियम के लिए कोई अपवाद नहीं है।
  • अब वादा किया गया भूमि: जल्द ही अच्छी तरह से परीक्षण कोड के बढ़ते द्वीप सतह पर शुरू हो जाएंगे। स्वचालित परीक्षण सूट के तहत अधिक से अधिक कोड गिरेंगे और परिवर्तन करने के लिए क्रमिक रूप से आसान हो जाएगा। और ऐसा इसलिए है क्योंकि धीरे-धीरे और निश्चित रूप से अंतर्निहित डिज़ाइन अधिक टेस्टेबल बन जाता है।

मेरा पिछला जवाब आसान तरीका था। यह मुश्किल लेकिन सही तरीका है।

3

हालांकि सही नहीं, सबसे अच्छा मैं इस के लिए मिल गया है AutoIt http://www.autoitscript.com/autoit3

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

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

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

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

+0

मुझे ऑटोआईटी 3 की कार्यक्षमता पसंद है लेकिन सवाल यूनिट परीक्षण के बारे में था और आप यूआई एकीकरण परीक्षण के बारे में बात कर रहे हैं। वे दो अलग-अलग परीक्षण हैं। –

2

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

Designing Robust Objects with Boost

+0

मैं अपने एमएफसी अनुप्रयोगों के लिए इस इकाई परीक्षण ढांचे पर विचार कर रहा हूं। लेकिन मैं यूआई तर्क भी परीक्षण करना चाहता हूं। मैं समझता हूं कि व्यू क्लास का परीक्षण करना असंभव होगा। लेकिन दस्तावेज़ वर्ग के बारे में कैसे? मैं दस्तावेज़ वर्ग को एमवीपी के प्रस्तुतकर्ता के रूप में कार्य करने और उस वर्ग पर यूनिट परीक्षणों को कार्यान्वित करके यूआई तर्कों का परीक्षण करने के बारे में सोच रहा हूं जैसे कि हम एमवीसी में टेस्ट कंट्रोलर क्लास करते हैं। क्य आपको लगता यह काम करेगा? –

3

मुझे पता है कि यह एक दिनांकित सवाल है, लेकिन हम में से जो लोग अभी भी MFC के साथ काम करने के लिए, VS2012 में माइक्रोसॉफ्ट सी ++ यूनिट परीक्षण फ्रेमवर्क अच्छी तरह से काम करता है।

जनरल प्रक्रिया:

  1. एक स्थिर पुस्तकालय
  2. अपने समाधान के लिए एक नया मूल निवासी यूनिट टेस्ट परियोजना जोड़े के रूप में अपने MFC परियोजना संकलित करें।
  3. टेस्ट प्रोजेक्ट में, अपनी एमएफसी परियोजना को संदर्भ के रूप में जोड़ें।
  4. टेस्ट प्रोजेक्ट के कॉन्फ़िगरेशन गुणों में, अपनी शीर्षलेख फ़ाइलों के लिए निर्देशिकाएं शामिल करें।
  5. लिंकर में, इनपुट विकल्प आपके MFC.lib; nafxcwd.lib; libcmtd जोड़ें।lib;
  6. 'विशिष्ट डिफ़ॉल्ट पुस्तकालयों को अनदेखा करें' के अंतर्गत nafxcwd.lib जोड़ें; libcmtd.lib;
  7. सामान्य के तहत अपनी एमएफसी निर्यातित lib फ़ाइल का स्थान जोड़ें।

https://stackoverflow.com/questions/1146338/error-lnk2005-new-and-delete-already-defined-in-libcmtd-libnew-obj का एक अच्छा विवरण है कि आपको nafxcwd.lib और libcmtd.lib की आवश्यकता क्यों है।

विरासत परियोजनाओं में जांच करने के लिए अन्य महत्वपूर्ण बात। सामान्य कॉन्फ़िगरेशन गुणों में, सुनिश्चित करें कि दोनों प्रोजेक्ट एक ही 'कैरेक्टर सेट' का उपयोग कर रहे हैं। यदि आपका एमएफसी मल्टी-बाइट कैरेक्टर सेट का उपयोग कर रहा है तो आपको ऐसा करने के लिए एमएस टेस्ट की भी आवश्यकता होगी।

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