Dưới đây là một đoạn của file .cabal
tôi sử dụng cho một trong libraries gần đây của tôi.
...
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
Như chúng ta có thể thấy tệp cabal xác định thư viện và một bộ kiểm tra. Thư viện định nghĩa các mô-đun mà nó xuất, các gói phụ thuộc vào và đặt một số tùy chọn GHC tùy chỉnh.
Chúng ta có thể dễ dàng xây dựng và đóng gói thư viện để phân phối với:
% cabal configure
% cabal build
% cabal sdist
Các TestSuite trông rất giống các thư viện: trước hết, nó có sự phụ thuộc tương tự như thư viện (xem dòng đầu tiên Build-Depends
), và sau đó thêm một số phụ thuộc kiểm tra bổ sung (xem dòng thứ hai Build-Depends
). Bài kiểm tra ở đây là sự kết hợp giữa các bài kiểm tra HUnit và QuickCheck, và nó sử dụng Test-Framework làm nhân vật. Thử nghiệm thích hợp là Test/ReferenceProps.hs
. Đây là bài kiểm tra loại exitcode-stdio
. Điều này có nghĩa rằng cabal sẽ nói rằng các bài kiểm tra vượt qua nếu ReferenceProps
thoát với mã 0. Nếu không, nó sẽ nói rằng các bài kiểm tra thất bại.
Các TestSuite trông giống như this (nhưng, ở đây, chúng ta sẽ sử dụng một số xét nghiệm đơn giản để lùi xe danh sách):
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
Các main
chỉ là một khai thác. Bạn cũng có thể đặt các tùy chọn khác nhau cho test-framework
bằng cách thay thế mempty
. Hàm testRev
là một bài kiểm tra HUnit và propListRevRevId
là một bài kiểm tra QuickCheck; xem số relevantdocs về cách viết những thứ này.
Cuối cùng, chúng ta có thể chạy các bài kiểm tra:
% cabal configure --enable-tests
% cabal test
Bạn có kiểm tra http://www.haskell.org/haskellwiki/How_to_write_a_Haskell_program? Nó có thể trả lời một số câu hỏi của bạn. –