我刚开始一个新的Haskell项目,希望从一开始就建立一个良好的测试工作流程。 Haskell似乎拥有许多优秀且独特的测试工具和许多不同的方法来整合它们。Haskell测试工作流程
我已经调查:
这似乎都在他们的领域工作得很好,但我正在寻找一种全面的测试方法,并且想知道哪些方面对其他人有效。
我刚开始一个新的Haskell项目,希望从一开始就建立一个良好的测试工作流程。 Haskell似乎拥有许多优秀且独特的测试工具和许多不同的方法来整合它们。Haskell测试工作流程
我已经调查:
这似乎都在他们的领域工作得很好,但我正在寻找一种全面的测试方法,并且想知道哪些方面对其他人有效。
获取单元测试,代码覆盖率和基准测试权利主要是关于选择正确的工具。
我会运行例如使用一个包,我刚开始用的单元测试,代码覆盖率,和基准实现:
http://github.com/ekmett/speculation
您可以将测试和基准测试直接集成到cabal文件中,方法是为它们添加部分,并将它们隐藏在标记后面,这样它们就不会使得库的每个用户都必须能够访问(并且想要自己使用)测试工具的确切版本你选择了。
http://github.com/ekmett/speculation/blob/master/speculation.cabal
然后,你可以告诉阴谋有关如何运行测试套件。
由于cabal测试尚不存在 - 我们有一名学生为今年夏天的代码工作! - 我们拥有的最佳机制是
以下是如何使用cabal的用户钩子机制。这意味着使用cabal切换到'Custom'版本并设置testHook。运行与测试框架编写一个测试程序,然后testHook的例子应用于高性能计算来分析它可以在这里找到:
http://github.com/ekmett/speculation/blob/master/Setup.lhs
然后你就可以使用测试框架捆绑了快速检查和HUnit测试到一个程序:
http://github.com/ekmett/speculation/blob/master/Test.hs
小集团文件中,有细心打开-fhpc启用代码覆盖测试,然后在testHook手动Setup.lhs运行HPC和其输出写入到您的DIST DIR。
对于基准测试来说,故事是更加手动的,没有'cabal benchmark benchmark'选项。您可以将您的基准测试连接到您的测试钩子,但我喜欢手动运行它们,因为Criterion拥有如此多的图形报告选项。您可以将您的基准,以小集团文件如上图所示,给他们单独编译标志,隐藏在他们身后阴谋标志,然后用标准来完成所有的繁重:
http://github.com/ekmett/speculation/blob/master/Benchmark.hs
然后,您可以运行你的命令行基准,并获得基准结果等弹出式KDE窗口。
因为在实践中,你在开发Haskell代码时生活在cabal中,所以将它与你的工具链集成起来很有意义。
编辑:Cabal测试支持现在确实存在。请参阅http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites
一旦通过QuickCheck建立了主要不变量,您就可以开始重构,将这些测试转移到类型不变量中。
做法来支持你的努力:
test-framework package真的很棒。您可以轻松地集成HUnit和QuickCheck测试,并获取仅基于命令行标志运行指定套件的可执行文件,并具有多个输出目标。
虽然测试和分析是不同的野兽。为了进行性能分析,我将设置一个单独的可执行文件,只强调要配置的部分,并仔细查看性能分析构建和运行的结果(使用-prof-auto-all进行编译,+ RTS -p使用运行时旗)。
一个更积极维护的测试框架继任者是[美味](http://hackage.haskell.org/package/tasty)。 – sjakobi 2017-01-21 00:46:53
对于测试,我依靠HUnit和QuickCheck属性并使用Haskell Test Framework自动收集所有单元测试和所有QuickCheck属性。
声明:我是Haskell测试框架的主要开发人员。
Stefan,关于这方面的文档太少了。我想这是它不受欢迎的主要原因。有一个问题,绝对值得你关注:http://stackoverflow.com/questions/8919556/testing-with-htf – 2012-01-19 01:23:05
HTF的新版本0.9.0.0现在有相当多的文档。另外,我将开发移到https://github.com/skogsbaer/HTF/。我希望这会让人们更容易使用HTF并提出有关HTF的问题。随意做! – stefanwehr 2012-09-26 21:57:56
这个答案对于快速运行一个好的Setup.hs是非常宝贵的。 – alternative 2011-11-10 21:04:59
现在还有'cabal bench'。 – nh2 2012-10-27 17:19:34
是的。我会指向http:// github。com/ekmett /镜头作为一个更现代的例子来说明如何处理'cabal test'和'cabal bench',将基于'criterion'基准的'HUnit','doctest'和'quickcheck'混合测试。 “猜测”中的代码早于“cabal test”和“cabal bench”。 – 2012-11-02 17:02:02