GTD*_*Dev 12 haskell cabal hackage test-runner hunit
我是Haskell的新手,我正在尝试构建一个受测试的程序.我决定使用HUnit和Cabal.
从我所看到的一个结构良好的项目看起来如下:
src/
AppName/
Appname.hs
testsuite/
tests/
AppName/
TestRunner.hs
AppName.cabal
Setup.hs
Run Code Online (Sandbox Code Playgroud)
对我来说神秘的部分是TestRunner.hs和AppName.cabal.
在testuite/tests目录和子目录下运行所有测试的testrunner会是什么样子?它如何与Cabal集成?
另外,如何将hackage依赖项放在AppName.cabal中并从命令行构建它们?
我很难找到一个完整的示例,从头开始构建一个带有测试和依赖项的应用程序.
谢谢
scv*_*lex 18
这是.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
Run Code Online (Sandbox Code Playgroud)
我们可以看到cabal文件定义了一个库和一个测试套件.该库定义了它导出的模块,它依赖的包,并设置了一些自定义GHC选项.
我们可以轻松地构建和打包库以进行分发:
% cabal configure
% cabal build
% cabal sdist
Run Code Online (Sandbox Code Playgroud)
testsuite看起来很像库:首先,它具有与库相同的依赖关系(参见第一Build-Depends
行),然后它添加了一些额外的测试依赖项(参见第二Build-Depends
行).这里的测试套件是HUnit和QuickCheck测试的组合,它使用Test-Framework作为跑步者.适当的测试是Test/ReferenceProps.hs
.这是一种exitcode-stdio
类型测试.这意味着如果ReferenceProps
以代码0退出,cabal会说测试通过.否则,它会说测试失败.
testsuite看起来像这样(但是,在这里,我们将使用一些简单的测试进行列表反转):
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
Run Code Online (Sandbox Code Playgroud)
这main
只是一个安全带.您还可以test-framework
通过替换来设置各种选项mempty
.该函数testRev
是一个HUnit测试,是一个QuickCheck propListRevRevId
测试; 请参阅有关 如何编写这些文档的相关文档.
最后,我们可以运行测试:
% cabal configure --enable-tests
% cabal test
Run Code Online (Sandbox Code Playgroud)