2017-04-06 7 views
6

既存のHaskellプロジェクトをStackで設定したいと思います。既存のプロジェクトでは、testディレクトリの下に複数のファイルが使用されています。これらの別々のテストファイルは、デフォルトでStack(またはcabal?)がテスト用に単一のtest/Spec.hsを使用しているようです。どのように私はこのプロジェクトで複数のファイルを使用し続けることができますか?Haskell Stackプロジェクトで複数のテストファイルを実行するには

注:私はハスケルを学んでいます。このプロジェクトは、私の「kata」アプローチからの学習に近づいています。テストは一度に言語の1つの側面に集中するように分離されています。ここで

+0

スタックのテスト(およびその他の)動作を '.cabal'ファイルで設定できます。テストセクションを探してください – Lazersmoke

+0

@Lazersmoke '.cabal'ファイルにセクションがあることは知っています。複数のテストファイルに対してこの設定を行う方法の例がありますか?私は明確な例をまだ見つけていないので、質問をしています – haiqus

答えて

9

はあなたsrc -folder内の各モジュールに対応し、通常のユニットテストといくつかのサブモジュールから分離されている統合テストをしたい、この

> 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 

のようなディレクトリ構造のセットアップです

あなた

example.cabalファイルにテストスイートを追加する必要があるすべての最初の

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

tst/unit/Spec.hsには、hspec-discoverから、...Spec.hsという形式のすべてのモジュールが検出され、これらのモジュールのそれぞれからspec関数が実行されます。 tst/integrationフォルダ

BSpec.hsCSpec.hsとあなたの Spec.hs
{-# OPTIONS_GHC -F -pgmF hspec-discover #-} 

tst/unit/Spec.hs

ちょうどこの一行

他のテストファイル

は、あなたのASpec.hsであなたのユニットテストを追加し、他の人

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 

あなたは、あなたがhspecスタイルのテストについての詳細をお知りになりたい場合は、私はそれが最善だろうと思い、https://hspec.github.ioですべての例を見つけることができます

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

ソース

を使用してテストをコンパイルして実行することができますそこから始める。スタックの場合はhttps://haskellstack.orgに行きます。そこにテスト/ベンチマークに関する情報があります。つまり、テストとベンチマークを実行することです。

Hewit、QuickCheck、Smallcheck、doctests(私が忘れてしまった場合、私の大事なお詫び - 私も定期的に使っているものです)を見てください。

関連する問題