2009-02-23 20 views
36

Quickcheck और इसके संस्करणों में भी क्विक चेक का उपयोग किया है (यहां तक ​​कि Java में भी एक है), दिलचस्प लगता है। हालांकि, अकादमिक हित के अलावा, क्या यह वास्तविक अनुप्रयोग परीक्षण में वास्तव में उपयोगी है (जैसे एक जीयूआई एप्लिकेशन या क्लाइंट/सर्वर या यहां तक ​​कि स्टैक ओवरफ्लो भी लेते हैं)? आपके पास समान परीक्षण जनरेटर के साथ किए गए किसी भी अनुभव की सराहना की जाती है।क्या आपने वास्तविक प्रोजेक्ट

उत्तर

48

हाँ, ठीक है। असल में नहीं, लेकिन मैंने उस व्यक्ति के तहत अध्ययन किया है जिसने मूल रूप से क्विक चेक विकसित किया था और वह वास्तव में एक दिलचस्प व्यक्ति है।

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

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

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

1,2,3,4 // original 
1,2 3,4 // split into A and B 
2,1 4,3 // reverse A and B 
4,3,2,1 // concat B and A 

यह एक शानदार संपत्ति QuickCheck साथ परीक्षण करने के लिए कहा जाता है विनिर्देश है और परिणाम काफी आश्चर्यजनक है।

Pex अच्छा है, लेकिन क्विक चेक के रूप में उतना अच्छा नहीं है, Pex चीजों को सरल बनाता है, क्विक चेक करता है लेकिन यह एक अच्छा विनिर्देश लिखने के लिए बहुत प्रयास करता है।

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

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

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

+2

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

+1

ओह हाँ यकीन है कि आपके फ़ंक्शन के साइड इफेक्ट्स वास्तव में एक समस्या नहीं है। यह प्रति समस्याग्रस्त है लेकिन यह आपको क्विक चेक का उपयोग करने से नहीं रोकता है। एरिकिसियन टेस्ट सूट के साइड इफेक्ट्स थे और इस तरह आप इसके आसपास जा सकते हैं। –

+1

इसमें सावधानी बरतने और राज्य की प्रगति के बारे में सोचने में शामिल है। लेकिन बुनियादी सिद्धांत लागू होते हैं। कमी का हिस्सा ट्रिकियर है लेकिन यह मूल रूप से काम का अनुमान लगाता है। जब तक दुर्घटना हो रही है तब तक खराब इनपुट लें और इनपुट हटा दें। यह शुद्ध कार्यों तक ही सीमित नहीं है। –

7

मैं व्यक्तिगत सामान की एक बहुत कुछ के लिए QuickCheck का उपयोग करें:

हालांकि, यहां मेरी व्यक्तिगत अनुभव से कम तुच्छ सा है। पिछले छह महीनों के भीतर:

  • QuickCheck Ran रंग परिवर्तन का परीक्षण करने और असतत कोज्या एक छवि कंप्रेसर में बदल देती है।

  • रैन क्विक चेक एक प्रतीकात्मक-भिन्नता मॉड्यूल का परीक्षण करने के लिए मैंने कुछ संख्यात्मक अनुकूलन के लिए चाबुक किया।

  • रण क्विक चेक बेंटले और सेडगेविक की शैली में एक टर्नरी-सर्च पेड़ का परीक्षण करने के लिए।

QuickCheck शायद ही कभी सभी मेरी इकाई परीक्षण जरूरतों को पूरा करती है, लेकिन यह एक शानदार तरीका शुरू करने के लिए --- और QuickCheck कानूनों अच्छा प्रलेखन बनाते हैं।

+0

जाहिर है क्विक चेक आईओ मोनैड में कोड कोड के लिए एक अच्छा फिट नहीं है, लेकिन क्या आपको लगता है कि क्विक चेक सभी शुद्ध कोड का परीक्षण करने के लिए एक अच्छा फिट है? यदि नहीं, तो यह एक अच्छा फिट कहाँ नहीं है? –

5

ScalaCheck (स्कैला के लिए एक त्वरित जांच) Functional Java का परीक्षण करने के लिए प्रयोग किया जाता है, एक पुस्तकालय जो अन्य चीजों के साथ a QuickCheck for Java लागू करता है।

