我刚开始一个新的Haskell项目,并希望从一开始就建立一个良好的测试工作流程。看起来Haskell有很多优秀而独特的测试工具和许多不同的集成方法。
我已经调查过:
所有这些似乎在他们的领域都很有效,但我正在寻找一种全面的测试方法,并且想知道什么对其他人有效。
答案 0 :(得分:70)
正确地获取单元测试,代码覆盖率和基准测试主要是选择正确的工具。
我将使用我刚刚开始启用单元测试,代码覆盖率和基准测试的软件包作为运行示例:
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建立了主要不变量,就可以开始重构,将这些测试移到类型不变量中。
支持您努力的实践:
答案 2 :(得分:14)
test-framework package非常棒。您可以轻松集成HUnit和QuickCheck测试,并根据命令行标记获得仅运行指定套件的可执行文件,并具有多个输出目标。
测试和分析虽然是不同的野兽。对于分析,我设置了一个单独的可执行文件,它只强调您要分析的部分,并仔细查看分析构建和运行的结果(使用-prof-auto-all进行编译,使用+ RTS -p进行运行时标志)。
答案 3 :(得分:10)
为了测试,我依赖于HUnit和QuickCheck属性,并使用Haskell Test Framework自动收集所有单元测试和所有QuickCheck属性。
免责声明:我是Haskell测试框架的主要开发人员。