Haskell测试工作流程

amc*_*usl 101 testing haskell

我刚刚开始一个新的Haskell项目,并希望从一开始就建立一个良好的测试工作流程.看起来Haskell有很多优秀而独特的测试工具和许多不同的集成方法.

我调查过:

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

Edw*_*ETT 70

正确获取单元测试,代码覆盖率和基准测试主要是选择合适的工具.

  • 测试框架提供了一站式服务来运行所有HUnit测试案例和快速检查所有从一个线束特性.
  • 代码覆盖率以HPC工具的形式构建到GHC中.
  • Criterion提供了一些非常棒的基准测试机制

我将使用我刚刚开始启用单元测试,代码覆盖率和基准测试的软件包作为运行示例:

http://github.com/ekmett/speculation

您可以通过为它们添加部分将测试和基准直接集成到cabal文件中,并将它们隐藏在标志后面,这样它们就不会使您的库中的每个用户都必须访问(并且想要自己使用) )您选择的测试工具的确切版本.

http://github.com/ekmett/speculation/blob/master/speculation.cabal

然后,您可以告诉cabal有关如何运行测试套件的信息.由于阴谋测试尚不存在 - 我们有一名学生正在为今年夏天的代码工作!- 我们拥有的最佳机制以下是如何使用cabal的用户钩子机制.这意味着切换到使用cabal的"Custom"构建并设置testHook.运行使用test-framework编写的测试程序的testHook示例,然后将hpc应用于配置文件,可以在此处找到:

http://github.com/ekmett/speculation/blob/master/Setup.lhs

然后,您可以使用test-framework将QuickCheck和HUnit测试捆绑到一个程序中:

http://github.com/ekmett/speculation/blob/master/Test.hs

那里的cabal文件小心打开-fhpc以启用代码覆盖测试,然后Setup.lhs中的testHook手动运行hpc并将其输出写入dist目录.

对于基准测试,故事更加手动,没有'cabal benchmark'选项.您可以将基准测试连接到测试钩子,但我喜欢手动运行它们,因为Criterion有很多图形报告选项.您可以将您的基准添加到cabal文件中,如上所示,给它们单独的编译标志,将它们隐藏在cabal标志后面,然后使用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

  • @copton他们从未实现过它.该文件需要被取回并拍摄. (9认同)
  • 真正.我会指出http://github.com/ekmett/lens作为一个更现代的例子来说明如何处理`cabal test`和`cabal bench`,混合`HUnit`,`doctest`和`quickcheck`的测试用`标准'基准.`speculation`中的代码早于`cabal test`和`cabal bench`. (6认同)
  • 而且`cabal bench`现在也存在. (2认同)
  • @EdwardKmett:我看到lense包只使用exitcode-stdio-1.0测试套件接口.Cabal用户指南指出,"最好为详细的1.0接口编写新的测试套件".对此有何评论? (2认同)
  • 不幸的是,github的链接都指向了主分支,看起来与测试相关的所有内容都已从cabal文件中删除,因此链接被有效地破坏了. (2认同)

Don*_*art 52

这种方法在RWH ch 11中是主张,在XMonad中大约是:

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

支持您努力的实践:

  • 在每次提交时运行简化的QuickCheck回归.
  • 发布HPC覆盖范围详细信息.


scl*_*clv 14

测试的框架包是真的真棒.您可以轻松地集成HUnit和QuickCheck测试,并获得仅基于命令行标志运行指定套件的可执行文件,以及多个输出目标.

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


ste*_*ehr 10

为了测试,我依赖于HUnit和QuickCheck属性,并使用Haskell测试框架自动收集所有单元测试和所有QuickCheck属性.

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

  • Stefan,这方面的文档很少.我想这是它保持不受欢迎的主要原因.这里有一个值得您关注的问题:http://stackoverflow.com/questions/8919556/testing-with-htf (5认同)
  • HTF的新版本0.9.0.0现在附带了大量文档.此外,我将开发移至https://github.com/skogsbaer/HTF/.我希望这会让人们更容易使用HTF并提出有关HTF的问题.随意这样做! (2认同)