2012-11-25 26 views
11

Haskell’de yeniyim ve bir programı test altında yapıyorum. HUnit ve Cabal kullanmaya karar verdim. TestRunner.hs ve AppName.cabal bende gizli olan vardırTestlerle Tam Haskell Yığını Yaratma

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

parça: Ben iyi strucutred proje gördüğümüz kadarıyla

aşağıdaki görünüyor.

Test-test/test dizini ve alt dizinler altındaki tüm testleri çalıştıran bir testçinin neye benzemesi gerekir? Cabal ile nasıl entegre edilebilir?

Ayrıca, hackage bağımlılıkları AppName.cabal içine nasıl koyar ve bunları komut satırından nasıl oluşturur?

Tam bir örnek oluşturma işlemini bir testten ve bağımlılıktan sıfırdan buluyorum.

Teşekkür

+0

sen http://www.haskell.org/haskellwiki/How_to_write_a_Haskell_program kontrol ettin:

Son olarak, testler uygulayabilirim? Bazı sorularınızı cevaplayabilir. –

cevap

18

İşte benim son libraries biri için kullanılan .cabal dosyasının bir parçası. Biz Cabal dosyayı Görüldüğü gibi

... 
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 

bir kütüphane ve testsuite tanımlar. Kütüphane, ihraç ettiği modülleri, bağlı olduğu paketleri tanımlar ve bazı özel GHC seçeneklerini belirler.

Biz kolayca oluşturup ile dağıtım için kütüphane paketleyebilirsiniz:

% cabal configure 
% cabal build 
% cabal sdist 

testsuite kütüphanesinde çok benziyor: ilk olarak, o kütüphaneye aynı bağımlılıkları (ilk Build-Depends çizgiyi görüyor vardır) ve daha sonra bazı ek test bağımlılıkları ekler (ikinci Build-Depends hattına bakın). Testsuit, HUnit ve QuickCheck testlerinin birleşimidir ve koşucu olarak Test-Framework kullanır. Uygun test numarası Test/ReferenceProps.hs. exitcode-stdio tip testi. Bu, kablonun ReferenceProps kod 0'dan çıkması durumunda testlerin geçeceğini söyler. Aksi takdirde, testler başarısız olur.

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 sadece koşum geçerli:

testsuite (biz liste İptallerde bazı basit testler kullanacağız, burada, ama) this benziyor. mempty'u değiştirerek test-framework için çeşitli seçenekler ayarlayabilirsiniz. testRev işlevi bir HUnit sınamasıdır ve propListRevRevId bir QuickCheck sınamasıdır; Bunların nasıl yazılacağı ile ilgili relevantdocs'a bakın.

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

Çok teşekkürler bu sorularımın çoğunu cevaplıyor ve ben bir github'a nasıl bağlandığınızı beğendim. Sadece bir şey daha, Test/alt dizinlerinde nasıl test yaparsınız? Tüm testlerimi bir dosyaya koymak istemiyorum ve test dosyası oluşturduğumda testlerin otomatik olarak testrunner'da çalıştırılması harika olurdu. – GTDev

+0

Düşünebildiğim iki yol var: 1) cabal dosyasına daha fazla 'Test-Suite' bölümü ekleyin (bu hızlı bir şekilde sinir bozucu olacaktır, ancak muhtemelen birkaç test takımınız varsa en basit çözümdür), ya da 2) testlerinizi birden fazla dosyaya bölün, her dosyadaki test listelerini verin, daha sonra test listelerini birleştirmek ve çalıştırmak için tek bir koşucu kullanın. – scvalex