8

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

मैंने अपने Ranged Sets और Decimal पुस्तकालयों में गुणों को दस्तावेज़ और सत्यापित करने के लिए क्विक चेक का भी उपयोग किया है।

मेरे अनुभव में क्विक चेक कभी-कभी महान होता है। यदि आप किसी महत्वपूर्ण संपत्ति को संक्षेप में सारांशित कर सकते हैं, हालांकि उस संपत्ति को वितरित करने वाले एल्गोरिदम बालों वाले हैं, तो क्विक चेक एक बड़ी जीत है। दूसरी ओर मुझे अक्सर पता चलता है कि एल्गोरिदम उस संपत्ति के समतुल्य है जिसे मैं सत्यापित करना चाहता हूं। उस मामले में मैं सरल गुणों की तलाश करता हूं। उदाहरण के लिए, मान लें कि फ़ंक्शन "foo" को सख्ती से monotonic माना जाता है। फिर आप

prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y) 
2

मैंने छोटे सहायक उपकरण के विकास के लिए केवल उत्पादन वातावरण में हास्केल का उपयोग किया है। मुख्य रूप से क्योंकि मैं एकमात्र डेवलपर हूं, मुझे पता है कि हास्केल पढ़ता है। हालांकि मैंने क्विक चेक का व्यापक रूप से उपयोग किया, और वास्तव में नाराज हो गया कि कुछ ऐसा ही सी # में उपलब्ध नहीं है। इसलिए मैंने कोशिश करने का प्रयास किया और write it myself। मैंने पेक्स को भी देखा, लेकिन प्रोग्राम एक्सप्लोरेशन टेक्नोलॉजीज का उपयोग किया गया जो कि क्विक चेक के तरीके से कम से कम इनपुट कम दिलचस्प खोजने के लिए उपयोग किया जाता है।

2

मैं उपयोग QuickCheck किसी भी भाषा में लिखे गए कमांड लाइन कार्यक्रमों के व्यवहार का परीक्षण करने के साथ बड़े पैमाने पर परीक्षण किया जाता है।

यह विशेष रूप से उन इनपुट को खोजने में उपयोगी होता है जिन पर निम्न स्तर या गतिशील रूप से टाइप किए गए प्रोग्राम क्रैश होते हैं।

सुविधा के लिए, मैंने http://hackage.haskell.org/package/proctest लिखा, जिसमें क्विकचैक के कुछ उदाहरण एचएसपीसी और हनीट के साथ कमांड लाइन प्रोग्रामों का परीक्षण करने के लिए एक साथ उपयोग किए जा रहे हैं।

1

हम FsCheck का उपयोग यह जांचने के लिए करते हैं कि हमारे ओकैम से एफ # अनुवाद सही हैं, और हमारे अनुकूलित संस्करण अन-अनुकूलित संस्करणों के समान काम करते हैं। मैं लेजर और पार्सर का परीक्षण करने के लिए इसका उपयोग करने की भी योजना बना रहा हूं क्योंकि NHol प्रोजेक्ट parser संयोजक का उपयोग करता है।

हमारे पास सहायक कार्य भी हैं जो हमें NUnit (.NET के लिए XUnit) के भीतर परीक्षण चलाने की अनुमति देते हैं। assertProp देखें।

0

मैंने एलजी लिनक्स मोबाइल प्लेटफ़ॉर्म में एसएमएस पीडीयू एन्कोडर और डिकोडर का परीक्षण करने के लिए क्विक चेक का उपयोग किया है। उस समय विकसित सॉफ्टवेयर के एक टुकड़े का एक (पुराना) संस्करण http://hackage.haskell.org/package/GenSmsPdu-0.1

0

पर यह डाउनलोड करने के लिए उपलब्ध है, यह मेरी परियोजना नहीं है, लेकिन containers पैकेज क्विक चेक काफी व्यापक रूप से उपयोग करता है। निजी तौर पर, मैंने इसे इस्तेमाल करने की कोशिश की, एक मूर्ख छोटी सी चीज की तुलना में मैंने arithmoi में लिखा था, जिसने मुझे arithmoi कभी-कभी segfaults में से एक को खोजने के लिए प्रेरित किया।

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

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