2010-02-14 15 views
48

के साथ आईओ क्रियाओं का परीक्षण करना क्या कोई मुझे मोनाडिक क्विक चेक का उपयोग करके आईओ कार्यों का परीक्षण करने का एक संक्षिप्त उदाहरण दे सकता है?मोनाडिक क्विक चेक

+2

आप जो परीक्षण करना चाहते हैं उसका एक उदाहरण देते हुए, सवाल बेहतर होगा। – Egon

उत्तर

55

Test.QuickCheck.Monadic मॉड्यूल आपको IO में चलने वाली चीज़ों को भी मोनाडिक कोड का परीक्षण करने देता है।

एक monadic विशेषता परीक्षण प्रकार PropertyM m a, जहां m इकाई परीक्षण में चलता है और a अंततः ध्यान नहीं दिया जाता है की है। PropertyM IO a के मामले में, आप monadicIO का उपयोग कर मोनैडिक टेस्ट को Property पर परिवर्तित करें; अन्य सभी मोनैड के लिए, आप इसके बजाय monadic का उपयोग करते हैं (जो मोनैड चलाने के लिए एक फ़ंक्शन लेता है, कुछ IO नहीं है)।

एक monadic परीक्षण में, मानदंड से return एड मान को अनदेखा किया जाता है। अभिव्यक्ति की जांच करने के लिए, assert का उपयोग करें; assert एक गलत मान में परीक्षण परीक्षण विफल हो जाएगा। परीक्षण किए गए मोनैड में कोड निष्पादित करने के लिए run का उपयोग करें।

आपके निपटान में अन्य monadic कार्रवाईएं हैं। उदाहरण के लिए, pickGen a से नए परीक्षण इनपुट उत्पन्न करेगा, और pre परीक्षण पूर्व शर्त जांच करेगा। ये उपयोगी हैं अगर परीक्षण इनपुट या पूर्व शर्त स्वयं परीक्षण किए जा रहे मानकों के माध्यम से गणना मूल्यों पर निर्भर करती हैं, इस मामले में इनपुट उत्पन्न करने या प्रीकॉन्शन की जांच करने का सामान्य तरीका काम नहीं करेगा।

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

import System.Directory (removeFile) 
import System.IO (hGetContents, hPutStr, hSeek, openBinaryTempFile, SeekMode (..)) 
import Test.QuickCheck (arbitrary, Property, quickCheck, (==>)) 
import Test.QuickCheck.Monadic (assert, monadicIO, pick, pre, run) 

-- Demonstrating pick and pre as well: 
prop_writeThenRead :: Property 
prop_writeThenRead = monadicIO $ do writtenData <- pick arbitrary 
            pre $ not (null writtenData) 
            readData <- run $ writeThenRead writtenData 
            assert $ writtenData == readData 

-- A more idiomatic way to write the above: 
prop_writeThenRead2 :: [Char] -> Property 
prop_writeThenRead2 writtenData = not (null writtenData) ==> monadicIO test 
    where test = do readData <- run $ writeThenRead writtenData 
        assert $ writtenData == readData 

writeThenRead :: [Char] -> IO [Char] 
writeThenRead output = do (path, h) <- openBinaryTempFile "/tmp" "quickcheck.tmp" 
          removeFile path 
          hPutStr h output 
          hSeek h AbsoluteSeek 0 
          hGetContents h 

main :: IO() 
main = do quickCheck prop_writeThenRead 
      quickCheck prop_writeThenRead2 
7

मोनैडिक कोड परीक्षण के लिए मानक संदर्भ "Testing Monadic Code with QuickCheck" है। यह आईओ जैसे मोनैड के संदर्भ में परीक्षण के विभिन्न तरीकों को दिखाता है।

लेकिन आपको वास्तव में एक और ठोस सवाल पोस्ट करने पर विचार करना चाहिए कि आप क्या परीक्षण करना चाहते हैं।

+0

लिंक आजकल नीचे है। –

+0

कोएन स्पष्ट रूप से अपने मुखपृष्ठ को पुनर्गठित कर रहा है। इसके बजाय निम्नलिखित यूआरएल आज़माएं: [www.cse.chalmers.se/~rjmh/Papers/QuickCheckST.ps ](http://www.cse.chalmers.se/~rjmh/Papers/QuickCheckST.ps) – svenningsson

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