【发布时间】:2010-06-25 19:18:26
【问题描述】:
我刚刚开始了一个新的 Haskell 项目,并希望从一开始就建立一个良好的测试工作流程。似乎 Haskell 有很多优秀而独特的测试工具以及许多不同的集成方式。
我已经调查过了:
这在他们的领域中似乎都运行良好,但我正在寻找一种全面的测试方法,并且想知道哪些方法对其他人有效。
【问题讨论】:
我刚刚开始了一个新的 Haskell 项目,并希望从一开始就建立一个良好的测试工作流程。似乎 Haskell 有很多优秀而独特的测试工具以及许多不同的集成方式。
我已经调查过了:
这在他们的领域中似乎都运行良好,但我正在寻找一种全面的测试方法,并且想知道哪些方法对其他人有效。
【问题讨论】:
正确进行单元测试、代码覆盖率和基准测试主要是选择正确的工具。
我将使用我刚刚开始启用的包作为运行示例,包括单元测试、代码覆盖率和基准测试:
http://github.com/ekmett/speculation
您可以通过为它们添加部分并将它们隐藏在标志后面来将您的测试和基准测试直接集成到您的 cabal 文件中,这样它们就不会出现,因此您的库的每个用户都必须有权访问(并且想要自己使用)您选择的测试工具的确切版本。
http://github.com/ekmett/speculation/blob/master/speculation.cabal
然后,您可以告诉 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 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
【讨论】:
cabal bench 现在也存在了。
cabal test 和cabal bench,将基于HUnit、doctest 和quickcheck 的测试与criterion 基准测试混合。 speculation 中的代码早于 cabal test 和 cabal bench。
RWH ch 11 中提倡的方法和XMonad 中的方法大致是:
一旦通过 QuickCheck 建立了主要不变量,您就可以开始重构,将这些测试移动到类型不变量中。
支持你努力的实践:
【讨论】:
test-framework package 真的很棒。您可以轻松集成 HUnit 和 QuickCheck 测试,并获得仅运行指定套件的可执行文件,基于命令行标志,具有多个输出目标。
测试和分析是不同的野兽。对于分析,我会设置一个单独的可执行文件,它只强调您想要分析的部分,并仔细查看分析构建和运行的结果(使用 -prof-auto-all 进行编译,使用 +RTS -p 进行运行时标志)。
【讨论】:
对于测试,我依赖 HUnit 和 QuickCheck 属性并使用 Haskell Test Framework 自动收集所有单元测试和所有 QuickCheck 属性。
免责声明:我是 Haskell 测试框架的主要开发者。
【讨论】: