Haskell测试工作流程

时间:2010-06-25 19:18:26

标签: testing haskell

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

我已经调查过:

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

4 个答案:

答案 0 :(得分:70)

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

  • test-framework提供了一站式服务,可以从一个工具中运行所有HUnit测试用例和QuickCheck属性。
  • 代码覆盖率以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

答案 1 :(得分:52)

这种方法在RWH ch 11中是倡导者,在XMonad中约为:

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

支持您努力的实践:

  • 在每次提交时运行简化的QuickCheck回归。
  • 发布HPC覆盖详情。

答案 2 :(得分:14)

test-framework package非常棒。您可以轻松集成HUnit和QuickCheck测试,并根据命令行标记获得仅运行指定套件的可执行文件,并具有多个输出目标。

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

答案 3 :(得分:10)

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

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