Haskell测试工作流程


101

我刚刚启动了一个新的Haskell项目,并希望从一开始就建立一个良好的测试工作流程。Haskell似乎拥有许多出色且独特的测试工具以及许多不同的集成方式。

我调查了:

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

Answers:


70

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

  • 测试框架提供了一站式服务来运行所有HUnit测试案例和快速检查所有从一个线束特性。
  • GHC以HPC工具的形式内置了代码覆盖范围。
  • Criterion提供了一些非常好的基准测试机制

我将以一个正在运行的示例作为示例,该软件包刚刚开始用于单元测试,代码覆盖率和基准测试:

http://github.com/ekmett/speculation

您可以将测试和基准测试直接添加到组织文件中,方法是为它们添加部分,并在标记后将它们掩盖,以免它们出现,从而使库中的每个用户都可以访问(并希望自己使用) )您选择的测试工具的确切版本。

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

然后,您可以告诉cabal如何运行测试套件。由于尚未进行全面测试-今年夏天的代码中有一位学生正在研究它!-我们拥有的最佳机制是如何使用Cabal的用户挂钩机制。这意味着使用cabal切换到“自定义”构建并设置一个testHook。一个testHook的示例可以运行一个用test-framework编写的测试程序,然后将hpc应用于它的配置文件,可以在这里找到:

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

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

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

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

对于基准测试,故事是更多手动操作,没有“ cabal基准测试”选项。您可以将基准测试连接到测试挂钩中,但是我喜欢手动运行它们,因为Criterion有许多图形报告选项。您可以如上所述将基准测试添加到cabal文件中,为它们提供单独的编译标志,将它们隐藏在cabal标志后面,然后使用Criterion进行所有繁重的工作:

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

然后,您可以从命令行运行基准测试,并弹出带有基准测试结果的KDE窗口等。

由于实际上在开发Haskell代码时您总是生活在阴谋中,因此将您的工具链与其集成在一起非常有意义。

编辑:阴谋测试支持现在确实存在。请参阅http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites


2
cabal bench现在同样存在。
nh2 2012年

6
真正。我想指出github.com/ekmett/lens为如何应对一个更现代的例子cabal testcabal bench,混炼HUnitdoctestquickcheck基于与测试criterion基准。speculation之前cabal test和之后的代码cabal bench
爱德华·KMETT

2
@EdwardKmett:我看到lense包仅使用exitcode-stdio-1.0测试套件接口。Cabal用户指南指出:``最好为detail-1.0接口编写新的测试套件''。对此有何评论?
copton

9
@copton他们从未实现它。该文档需要取出并拍摄。
爱德华KMETT

2
不幸的是,指向github的链接都指向master分支,并且看起来与测试相关的所有东西都已从cabal文件中删除,因此这些链接实际上被破坏了。
Andrew Thaddeus Martin 2015年

52

RWH ch 11XMonad中倡导的方法大致为:

通过QuickCheck建立主要不变式后,就可以开始重构,将这些测试移到类型不变式中。

支持您的努力的做法:

  • 对每个提交运行简化的QuickCheck回归。
  • 发布HPC覆盖范围详细信息。

14

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

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


更积极地维护测试框架的继承者很可口
sjakobi

10

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

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


5
Stefan,关于它的文档很少。我猜这是它不受欢迎的主要原因。这里肯定有一个问题值得您关注:stackoverflow.com/questions/8919556/testing-with-htf
Nikita Volkov 2012年

2
HTF的新版本0.9.0.0现在附带了大量文档。另外,我将开发移至github.com/skogsbaer/HTF。我希望这将使人们更容易使用HTF并提出有关HTF的问题。随时这样做!
stefanwehr 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.