Haskelltesting工作stream程
我刚刚开始一个新的Haskell项目,并希望从一开始就build立一个良好的testing工作stream程。 Haskell似乎有很多优秀和独特的testing工具和许多不同的方法来整合它们。
我曾看过:
- HUnit
- 快速检查
- benchpress
- HPC
- 复杂
这似乎都在他们的领域工作得很好,但我正在寻找一个全面的testing方法,并想知道什么对其他人来说效果不错。
获取unit testing,代码覆盖范围和基准testing主要是关于select正确的工具。
- test-framework提供了一个一站式的商店,可以从一个线束中运行所有的HUnittesting用例和QuickCheck属性。
- 代码覆盖率以HPC工具的forms内置于GHC中。
- Criterion提供了一些非常棒的基准testing机制
我将用一个运行的例子来说明一个我刚开始使用unit testing,代码覆盖率和基准testing的软件包:
http://github.com/ekmett/speculation
你可以把你的testing和基准直接集成到你的cabal文件中,为它们添加一些部分,然后把它们遮盖在标志后面,这样就不会让你的图书馆的每个用户都能够访问(并且想自己使用)您select的testing工具的确切版本。
http://github.com/ekmett/speculation/blob/master/speculation.cabal
然后,你可以告诉cabal如何运行你的testing套件。 由于cabaltesting还不存在 – 我们有一个学生为今年夏天的代码工作! – 我们有最好的机制是这里是如何使用cabal的用户钩子机制。 这意味着切换到“自定义”与cabal构build和build立一个testHook。 运行用testing框架编写的testing程序的testHook示例,然后将hpc应用于configuration文件可以在这里find:
http://github.com/ekmett/speculation/blob/master/Setup.lhs
然后,您可以使用testing框架将QuickCheck和HUnittesting捆绑到一个程序中:
http://github.com/ekmett/speculation/blob/master/Test.hs
cabal文件在打开-fhpc时要小心,以启用代码覆盖率testing,然后在Setup.lhs中的testHook手动运行hpc并将其输出写入您的远程目录。
对于基准testing来说,这个故事是更加手动的,没有“cabal benchmark”选项。 您可以将您的基准testing连接到您的testing钩子,但我喜欢手动运行它们,因为Criterion具有如此多的graphics报告选项。 您可以将基准添加到cabal文件中,如上所示,给它们分别编译标志,将它们隐藏在cabal标志后面,然后使用Criterion完成所有繁重工作:
http://github.com/ekmett/speculation/blob/master/Benchmark.hs
然后,您可以从命令行运行您的基准testing,并获得带有基准testing结果的popup式KDE窗口等。
因为实际上你在开发Haskell代码的时候居住在cabal中,所以把你的工具链集成到它里面是很有意义的。
编辑 :现在支架testing支持确实存在。 见http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/developing-packages.html#test-suites
这个方法在RWH 第11章提倡,在XMonad中大概是:
- 在QuickCheck中声明系统的所有属性
- 用HPC显示testing覆盖率
- 使用堆分析确认空间行为。
- 用ThreadScope确认线程/并行行为。
- 使用Criterion确认microbenchmark行为。
一旦你的主要不variables通过QuickCheckbuild立起来,你就可以开始重构,把这些testing转换成types不变式。
实践来支持你的努力:
- 在每次提交时运行简化的QuickCheck回归。
- 发布HPC覆盖详细信息。
testing框架包真的很棒。 您可以轻松地集成HUnit和QuickChecktesting,并获取只能运行指定套件的基于命令行标志和多个输出目标的可执行文件。
虽然testing和分析是不同的野兽。 为了进行性能分析,我将设置一个单独的可执行文件,只强调要剖析的部分,并仔细查看性能分析的构build和运行结果(使用-prof-auto-all进行编译,+ RTS -p用于运行时旗)。
为了testing,我依靠HUnit和QuickCheck属性,并使用Haskelltesting框架自动收集所有unit testing和所有QuickCheck属性。
免责声明:我是Haskelltesting框架的主要开发人员。