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