क्या जटिल नियमित अभिव्यक्तियों के लिए यूनिट परीक्षण होना चाहिए?


34

क्या मुझे अपने आवेदन में जटिल नियमित अभिव्यक्तियों के लिए यूनिट परीक्षण लिखना चाहिए?

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

संपादित करें:

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

लेकिन आंतरिक घटकों के रूप में rexxes की कुछ विशेष विशेषताएं हैं:

  1. एक एकल लाइन रेगेक्स वास्तव में एक अलग मॉड्यूल होने के बिना वास्तव में जटिल हो सकता है।
  2. रेग्जेस मैप इनपुट को बिना किसी साइड इफेक्ट के आउटपुट के लिए और इसलिए वास्तव में अलग से परीक्षण करना आसान है।

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

3
अधिक सामान्य तरीके से एक ही सवाल: कौन से आंतरिक घटकों को इकाई परीक्षण किया जाना चाहिए? देखें programmers.stackexchange.com/questions/16732/...
डॉक ब्राउन

Sorta संबंधित, देखें Regex101। उनके पास आपके regex के लिए इकाई परीक्षण लिखने के लिए एक खंड है। उदाहरण के लिए: regex101.com/r/tR3mJ2/2
डेविड कहते हैं, मोनिका

3
डिस्क्लेमर - यह टिप्पणी मेरी विनम्र राय है: 1 सबसे पहले मेरा मानना ​​है कि जटिल रीजैक्स शुद्ध दुष्ट हैं - यह भी देखें। ब्लॉग। कोडिंगहोर डॉट कॉम। 2 ऐसे भावों के परीक्षण का वास्तविक मूल्य तब आता है जब आप उन्हें असली डेटाबेस के बड़े डेटाबेस पर परीक्षण करते हैं। data blog.codinghorror.com/testing-with-the-force 3 मुझे एक अजीब सा अहसास है कि ये परीक्षण बिल्कुल यूनिट परीक्षण नहीं हैं
बोरिस ट्रेखोव

जवाबों:


101

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


25
+1, हालांकि तो एक रेगुलर एक्सप्रेशन जटिल पर्याप्त है कि यह कोई मुद्दा है, तो यह शायद समझ में आता है यह उचित तरीकों के साथ एक "आवरण" इकाई में स्थानांतरित करने के लिए ( isValid, parse, tryParseऐसा है, या whatnot, वास्तव में निर्भर करता है कि यह कैसे इस्तेमाल किया जा रहा है), क्लाइंट कोड को यह जानने की जरूरत नहीं है कि यह वर्तमान में रेगेक्स का उपयोग करके लागू किया गया है। रैपर यूनिट में फिर विस्तृत परीक्षण होंगे, जो - फिर से - वर्तमान कार्यान्वयन को जानने की आवश्यकता नहीं होगी। बेशक, ये परीक्षण डी वास्तव में रेगेक्स का परीक्षण कर रहे हैं , लेकिन कार्यान्वयन-अज्ञेय तरीके से।
ruakh

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

6
@ruakh वेल ने कहा। रेगेक्स के लिए एक आवरण वर्ग के लिए लाभ यह है कि यदि आप आवश्यक हो जाते हैं, तो आप इसे बड़े करीने से साधारण कोड के साथ बदल सकते हैं। जटिल इनपुट / आउटपुट वाले कोड में हमेशा यूनिट परीक्षण होना चाहिए, क्योंकि इसके बिना डिबग करना उल्लेखनीय रूप से कठिन है। यदि आपको कोड के प्रभावों को समझने के लिए दस्तावेज़ीकरण को संदर्भित करने की आवश्यकता है, तो इसके पास इकाई परीक्षण होना चाहिए। यदि यह केवल त्वरित 1: 1 मानचित्रण की तरह प्रकार रूपांतरण है, तो कोई समस्या नहीं है। Regexes को बहुत जल्दी डॉक्स की आवश्यकता के बिंदु मिलते हैं।
आरोन ३४६

4
@ एलआईआई: रेग्जेस किसी विशेष उपचार के लायक नहीं है। रेगेक्स इस मामले में इकाई है, इसलिए हम इसका परीक्षण करते हैं।
जैक्सबी

1
@ruakh मैं उस आशय का उत्तर लिखने वाला था। मैं मानता हूं कि रेगेक्स का उपयोग कार्यान्वयन विस्तार है। यह मायने रखता है कि जब वे चाहते हैं तो चीजें मान्य होती हैं, और जब उन्हें माना जाता है तो वे मान्य नहीं होते। FooValidatorइसके इनपुट और आउटपुट के लिए टेस्ट करें , फिर आपको इस बात की कोई चिंता नहीं है कि यह कैसे किया जा रहा है। ++
रबरडुक

