Вот фрагмент файла .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
), а затем добавляет несколько дополнительных тестовых зависимостей (см. вторую строку Build-Depends
). Набор тестов здесь представляет собой комбинацию тестов HUnit и QuickCheck, и он использует Test-Framework в качестве средства запуска. Правильный тест — Test/ReferenceProps.hs
. Это тест типа exitcode-stdio
. Это означает, что клика скажет, что тесты пройдены, если ReferenceProps
выйдет с кодом 0. В противном случае она скажет, что тесты не пройдены.
Набор тестов выглядит как этот (но здесь мы собираемся использовать несколько простых тесты на обращение списка):
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
person
scvalex
schedule
25.11.2012