2012-01-09 17 views
31

मैं कुछ नेस्टेड सूची में QuickCheck को चलाने के लिए कोशिश कर रहा हूँ, कुछ है कि इस तरह दिखता है:क्विक चेक से मुझे अच्छे (छोटे) सिंक कैसे मिलते हैं?

type Constraint = Text 
data Value = Value [Constraint] 
data Literal = Literal Value [Value] 
type Formula = [Literal] 

तो एक सूत्र शाब्दिक, जिनमें से प्रत्येक एक विधेय और कुछ तर्क होता है की एक सूची है; भविष्यवाणी/तर्क वे मान होते हैं जो प्रत्येक स्ट्रिंग फॉर्म में बाधाओं का संयोजन होते हैं। यह हमें सूचियों की सूचियों की सूची की सूची देता है, पुhew!

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

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

आप QuickCheck विफलताओं को समझने के लिए जब आप इस तरह डेटा नेस्ट है की संभावनाओं को कैसे बेहतर बना सकता हूँ?

+1

कुछ बातें मैं कोशिश की है: shrinkList हटना shrinkList shrinkNothing पसंद करते हैं, और इस [विकल्प shrinkList] (https://gist.github.com/1582767) जो अधिक तत्वों को हटाने के पक्ष में करने की कोशिश करता। मुझे संदेह है कि मैं बहुत ज्यादा मजाक कर रहा हूं और कुछ अलग तरीके से कर रहा हूं, जैसे कि मेरे मनमानी कार्यान्वयन को बदलना, या एक अलग तरीके से परीक्षण करना :-) – kowey

+0

अभी के लिए, मैं पूर्व-संक्रमित मार्ग ('5 <$> ले रहा हूं) मनमानी'), जो कि मुझे अभी भी – kowey

+1

के साथ बग मिल रहा है, वास्तव में कोई जवाब नहीं है, लेकिन क्या आपने क्विक चेक के बजाय स्मॉल चेक या यहां तक ​​कि LazySmallCheck का उपयोग करने का प्रयास किया है? –

उत्तर

1

मैं एक ऐसी ही समस्या थी, लेकिन मैं सी उपयोग कर रहा था और :) मैं धीमी गति से और सही, और तेजी से और गलत ढंग से कार्यान्वित किया था घर उदाहरण जनरेटर बनाया है।

यादृच्छिक उदाहरणों का उपयोग करते समय, जब आपको गलत उदाहरण मिलता है, तो मैं उदाहरण की सिकुड़ने का सुझाव दूंगा। (यह, ज़ाहिर है, प्रोग्राम द्वारा किया जा सकता है, कंप्यूटर द्वारा किया जा सकता है)

यदि आपने इस परीक्षण के लिए भविष्यवाणी की है, और आपके पास ऐसा उदाहरण है जो काम नहीं करता है, तो ऑर्डर फॉर्म सूचियों को सभी ऑर्डर के समाप्त करने का प्रयास करें (यह कॉलिंग की परिमाण के रैखिक क्रम होना चाहिए) और प्रत्येक प्रयास के लिए यदि यह परीक्षण विफल रहता है।

यदि यह अभी भी असफल रहा है, तो उदाहरण में इसे रखने के लिए कोई कारण नहीं है।

यदि यह गुजरना शुरू हो जाता है, तो यह तत्व कम उदाहरण में रहना चाहिए।

(इस लालची और इष्टतम नहीं है, लेकिन यह घातीय समय के बजाय पाली में निष्पादित करता है, और यह मेरे लिए काम किया)

अधिक वैज्ञानिक देखने के लिए, मैं अध्याय का सुझाव पुस्तक "WHY PROGRAMS FAIL: A Guide to Systematic Debugging" से "समस्याओं को सरल बनाना" एज़ेलर द्वारा।

नोट: यह ज्यादातर है क्या छोटा है ...

3

Fwiw, https://github.com/leepike/SmartCheck पर एक नज़र है, जो बेहतर सिकुड़ती प्राप्त करने के लिए एक से आमतौर पर मैन्युअल रूप से कर सकते हैं का दावा है की है।

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