2011-01-14 14 views
24

तो मैं suggested structure of a Haskell project का पालन करने की कोशिश कर रहा हूं, और मुझे अपने परीक्षणों को व्यवस्थित करने में कुछ समस्याएं आ रही हैं।हास्केल टेस्ट व्यवस्थित करना

src/Clue/Cards.hs # defines Clue.Cards module 
testsuite/tests/Clue/Cards.hs # tests Clue.Cards module 

एक के लिए, मैं नहीं यकीन है कि क्या testsuite/tests/Clue/Cards.hs में मॉड्यूल है कि परीक्षण कोड होता है नाम के लिए कर रहा हूँ, और किसी अन्य के लिए, मैं नहीं यकीन है कि कैसे करने के लिए कर रहा हूँ:

सरलता के लिए, चलो शुरू के साथ जाने अपने परीक्षण कोड संकलन इतना है कि मैं अपने स्रोत से लिंक कर सकते हैं:

% ghc -c testsuite/tests/Clue/Cards.hs -L src 
testsuite/tests/Clue/Cards.hs:5:0: 
    Failed to load interface for `Clue.Cards': 
     Use -v to see a list of the files searched for. 

उत्तर

26

मैं अपने आप को दृष्टिकोण उनके परीक्षण सूट, जो मूल रूप से करने पर निर्भर करता लिए Snap Framework द्वारा उठाए गए का उपयोग करें:

  1. एक परीक्षण ढांचे जैसे haskell-test-framework या HTF
  2. नाम का प्रयोग करें मॉड्यूल परीक्षण युक्त द्वारा मॉड्यूल-नाम IUT, जैसे युक्त .Tests जोड़कर:

    module Clue.Cards where ... -- module containing IUT 
    
    module Clue.Cards.Tests where ... -- module containing tests for IUT 
    
  3. अलग नामस्थान का उपयोग करके, आप अपने परीक्षणों को एक अलग स्रोत-फ़ोल्डर tests/ में डाल सकते हैं, फिर आप परीक्षण-सूट के लिए एक अलग कैबल बिल्ड-लक्ष्य (cabal test -build-target समर्थन देखें) में उपयोग कर सकते हैं जिसमें अतिरिक्त स्रोत फ़ोल्डर शामिल है hs-source-dirs सेटिंग, जैसे:

    Executable clue 
        hs-source-dirs: src 
        ... 
    
    Executable clue-testsuite 
        hs-source-dirs: src tests 
        ... 
    

    यह काम करता है, वहाँ अब और है, क्योंकि अपने IUT में मॉड्यूल और परीक्षण सूट के बीच कोई नाम स्थान टक्कर।

+1

+1 स्नैप-ढांचा है, जो अत्यंत इस संबंध में अच्छी तरह से आयोजित किया जाता है का उल्लेख करने के लिए। –

+0

कूल। मैं इस परियोजना का उपयोग हास्केल पारिस्थितिक तंत्र को सीखने के तरीके के रूप में कर रहा हूं (मुझे नहीं लगता कि किसी को क्ले/क्लेयूडो के नियमों के कार्यान्वयन के लिए खुजली हो रही है), और मैंने अभी तक कैबल का सामना नहीं किया है, इसलिए यह एक अच्छा किक है पतलून। मैं कैबल का उपयोग करने का तरीका समझूंगा, फिर परीक्षण के लिए चारों ओर सर्कल करें। – rampion

+1

शायद स्नैप-फ्रेमवर्क प्रोजेक्ट के बारे में भी उल्लेखनीय है: उनके पास उनके परीक्षण-सूट हडसन के साथ एकीकृत हैं, परीक्षण-परिणाम और कवरेज रिपोर्ट प्रकाशित करते हैं (देखें http://buildbot.snapframework.com/) – hvr

3

निजी तौर पर मुझे लगता है कि एक अतिरिक्त ./src/ निर्देशिका छोटे हास्केल परियोजनाओं के लिए ज्यादा मतलब नहीं है। मोटे तौर पर स्रोत है, मैंने स्रोत कोड डाउनलोड किया।

किसी भी तरह से (के साथ या स्रोत के बिना), मैं तुम्हें refactor सुझाव है और एक Clue निर्देशिका और एक Test निर्देशिका होगा:

./Clue/Cards.hs -- module Clude.Cards where ... 
./Test/Cards.hs -- module Test.Cards where ... 

यह GHCi + Test.Cards बिना किसी Clue.Cards देखने की अनुमति देता अतिरिक्त तर्क या कैबल का उपयोग करना। उस नोट पर, यदि आप अपने परीक्षण मॉड्यूल को वैकल्पिक रूप से बनाने के लिए कैबल + झंडे का उपयोग नहीं करते हैं तो आपको इसे देखना चाहिए।

एक अन्य विकल्प है, जो मैं अपनी परियोजनाओं में से कई में उपयोग करते हैं, के लिए है:

./Some/Module/Hierarchy/File.hs 
./tests/someTests.hs 

और मैं cabal install पैकेज तो tests/someTests.hs सामान चलाते हैं। मुझे लगता है कि अगर मेरे पैकेज विशेष रूप से बड़े थे और इंस्टॉल करने में काफी समय लगे तो यह परेशान होगा।

+4

मुझे लगता है कि एक अतिरिक्त 'src' निर्देशिका हमेशा समझ में आता है, क्योंकि यह उत्तीर्ण क्या वास्तव में स्रोत-कोड पदानुक्रम के भीतर निहित है: हास्केल सूत्रों! जब आपके आवेदन इस तरह के स्क्रिप्ट, config फ़ाइलें, और संभवतः अन्य गैर हास्केल स्रोतों के रूप में यह में के बारे में झूठ बोल रही है, अन्य बातों के, है यह विशेष रूप से उपयोगी है। – fatuhoku

3

यहाँ एक और तरीका है:

प्रत्येक मॉड्यूल के इकाई परीक्षण एक hunit TestList at the end of the module के रूप में, कुछ लगातार नामकरण योजना के साथ, इस तरह के "tests_Path_To_Module" के रूप में परिभाषित कर रहे हैं। मुझे लगता है कि यह मुझे परीक्षण लिखने में मदद करता है, क्योंकि मुझे स्रोत पेड़ में कहीं और मॉड्यूल की खोज करने की ज़रूरत नहीं है, न ही सिंक में दो समांतर फ़ाइल पदानुक्रमों को रखें।

एक मॉड्यूल की परीक्षण सूची में किसी उप-मॉड्यूल के परीक्षण भी शामिल हैं।Hunit के runTestTT धावक एक test command के माध्यम से एप्लिकेशन करने के लिए बनाया है, और सुलभ है। इसका मतलब है कि कोई उपयोगकर्ता विशेष सेटअप के बिना किसी भी समय परीक्षण चला सकता है। या यदि आप उत्पादन अनुप्रयोग में परीक्षण शिपिंग पसंद नहीं है, उन्हें शामिल करने के लिए देव बनाता है, या एक अलग परीक्षण धावक निष्पादन में केवल में सीपीपी और कबाल झंडे का उपयोग करें।

भी कार्यात्मक परीक्षण, tests/ निर्देशिका में से एक या एक फ़ाइल प्रति अधिक, shelltestrunner साथ चलाने के लिए, और कुछ देव-प्रक्रिया से संबंधित Makefile में आधारित परीक्षण कर रहे हैं।

+3

मैं अपने कार्यान्वयन मॉड्यूल में परीक्षण डालने की सलाह नहीं देते। आप परीक्षण ढांचे पर निर्भरता के बिना अपने उत्पादन मॉड्यूल संकलित करने में सक्षम होना चाहिए। (_xUnit Patterns_ इस गंध को "उत्पादन में टेस्ट निर्भरता" कहते हैं)। उन्हें निकालने के लिए सीपीपी झंडे का उपयोग करना एक वास्तविक समाधान नहीं है। किसी भी मामले में, यह एकल जिम्मेदारी सिद्धांत तोड़ता है। –

1

पूर्णता के लिए, इसके लायक छोटी परियोजना के लिए एक बहुत ही आसान दृष्टिकोण ghci -i के माध्यम से उल्लेख। उदाहरण के लिए, आपके मामले में,

>ghci -isrc:testsuite 
ghci>:l Clue.Cards 
ghci>:l tests.Clue.Cards 
संबंधित मुद्दे