2017-04-06 7 views
6

Je souhaite configurer un projet Haskell existant avec Stack. Le projet existant utilise plusieurs fichiers sous un répertoire test; ces fichiers de test distincts par défaut, Stack (ou cabal?) semble utiliser un seul test/Spec.hs pour les tests. Comment puis-je continuer à utiliser plusieurs fichiers avec ce projet?Comment exécuter plusieurs fichiers de test avec le projet Haskell Stack

NOTE: J'apprends Haskell, et ce projet approche mon apprentissage d'une approche «kata». Ainsi, les tests sont isoler pour se concentrer sur un aspect de la langue à la fois.

+0

Vous pouvez configurer le comportement de test de la pile (et d'autres) dans le fichier '.cabal'. Recherchez la section de tests – Lazersmoke

+0

@Lazersmoke Je sais qu'il y a une section dans le fichier '.cabal'. Avez-vous un exemple sur la façon de faire cette configuration pour plusieurs fichiers de test? Je n'ai pas encore trouvé d'exemple clair, d'où la question posée – haiqus

Répondre

9

Voici une configuration pour une structure de répertoire comme celui-ci

> tree                      
. 
├── example.cabal 
├── app 
│   └── Main.hs 
├── ChangeLog.md 
├── LICENSE 
├── Setup.hs 
├── src 
│   ├── A 
│   │   └── C.hs 
│   ├── A.hs 
│   └── B.hs 
├── stack.yaml 
└── tst 
    ├── integration 
    │   └── Spec.hs 
    └── unit 
     ├── A 
     │   └── CSpec.hs 
     ├── ASpec.hs 
     ├── BSpec.hs 
     └── Spec.hs 

vous voulez avoir des tests d'intégration qui sont séparés des tests usuels unitaires et plusieurs sous-modules correspondant à chaque module dans votre src -folder

d'abord tout ce que vous devez ajouter les suites de test à votre

example.cabal fichier

name:    example 
... 
-- copyright: 
-- category: 
build-type:   Simple 
extra-source-files: ChangeLog.md 
cabal-version:  >=1.10 

executable testmain 
    main-is:  Main.hs 
    hs-source-dirs: app 
    build-depends: base 
       , example 

library 
    exposed-modules:  A.C,A,B 
    -- other-modules: 
    -- other-extensions: 
    build-depends:  base >=4.9 && <4.10 
    hs-source-dirs:  src 
    default-language: Haskell2010 

test-suite unit-tests 
    type:   exitcode-stdio-1.0 
    main-is:  Spec.hs 
    hs-source-dirs: tst/unit 
    build-depends: base 
       , example 
       , hspec 
       , hspec-discover 
       , ... 

test-suite integration-tests 
    type:   exitcode-stdio-1.0 
    main-is:  Spec.hs 
    hs-source-dirs: tst/integration 
    build-depends: base 
       , example 
       , hspec 
       , ... 

mettre ce qui suit dans votre tst/unit/Spec.hs est de hspec-discover et il découvre (d'où le nom) tous les modules de la forme ...Spec.hs et exécute la fonction spec de chacun de ces modules.

tst/unit/Spec.hs

{-# OPTIONS_GHC -F -pgmF hspec-discover #-} 

juste cette ligne unique

Autres fichiers de test

puis ajoutez vos tests unitaires dans votre ASpec.hs, et d'autres dans BSpec.hs, CSpec.hs et votre Spec.hs dans le dossier tst/integration

module ASpec where 

import Test.Hspec 
import A 

spec :: Spec 
spec = do 
    describe "Prelude.head" $ do 
    it "returns the first element of a list" $ do 
     head [23 ..] `shouldBe` (23 :: Int) 

    it "returns the first element of an *arbitrary* list" $ 
     property $ \x xs -> head (x:xs) == (x :: Int) 

    it "throws an exception if used with an empty list" $ do 
     evaluate (head []) `shouldThrow` anyException 

vous pouvez compiler et exécuter vos tests avec

$> stack test 
# now all your tests are executed 
$> stack test :unit-tests 
# now only the unit tests run 
$> stack test :integration-tests 
# now only the integration tests run 

Sources

Vous pouvez trouver tous les exemples à https://hspec.github.io, si vous voulez en savoir plus sur les tests hspec style je pense que ce serait mieux pour commencer là. Pour la pile - allez à https://haskellstack.org - il y a quelques informations sur le test/benchmarking là - je veux dire sur l'exécution des tests et des tests de performance. Pour un style de test différent en haskell, voir HUnit, QuickCheck, Smallcheck, doctests (Si j'en ai oublié une, mes plus sincères excuses, ce sont celles que j'utilise régulièrement).