2012-11-25 11 views
11

मैं हास्केल के लिए नया हूं और मैं परीक्षण के तहत एक प्रोग्राम तैयार करने की कोशिश कर रहा हूं। मैंने हनीट और कैबल का उपयोग करने का फैसला किया है।टेस्ट के साथ एक पूर्ण हास्केल स्टैक बनाना

src/ 
    AppName/ 
    Appname.hs 
testsuite/ 
    tests/ 
    AppName/ 
    TestRunner.hs 
AppName.cabal 
Setup.hs 

भागों है कि मेरे पास एक रहस्य हैं TestRunner.hs और AppName.cabal हैं:

मैं एक अच्छी तरह से strucutred परियोजना क्या देखा है से निम्नलिखित लग रहा है।

एक परीक्षक क्या दिखता है जो परीक्षण/परीक्षण निर्देशिका और उप निर्देशिकाओं के तहत सभी परीक्षण चलाता है? और इसे कैबल के साथ कैसे एकीकृत किया जा सकता है?

इसके अलावा, आप AppName.cabal में हैकेज निर्भरताओं को कैसे डालते हैं और उन्हें कमांड लाइन से बनाते हैं?

मुझे परीक्षण और निर्भरताओं के साथ खरोंच से एक आवेदन बनाने के लिए एक पूर्ण उदाहरण खोजने में कठिनाई हो रही है।

धन्यवाद

+0

आप http://www.haskell.org/haskellwiki/How_to_write_a_Haskell_program की जाँच कर दी:

अंत में, हम परीक्षण चला सकते हैं? यह आपके कुछ सवालों का जवाब दे सकता है। –

उत्तर

18

यहाँ .cabal फ़ाइल मैं अपने हाल के libraries में से एक के लिए इस्तेमाल किया का एक टुकड़ा है।

... 
Library 
    Build-depends:  base >= 4 && < 5, bytestring, directory, filepath, hslogger, 
         SHA, zlib 
    Ghc-options:   -Wall 
    Exposed-modules:  Ltc.Store 

Test-suite reference 
    Hs-Source-Dirs:  Test, . 
    Main-Is:    ReferenceProps.hs 
    Type:     exitcode-stdio-1.0 

    Build-Depends:  base >= 4 && < 5, bytestring, directory, filepath, hslogger, 
         SHA, zlib 
    Ghc-Options:   -Wall 

    Build-Depends:  test-framework, test-framework-hunit, test-framework-quickcheck2, 
         HUnit, QuickCheck 

जैसा कि हम देख सकते हैं कि कैबल फ़ाइल लाइब्रेरी और टेस्टाइट को परिभाषित करती है। लाइब्रेरी इसे निर्यात किए गए मॉड्यूल को परिभाषित करती है, जिस पैकेज पर निर्भर करता है, और कुछ कस्टम जीएचसी विकल्प सेट करता है।

हम आसानी से बनाने और साथ वितरण के लिए पुस्तकालय पैकेज कर सकते हैं: सबसे पहले, यह पुस्तकालय के रूप में ही निर्भरता (प्रथम Build-Depends लाइन देखना है:

% cabal configure 
% cabal build 
% cabal sdist 

testsuite पुस्तकालय की तरह एक बहुत लग रहा है), और फिर यह कुछ अतिरिक्त परीक्षण निर्भरताओं को जोड़ता है (दूसरी Build-Depends लाइन देखें)। यहां परीक्षण परीक्षण हनीट और क्विक चेक परीक्षणों का संयोजन है, और यह धावक के रूप में Test-Framework का उपयोग करता है। परीक्षण उचित Test/ReferenceProps.hs है। यह exitcode-stdio प्रकार का परीक्षण है। इसका मतलब है कि कैबल कहेंगे कि परीक्षण ReferenceProps कोड 0 के साथ निकलते हैं। अन्यथा, यह कहेंगे कि परीक्षण विफल हो गए हैं।

testsuite this तरह लग रहा है (लेकिन, यहाँ, हम सूची बदलाव के लिए कुछ सरल परीक्षण का उपयोग करने के लिए जा रहे हैं):

import Data.Monoid 
import Test.Framework 
import Test.Framework.Providers.HUnit 
import Test.Framework.Providers.QuickCheck2 
import Test.HUnit 
import Test.QuickCheck 

main :: IO() 
main = defaultMainWithOpts 
     [ testCase "rev" testRev 
     , testProperty "listRevRevId" propListRevRevId 
     ] mempty 

testRev :: Assertion 
testRev = reverse [1, 2, 3] @?= [3, 2, 1] 

propListRevRevId :: [Int] -> Property 
propListRevRevId xs = not (null xs) ==> reverse (reverse xs) == xs 

main सिर्फ एक दोहन है। आप mempty को बदलकर test-framework के लिए विभिन्न विकल्प भी सेट कर सकते हैं। फ़ंक्शन testRev एक हनीट परीक्षण है, और propListRevRevId एक क्विक चेक परीक्षण है; इन्हें लिखने के तरीके पर relevantdocs देखें।

% cabal configure --enable-tests 
% cabal test 
+0

धन्यवाद, यह मेरे ज्यादातर प्रश्नों का उत्तर देता है और मुझे लगता है कि आप कैसे एक जिथब से जुड़े हुए हैं। बस एक और बात, आप परीक्षण/उप-निर्देशिकाओं में परीक्षण कैसे चलाएंगे? मैं अपने सभी परीक्षणों को एक फ़ाइल में नहीं रखना चाहता हूं और यह बहुत अच्छा होगा अगर मैं एक परीक्षण फ़ाइल बनाता हूं तो परीक्षण स्वचालित रूप से testrunner में चलाए जाते हैं। – GTDev

+0

दो तरीकों से मैं सोच सकता हूं: 1) कैबल फ़ाइल में अधिक 'टेस्ट-सूट' अनुभाग जोड़ें (यह जल्दी से परेशान हो रहा है, लेकिन यदि आपके पास केवल कुछ परीक्षण सूट हैं तो यह शायद सबसे आसान समाधान है), या 2) अपने परीक्षणों को कई फाइलों में विभाजित करें, प्रत्येक फ़ाइल में परीक्षणों की सूचियां निर्यात करें, फिर परीक्षणों की सूचियों को 'कंसट' करने के लिए एक रनर का उपयोग करें और उन्हें चलाएं। – scvalex

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