2012-06-30 19 views
5

में परिभाषित सीमा मामलों पर ध्यान केंद्रित करके इनपुट स्ट्रिंग को सत्यापित करने के लिए रेगेक्स से नमूना डेटा जेनरेट करना एक दिए गए रेगेक्स के लिए नमूना डेटा कैसे उत्पन्न करें। कुछ में शामिल हैं:रेगेक्स

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

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

उदाहरण के लिए, पर विचार एक regex ^([a-z]{3,6})$ तो सीमा मामलों में शामिल हैं:

  • किसी भी केवल [az] लंबाई 2 (विफलता) के बराबर
  • किसी भी केवल से मिलकर स्ट्रिंग [az] से मिलकर स्ट्रिंग लंबाई 3 (सफलता) के बराबर
  • किसी भी केवल [az] लंबाई 4 (सफलता) के बराबर से मिलकर स्ट्रिंग
  • किसी भी केवल [az] लंबाई 5 (सफलता) के बराबर
  • एक से मिलकर स्ट्रिंग ny केवल [az] लंबाई 6 (सफलता) के बराबर से मिलकर स्ट्रिंग
  • किसी भी केवल [az] लंबाई 7 (विफलता) के बराबर
  • किसी भी स्ट्रिंग [az] (विफलता) से मिलकर नहीं
  • से मिलकर स्ट्रिंग
  • किसी भी स्ट्रिंग [az] के साथ शुरू नहीं लेकिन [az] (विफलता)
  • किसी भी स्ट्रिंग [az] के साथ शुरू लेकिन साथ समाप्त नहीं [az] (विफलता)

कारण सीमा पर ध्यान केंद्रित के साथ समाप्त होता मामलों में यह है कि 6 से अधिक लंबाई वाली केवल [az] वाली कोई स्ट्रिंग रेगेक्स में परिभाषित स्ट्रिंग लम्बाई की ऊपरी सीमा को सत्यापित करती है। तो लंबाई 7, 8, 9 की एक स्ट्रिंग का परीक्षण करना वास्तव में केवल उसी (सीमा) स्थिति का परीक्षण कर रहा है।

यह अपनी सादगी के लिए चुना गया एक मनमाना रेगेक्स था, लेकिन कोई उचित रेगेक्स इनपुट के रूप में कार्य कर सकता है।

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

+0

इसका क्या मतलब है? क्या आप परीक्षण कर रहे हैं यदि आपका रेगेक्स lib सही तरीके से काम कर रहा है? या आप कुछ वैकल्पिक सत्यापन (रेगेक्स के बिना) लिख रहे हैं और मूल रेगेक्स एकमात्र कल्पना है जो मान्य है या नहीं? – Qtax

+0

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

+0

रेगेक्स का उपयोग सिस्टम की विभिन्न परतों में भी किया जा सकता है, जैसे ब्राउज़र में अनियंत्रित जावास्क्रिप्ट, डेस्कटॉप एप्लिकेशन (डब्ल्यूपीएफ), पावरशेल सीएमडीलेट्स, एएसपी.नेट एमवीसी मॉडल और डब्ल्यूसीएफ सेवाएं। कोड जनरेटर परीक्षण को उत्पन्न करता है यह सत्यापित करता है कि प्रत्येक रिमोट सिस्टम को डेटा जमा करने से पहले सत्यापन करता है। – bloudraak

उत्तर

1

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

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

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

abc123def456ghi789jkl123foo456pqr789stu123vwx456yz

:

(?<=\G\d{0,3})(?>[a-z]+)(?<=(?<foo>foo)|)(?(foo)(?!)) 

मुझे एक स्ट्रिंग के बारे में सोच के लिए कि मेल खाएंगे (और/या मैचों उत्पन्न) यह बहुत आसान है मैच होंगे:

  • "एबीसी"
  • "def"
  • "GHI"
  • "JKL"

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

एक

यह एक मैच उत्पन्न होगा, लेकिन यह एक गरीब काम करता है रेगेक्स का प्रयोग करने के लिए। \d{0,3} वास्तव में कभी भी कोशिश नहीं की गई है और \G केवल इनपुट की शुरुआत से मेल खाने के लिए उपयोग किया जाता है (अंतिम मैच के अंत के बजाय)। (?<=(?<foo>foo)) कभी परीक्षण नहीं किया गया है (और यदि यह था, तो इसका परिणाम गैर-मैच होगा)।

यह भी एक स्ट्रिंग से मेल नहीं खाता उत्पन्न करने के लिए आसान होगा:

लेकिन, फिर से, यह वास्तव में regex माध्यम से ज्ञान प्राप्त नहीं करता है।

मुझे यह साबित करने के लिए कंप्यूटर सिद्धांत अच्छी तरह से नहीं पता है, लेकिन मेरा मानना ​​है कि यह P v NP class of problems में आता है। जटिल तारों के संग्रह से मेल खाने के लिए रेगेक्स उत्पन्न करना अपेक्षाकृत आसान है, लेकिन रेगेक्स से मेल खाने के लिए जटिल तारों का संग्रह उत्पन्न करना मुश्किल है।

+0

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

+0

@WernerStrydom - ठीक है, मैं इसे स्वीकार कर सकता हूं। – JDB