2012-10-14 13 views
9

मैं एक समारोह है कि किसी क्रमित उत्पादन में दो क्रमबद्ध आदानों विलीन हो जाती है के लिए एक QuickCheck संपत्ति लिखा था। इसे भी लिखा जा सकता है:सशर्त QuickCheck गुण

prop_merge xs ys = not(sorted xs && sorted ys) || (sorted (merge xs ys)) 

लेकिन मुझे वास्तव में संस्करण पसंद नहीं है। क्या QuickCheck में "सशर्त गुण" के लिए एक अच्छा सिंटैक्स है?

उत्तर

27

आप अपने गुणों के एक बूलियन हालत संलग्न करने के लिए ==> ऑपरेटर का उपयोग कर सकते हैं:

prop_merge xs ys = (sorted xs && sorted ys) ==> sorted (merge xs ys) 

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

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

> quickCheck (prop_merge :: [Int] -> [Int] -> Property) 
*** Gave up! Passed only 15 tests. 

(बजाय ==> का उपयोग कर, QuickCheck परीक्षण के बारे में सभी को बढ़ावा देंगे के मानक बूलियन ऑपरेटरों के साथ कि नोट पारित किया जा रहा है, जब उनमें से अधिकतर असफल पूर्व शर्त के कारण बेकार थे)

इस कारण से, आमतौर पर केवल आवश्यक परीक्षण मामलों को उत्पन्न करना बेहतर होता है। सरल मामलों के लिए, Test.QuickCheck.Modifiers मॉड्यूल में कई उपयोगी नई विशेषताएं हैं जो इनपुट उत्पन्न होने के तरीके को संशोधित करती हैं। उदाहरण के लिए, OrderedList संशोधक केवल उत्पन्न होगा अनुसार क्रमबद्ध सूचियों, तो हम के रूप में बस अपनी संपत्ति लिख सकते हैं: काफी बेहतर

prop_merge (Ordered xs) (Ordered ys) = sorted (merge xs ys) 
+0

आह, कि लग रहा है! – fredoverflow

+2

मुझे लगता है कि यह स्पष्ट रूप से ध्यान देने योग्य होगा कि '==>' न केवल एक अच्छा सिंटैक्स है, बल्कि टेस्ट मामलों के बीच क्विक चेक को अंतर करने की अनुमति देता है जहां परीक्षण सफल था और परीक्षण के मामले जो पूर्व शर्त को पूरा नहीं करते थे। बाद के मामले में, परीक्षण की गणना नहीं की जाती है और क्विक चेक नए इनपुट उत्पन्न करता है। यह आपको क्विक चेक को "*** गव अप करने के लिए सक्षम बनाता है! केवल 15 परीक्षण पास किए गए।" संदेश। "यदि मानक बुलियन ऑपरेटर के माध्यम से पूर्व शर्त व्यक्त की जाती है, तो क्विक चेक पारित होने वाले सभी परीक्षणों को बढ़ावा देगा, जब उनमें से अधिकतर असफल पूर्व शर्त के कारण बेकार थे। –

+0

@cebewee: आपके सुझावों के लिए धन्यवाद। मैंने उन्हें संपादित किया है मैन्युअल रूप से वे समीक्षाकर्ताओं द्वारा खारिज कर दिए गए थे। – hammar

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