2012-09-28 11 views
14

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

मैं यह कैसे कर सकता हूं? क्या Scalacheck द्वारा इस्तेमाल यादृच्छिक बीज सेट करने का कोई आधिकारिक तरीका है?

मैं परीक्षण सूट चलाने के लिए sbt का उपयोग कर रहा हूं।

बोनस सवाल: वहाँ प्रिंट आउट यादृच्छिक ScalaCheck द्वारा इस्तेमाल किया बीज के लिए एक आधिकारिक तरीका तो यह है कि आप भी एक गैर नियतात्मक परीक्षण चालन पुन: पेश कर सकते हैं है?

+0

यह बदल रहा डेटा कहां से आ रहा है? एक डीबी? एक सर्वर ? –

+0

@BrianAgnew नहीं, यह यादृच्छिक रूप से 'स्कैलाचेक' द्वारा उत्पन्न किया गया है। –

उत्तर

10

आप शुद्ध ScalaCheck गुण का उपयोग कर रहे हैं, तो आप Test.Params वर्ग का उपयोग करने के java.util.Random उदाहरण है, जिसमें प्रयोग किया जाता है बदल सकते हैं और अपने खुद के प्रदान करने के लिए जो हमेशा मूल्यों का एक ही सेट लौटने में सक्षम होना चाहिए:

def check(params: Test.Parameters, p: Prop): Test.Result

[अद्यतन]

मैं सिर्फ एक नया specs2-1.12.2-SNAPSHOT जहाँ आप अपने यादृच्छिक जनरेटर निर्दिष्ट करने के लिए निम्न सिंटैक्स का उपयोग कर सकते हैं प्रकाशित:

case class MyRandomGenerator() extends java.util.Random { 
    // implement a deterministic generator 
} 

"this is a specific property" ! prop { (a: Int, b: Int) => 
    (a + b) must_== (b + a) 
}.set(MyRandomGenerator(), minTestsOk -> 200, workers -> 3) 
+0

"शुद्ध स्कैलाचेक गुणों का उपयोग करके" आपका क्या मतलब है? क्या आपका मतलब है, वहां कोई भी चश्मा 2 सामान का उपयोग नहीं कर रहा है? –

+0

मेरा मतलब है स्कैला चेक विशिष्टता का उपयोग करना: 'ऑब्जेक्ट स्ट्रिंग स्पेसिफिकेशन गुण ("स्ट्रिंग") बढ़ाता है, जैसा कि स्कैला चेक उपयोगकर्तागूइड में दिखाया गया है: https://github.com/rickynils/scalacheck/wiki/User-Guide – Eric

1

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

यदि डेटा छोटा है, तो आप इसे लेबल या त्रुटि संदेश में शामिल कर सकते हैं जो उपयोगकर्ता को दिखाया जाता है; उदाहरण के लिए, एक XUnit शैली परीक्षा में: (के बाद से मैं स्काला वाक्य रचना के लिए नया हूँ)

testLength(String x) { 
    assert(x.length > 10, "Length OK for '" + x + "'"); 
} 

डेटा, बड़ा है, तो उदाहरण के लिए एक स्वत: जनरेट डीबी, आप या तो यह एक गैर में संग्रहीत कर सकता है अस्थिर स्थान (उदाहरण के लिए/timmpamped नाम के साथ tmp) या इसे उत्पन्न करने के लिए इस्तेमाल बीज दिखाओ।

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

आप कहते हैं कि आप इस मुद्दे को पुन: पेश करने के लिए स्काला चेक निर्धारक "अस्थायी रूप से" बनाना चाहते हैं; मैं कहता हूं कि आपको एक बग्गी एज-केस मिला है जो यूनिट टेस्ट बनने के लिए उपयुक्त है (शायद कुछ मैन्युअल सरलीकरण के बाद)।

0

scalacheck-1.12 के लिए इस विन्यास काम किया:

new Test.Parameters { 
    override val rng = new scala.util.Random(seed) 
} 

scalacheck-1.13 के लिए यह अब और काम नहीं करता है के बाद से RNG विधि निकाल दिया जाता है। कोई विचार?

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