12

Haskell は初めてで、テスト対象のプログラムを構築しようとしています。HUnit と Cabal を使用することにしました。

私が見たものから、よく構造化されたプロジェクトは次のようになります。

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

私にとって謎の部分は、TestRunner.hs と AppName.cabal です。

testsuite/tests ディレクトリとサブディレクトリの下ですべてのテストを実行するテストランナーはどのようになりますか? どうすればカバルと統合できますか?

また、ハックの依存関係を AppName.cabal に入れ、コマンド ラインからビルドするにはどうすればよいでしょうか?

テストと依存関係を使用してゼロからアプリケーションを構築する完全な例を見つけるのに苦労しています。

ありがとう

4

1 に答える 1

18

これは、最近のライブラリの 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

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

以下を使用して、配布用のライブラリを簡単にビルドおよびパッケージ化できます。

% cabal configure
% cabal build
% cabal sdist

テストスイートはライブラリによく似ています。まず、ライブラリと同じ依存関係があり (最初のBuild-Depends行を参照)、次にいくつかのテスト依存関係を追加します (2Build-Depends行目を参照)。ここでのテストスイートは、HUnit テストと QuickCheck テストを組み合わせたもので、テスト フレームワークをランナーとして使用します。適切なテストTest/ReferenceProps.hs. exitcode-stdioタイプテストです。これは、ReferencePropsコード 0 で終了する場合、cabal はテストに合格したと言うでしょう。それ以外の場合は、テストに失敗したと言うでしょう。

テストスイートは次のようになります(ただし、ここでは、リストの反転にいくつかの簡単なテストを使用します)。

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単なるハーネスです。test-frameworkに置き換えることで、 のさまざまなオプションを設定することもできますmempty。関数testRevは HUnit テストでありpropListRevRevId、QuickCheck テストです。これらの書き方については、関連する ドキュメントを参照してください。

最後に、テストを実行できます。

% cabal configure --enable-tests
% cabal test
于 2012-11-25T09:54:51.947 に答える