जीयूआई के लिए रखरखाव योग्य, भंगुर नहीं, इकाई परीक्षण कैसे लिखें?


16

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

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


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


1
@MichaelDurrant: आपने सामान्य रूप से UI परीक्षण के बारे में प्रश्न संपादित किया, जबकि मैंने मूल रूप से इकाई परीक्षण के बारे में पूछा था। मुझे यह सुनिश्चित करने के लिए एकीकरण परीक्षण कठिन लगता है और जब भी संभव हो, मैं उन पर इकाई परीक्षण पसंद करता हूं।
mik01aj

2
मुझे लगता है कि यह समस्या का हिस्सा है, हालांकि, मौलिक रूप से आप इकाई परीक्षण द्वारा किसी भी इंटरफ़ेस का परीक्षण अकेले नहीं कर सकते हैं क्योंकि उनका राइस डीट्रे किसी चीज़ के लिए इंटरफ़ेस करना है। इस संबंध में GUI अलग नहीं हैं।
जे.के.

m01, आप इसे वापस बदल सकते हैं। मुझे लगता है कि यूआई परीक्षण आमतौर पर एकीकृत परीक्षण हैं। परीक्षण बीज और स्थिरता डेटा मौजूद होने और यूआई उनके साथ काम करने पर भरोसा करते हैं। यदि आपके पास सही UI परीक्षण हैं जो किसी भी अन्य डेटा पर भरोसा नहीं करते हैं जो उत्कृष्ट है। हालाँकि मैंने इसे अपेक्षाकृत दुर्लभ पाया है।
माइकल ड्यूरेंट

2
संबंधित लेकिन नहीं एक डुप्लिकेट क्योंकि यह गुई परीक्षणों के बारे में है: प्रोग्रामर.स्टैकएक्सचेंज.
com

जवाबों:


3

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

एक उदाहरण के रूप में, एक परीक्षण पर विचार करें जो निम्न है:

जब उपयोगकर्ता '999 ’फोननंबर क्षेत्र में प्रवेश करता है और सहेजें बटन पर क्लिक करता है, तो त्रुटि संदेश पॉपअप को। अमान्य फ़ोन नंबर’ कहना चाहिए।

इस परीक्षण के लिए यहां बहुत सारे कमरे हैं जब आप इंटरफ़ेस को फिर से काम करते हैं, भले ही सत्यापन के लिए आवश्यकता बनी रहे।

अब, इसे थोड़ा वैकल्पिक शब्दों में रखने की अनुमति देता है:

जब उपयोगकर्ता '999 ’को एक फोननंबर के रूप में दर्ज करता है और प्रोफ़ाइल पेज को बचाता है, तो उसे एक त्रुटि दिखानी चाहिए जो कहती है कि number अमान्य फ़ोन नंबर’

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


4

