2010-06-25 99 views
100

我刚开始一个新的Haskell项目,希望从一开始就建立一个良好的测试工作流程。 Haskell似乎拥有许多优秀且独特的测试工具和许多不同的方法来整合它们。Haskell测试工作流程

我已经调查:

这似乎都在他们的领域工作得很好,但我正在寻找一种全面的测试方法,并且想知道哪些方面对其他人有效。

回答

69

获取单元测试,代码覆盖率和基准测试权利主要是关于选择正确的工具。

  • 测试框架提供了一个一站式商店,可以通过一个线束运行所有HUnit测试用例和QuickCheck属性。
  • 代码覆盖率以HPC工具的形式内置于GHC中。
  • 标准提供了一些非常伟大的标杆机械

我会运行例如使用一个包,我刚开始用的单元测试,代码覆盖率,和基准实现:

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

+0

这个答案对于快速运行一个好的Setup.hs是非常宝贵的。 – alternative 2011-11-10 21:04:59

+2

现在还有'cabal bench'。 – nh2 2012-10-27 17:19:34

+6

是的。我会指向http:// github。com/ekmett /镜头作为一个更现代的例子来说明如何处理'cabal test'和'cabal bench',将基于'criterion'基准的'HUnit','doctest'和'quickcheck'混合测试。 “猜测”中的代码早于“cabal test”和“cabal bench”。 – 2012-11-02 17:02:02

52

的办法是倡导在RWH ch 11XMonad大约是:

一旦通过QuickCheck建立了主要不变量,您就可以开始重构,将这些测试转移到类型不变量中。

做法来支持你的努力:

  • 运行简化的快速检查回归上每次提交。
  • 发布HPC覆盖详细信息。
14

test-framework package真的很棒。您可以轻松地集成HUnit和QuickCheck测试,并获取仅基于命令行标志运行指定套件的可执行文件,并具有多个输出目标。

虽然测试和分析是不同的野兽。为了进行性能分析,我将设置一个单独的可执行文件,只强调要配置的部分,并仔细查看性能分析构建和运行的结果(使用-prof-auto-all进行编译,+ RTS -p使用运行时旗)。

+0

一个更积极维护的测试框架继任者是[美味](http://hackage.haskell.org/package/tasty)。 – sjakobi 2017-01-21 00:46:53

10

对于测试,我依靠HUnit和QuickCheck属性并使用Haskell Test Framework自动收集所有单元测试和所有QuickCheck属性。

声明:我是Haskell测试框架的主要开发人员。

+5

Stefan,关于这方面的文档太少了。我想这是它不受欢迎的主要原因。有一个问题,绝对值得你关注:http://stackoverflow.com/questions/8919556/testing-with-htf – 2012-01-19 01:23:05

+2

HTF的新版本0.9.0.0现在有相当多的文档。另外,我将开发移到https://github.com/skogsbaer/HTF/。我希望这会让人们更容易使用HTF并提出有关HTF的问题。随意做! – stefanwehr 2012-09-26 21:57:56