2012-11-25 9 views
11

私はHaskellを初めて使い、テスト中のプログラムを構造化しようとしています。私はHUnitとCabalを使うことに決めました。私はよくstrucutredプロジェクトは、以下のように見える見てきたものから、テストで完全なHaskellスタックを作成する

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

私には謎な部品はTestRunner.hsとAppName.cabalです。

testsuun/testsディレクトリとサブディレクトリ下のすべてのテストを実行するテストランナーはどのように見えますか?そしてそれはCabalとどのように統合できますか?

さらに、AppName.cabalにどのようにハッキングの依存関係を置き、コマンドラインからそれらをビルドしますか?

私は、テストと依存関係を持つアプリケーションを最初から構築するのに苦労しています。

おかげ

+0

チェックアウトしましたか?あなたの質問のいくつかに答えるかもしれません。 –

答えて

18

は、ここで私は私の最近のlibrariesの1のために使用さ.cabalファイルのフラグメントです。

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

キャブファイルには、ライブラリとテストスイートが定義されています。ライブラリは、エクスポートするモジュール、依存するパッケージ、およびいくつかのカスタムGHCオプションを設定します。

我々は簡単に配布するためのライブラリを構築し、パッケージ化することができます:テストスイートは、ライブラリーのようにたくさん見える

% cabal configure 
% cabal build 
% cabal sdist 

:最初のオフ、それは最初Build-Dependsの行を参照してください(ライブラリとして同じ依存関係を持っています)、追加のテスト依存関係をいくつか追加します(2番目のBuild-Depends行参照)。ここでのテストスイートは、HUnitテストとQuickCheckテストの組み合わせであり、Test-Frameworkをランナーとして使用します。 試験は、Test/ReferenceProps.hsです。それはexitcode-stdioタイプのテストです。これは、ReferencePropsがコード0で終了した場合、キャバルはテストに合格すると言います。そうでない場合は、テストが失敗したと言います。

テストスイートはthisのように見える(しかし、ここでは、我々はリストの反転のためのいくつかの簡単なテストを使用するつもりだ):

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はただのハーネスです。 memptyの代わりにtest-frameworkのさまざまなオプションを設定することもできます。関数testRevはHUnitテストであり、propListRevRevIdはQuickCheckテストです。これらの書き込み方法については、relevantdocsを参照してください。

最後に、我々はテストを実行することができます:あなたはhttp://www.haskell.org/haskellwiki/How_to_write_a_Haskell_programを

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

ありがとうございましたこれは多くの私の質問に答え、私はあなたがgithubにリンクした方法が好きです。さらにもう1つ、Test /のサブディレクトリでどのようにテストを実行しますか? 1つのファイルにすべてのテストを入れたくないのですが、テストファイルを作成すると、テストはテストランナーで自動的に実行されます。 – GTDev

+0

私は考えることができる2つの方法があります:1)もっと多くの 'Test-Suite'セクションをカバールファイルに追加してください(これは素早く迷惑になりますが、テストスイートがわずかな場合はおそらく最も簡単な解決策です)。 2)あなたのテストを複数のファイルに分割し、各ファイルのテストのリストをエクスポートしてから、単一のランナーを使用してテストのリストを連結して実行します。 – scvalex

関連する問題