यह एक आम समस्या है। मैं इस पर ध्यान दूंगा:

  • आप तत्वों को कैसे नाम देते हैं

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

  • आप तत्वों की पहचान कैसे करते हैं।

    स्थिति के पहचानकर्ताओं से बचें table/tr/td/tdजैसे कि रूपों के पक्ष में td[id="main_vehicle"या जैसे td[class='alternates']। उपयुक्त होने पर डेटा विशेषताओं का उपयोग करने पर विचार करें। इससे भी बेहतर है कि लेआउट टैग से बचने की कोशिश करें, जैसे <td>कि ऊपर के लिए आप या तो एक स्पैन जोड़ सकते हैं और इसका उपयोग कर सकते हैं, जैसे कि <span id="main_vehicle">या वाइल्डकार्ड चयनकर्ता जैसे कि *[id="main_vehicle"]जहां *अब डिव, स्पैन, td, आदि हो सकते हैं।

  • परीक्षण विशिष्ट डेटा विशेषताओं का उपयोग करना जो केवल क्यूए और परीक्षण के लिए उपयोग किए जाते हैं।

  • तत्वों के लिए अनावश्यक योग्यता से बचें। आप निम्नलिखित का उपयोग करके खुद को पा सकते हैं:

    body.main div#vehicles > form#vehicle input#primary_vehicle_name

    हालाँकि इसके लिए उस इनपुट फ़ील्ड की आवश्यकता होती है, जो वाहन की सटीक आईडी के साथ और पृष्ठ पर एक शरीर के साथ रहती है, जिसमें मुख्य वर्ग और वाहनों की आईडी के साथ एक div है, जिसमें एक आईडी के साथ एक फार्म का तत्काल बच्चा है वाहन। उस संरचना में कोई भी परिवर्तन और परीक्षण टूट जाता है। इस मामले में आपको मिल सकता है

    input#primary_vehicle_name

    तत्व को विशिष्ट रूप से पहचानने के लिए पर्याप्त है।

  • उन परीक्षणों से बचें जो दृश्यमान पाठ को संदर्भित करते हैं। उपयोगकर्ता को दिखाए जाने वाले पृष्ठ पर पाठ आमतौर पर साइट के रखरखाव और अद्यतन के रूप में समय के साथ बदलता है, इसलिए सीएसएस आईडी और सीएसएस वर्ग या डेटा विशेषताओं जैसे पहचानकर्ताओं का उपयोग करें। तत्व जैसे कि form, inputऔर selectप्रपत्रों में उपयोग किए जाने वाले तत्व पहचान करने के अच्छे भाग भी हैं, आमतौर पर आईडी या वर्ग के साथ संयोजन में, उदाहरण के लिए li.vehicleया input#first-vehicle आप अपने स्वयं के पहचानकर्ता भी जोड़ सकते हैं, जैसे <div data-vehicle='dodge'>। इस तरह आप तत्व आईडी या कक्षाओं का उपयोग करने से बच सकते हैं, जो डेवलपर्स और डिजाइनरों द्वारा बदले जाने की संभावना है। मैंने वास्तव में समय के साथ पाया है कि इसके डेवलपर्स और डिजाइनरों के साथ काम करने के लिए बेहतर है और नाम और स्कोप पर समझौता करने के लिए आते हैं। वह कठिन है।

  • निश्चित डेटा कैसे बनाए रखा जाता है।

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

    storedVars["eqv_auto_year"] = "2015";
    storedVars["eqv_auto_make_1"] = "ALFA ROMEO";
    storedVars["eqv_auto_make_2"] = "HONDA";`  
    

    सेलेनियम विकी और सेलेनियम डॉक्स में पेज ऑब्जेक्ट्स पर अधिक

  • डेवलपर्स के साथ संचार।

    भले ही 'डेवलपर्स परिवर्तन करें और QA स्वचालन को तोड़ें' के संदर्भ में तकनीकी दृष्टिकोण एक वर्कफ़्लो समस्या है। आपको यह सुनिश्चित करने की आवश्यकता है कि: हर कोई एक ही टीम है; डेवलपर एक ही एकीकृत परीक्षण चलाते हैं; मानकों पर दोनों समूहों द्वारा सहमति व्यक्त की जाती है; किया की परिभाषा में चल रहा है और संभवतः यूआई परीक्षण को अपडेट करना शामिल है; डेवलपर्स और टेस्टर की जोड़ी परीक्षण योजनाओं पर है और दोनों टिकट ग्रूमिंग (यदि एगाइल कर रहे हैं) में भाग लेते हैं और ग्रूमिंग के भाग के रूप में यूआई परीक्षण के बारे में बात करते हैं। आपको यह सुनिश्चित करना चाहिए कि नामकरण के लिए आप जो भी दृष्टिकोण और रणनीति का उपयोग करते हैं, वह एप्लिकेशन डेवलपर्स के साथ समन्वित है। यदि आप उसी पृष्ठ पर नहीं आते हैं, तो आप ऑब्जेक्ट नामकरण पर टकराव चाहेंगे। पृष्ठ ऑब्जेक्ट के कुछ उदाहरण जो मैंने हाल ही में रूबी प्रोजेक्ट के लिए बनाए हैं:

    def css_email_opt_in_true
      'auto_policy[email_opt_in][value=1]'
    end 
    
    def css_phone_opt_in
      '*[name="auto_policy[phone_opt_in]"]'
    end 
    
    def css_phone_opt_in_true
      'input[name=phone_opt_in][value=true]'
    end 
    
    def css_credit_rating
      'auto_policy[credit_rating]'
    end
    

    यहाँ जावास्क्रिप्ट चर के समान पृष्ठ ऑब्जेक्ट हैं:

    storedVars["css_email_opt_in"] = "css=*[name='auto_policy[email_opt_in]']";
    storedVars["css_phone_opt_in"]="css=*[name='auto_policy[phone_opt_in]']";
    storedVars["css_phone_opt_in_true"]="css=input[name='phone_opt_in'][value=true]";
    storedVars["css_credit_rating"]="css=select[name='auto_policy[credit_rating]']";
    

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

1
आह, यह जानना अच्छा है। उस सामान के लिए हाँ, मैं वर्कफ़्लो और संगठनात्मक qa- डेवलपर इंटरैक्शन पर ध्यान केंद्रित करूंगा
माइकल ड्यूरेंट

1
मैं उन अन्य लोगों के लिए भी जानकारी पोस्ट कर रहा हूं जो आपके प्रश्न को ढूंढते हैं और आपके पास उन सभी टुकड़ों को जगह नहीं मिल सकती है जो आपके पास हैं या नहीं।
माइकल दुरंत

1
मैंने आपकी प्रतिक्रिया के आधार पर अपने अंतिम बुललेट बिंदु का विस्तार किया है।
माइकल डुरंट

1
और मैंने नामकरण और तत्वों की पहचान करने और दृश्य पाठ का उपयोग नहीं करने के बारे में भागों को अपडेट किया है।
माइकल ड्यूरेंट

3

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

जाहिर है, दृश्य भाग को केवल कार्यक्रम शुरू करने से ही जांचा जा सकता है, और यह जाँचता है कि यह क्या दर्शाता है - दूसरे शब्दों में, इसे केवल स्वीकृति परीक्षणों में परीक्षण किया जा सकता है।

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


GUI बहुत बदल जाते हैं

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


2
मुझे लगता है कि यह एक अच्छी बात है। शायद मैं सिर्फ MVC गलत कर रहा हूं :) Btw, मेरा मानना ​​है कि जब आप बहुत सारे उपयोगकर्ताओं के लिए एक वेब प्लेटफॉर्म विकसित करते हैं तो बदलती आवश्यकताएं अपरिहार्य हैं। जब तक वे GUI का उपयोग करना शुरू नहीं करते, तब तक आप नहीं जानते कि आपके उपयोगकर्ता कैसे व्यवहार करेंगे।
mik01aj

2

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

तुलना के रूप में:

अध्याय परीक्षा

मूल : validateEmail()एक InvalidDataअपवाद फेंक देना चाहिए । जो आपके इकाई परीक्षण में सही ढंग से शामिल है।

परिवर्तन : validateEmail()एक InvalidEmailअपवाद फेंक देना चाहिए । अब आपका परीक्षण गलत है, आप इसे अपडेट करते हैं, और सब कुछ फिर से हरा है।

जीयूआई टेस्ट

मूल : एक अमान्य ईमेल दर्ज करने से पॉपअप त्रुटि बॉक्स में "अमान्य डेटा दर्ज" होगा। आपके परीक्षणों से सही पता चला।

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


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

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