21

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

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

जब भी आपको अपने regexes को बदलने की आवश्यकता होती है तो आप नए मामलों को परीक्षणों के रूप में जोड़ते हैं, अपने regex को संशोधित करते हैं और सर्वोत्तम के लिए आशा करते हैं।

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


3

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

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

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


1

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

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


3
अंगूठे का एक नियम मुझे एहसास हुआ है; यदि मुझे कोड लिखने और निरीक्षण करने के लिए डॉक्स की आवश्यकता है, तो मुझे एक यूनिट टेस्ट की आवश्यकता होगी। उन्होंने मुझे कई सिरदर्द से बचाया है, अशक्त बिंदुओं को पकड़ना, कोई भी प्रकार नहीं, और गलत आउटपुट। वे अंतिम उपयोगकर्ता को अनिवार्य रूप से टूटने पर न्यूनतम प्रयास के साथ आपके कोड को सुधारने की क्षमता भी देते हैं।
आरोन 3468

-1

दूसरी ओर: वे स्वयं कुछ इकाई के इंटरफेस का शायद ही कभी हिस्सा होते हैं। यह केवल इंटरफ़ेस का परीक्षण करने के लिए बेहतर हो सकता है और उस तरीके से कर सकता है जो कि स्पष्ट रूप से रेगीक्स का परीक्षण करता है।

मुझे लगता है कि इसके साथ आपने स्वयं इसका उत्तर दिया। एक इकाई में Regexes सबसे अधिक संभावना एक कार्यान्वयन विवरण हैं।

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

मुझे जो उपयोगी लगता है, वह पाठ के नमूने के साथ रेगेक्स के पास एक टिप्पणी है जो इसे मेल खाना चाहिए।


" जब आप एसक्यूएल के एक टुकड़े को बदलते हैं तो आप शायद इसे चलाते हैं कुछ एसक्यूएल क्लाइंट को हाथ से देखने के लिए कि क्या यह आपको उम्मीद है कि पैदावार देता है। " लेकिन इस तरह के सवाल का दूसरे तरीके से जवाब मिलता है ... अगर मुझे ज़रूरत है या लगता है कि यह उपयोगी है। हाथ से rexxes का परीक्षण करें तो मुझे इसके लिए एक इकाई परीक्षण करना चाहिए। वास्तव में यह वही है जो इसे तय करने के लिए एक मुश्किल बात है!
लीई

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

8
अन्य सभी चीजें समान हैं, "हाथ से परीक्षण" की तुलना में स्वचालित परीक्षण होना बेहतर है।
रॉबर्ट हार्वे

1
आप स्वचालन का उपयोग करके रेगेक्स का परीक्षण क्यों नहीं करेंगे?
टोनी एनिस

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

-5

अगर आपको पूछना है, तो इसका जवाब हां में है।

मान लीजिए कि कुछ FNG साथ आता है और सोचता है कि वह आपके regex को "बेहतर" कर सकता है। अब, वह एक एफएनजी है, इसलिए स्वचालित रूप से एक बेवकूफ है। बिल्कुल उस तरह का व्यक्ति जिसे किसी भी परिस्थिति में आपके कीमती कोड को नहीं छूना चाहिए, कभी भी! लेकिन शायद वह PHB या कुछ और से संबंधित है, इसलिए ऐसा कुछ भी नहीं है जो आप कर सकते हैं।

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

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

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


3
FNG क्या है? यह मेरे लिए एक बुरा जवाब नहीं लगता है, लेकिन FNG के लिए लापता परिभाषा (इसके लिए गुग्लिन सिर्फ असंबंधित परिणाम देता है, इसलिए हो सकता है कि इस उत्तर को FNG की वजह से सिर्फ
डाउनवोट किया

1
मुझे संदेह है कि Google आपको सही जगह ले गया। ;-) ( en.wikipedia.org/wiki/FNG_syndrome )
ऑस्टिन हेस्टिंग्स

जब तक आप एक पूर्ण प्रोग्रामिंग जीनियस नहीं हैं, तब तक अधिक अनुभवी प्रोग्रामर होंगे जो इस बात पर विचार करेंगे कि आप नए आदमी को क्या पसंद करते हैं। आप अधिक विनम्र होने पर विचार करना चाह सकते हैं।
थोरबजोरन रेव एंडरसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.