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).
Vous pouvez configurer le comportement de test de la pile (et d'autres) dans le fichier '.cabal'. Recherchez la section de tests – Lazersmoke
@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