【问题标题】:How to use HUnit and Cabal to do Automated Testing?如何使用 HUnit 和 Cabal 进行自动化测试?
【发布时间】:2012-08-08 23:17:35
【问题描述】:

我已经与 Cabal 斗争了一天的大部分时间,试图使其自动化测试功能与 HUnit 一起使用。我已经阅读了文档herehere,并且我已经设置了我的测试套件部分,就像它显示的那样,但是每当我尝试使用cabal build 构建包时,Cabal 说唯一支持的测试套件类型是exitcode-stdio-1.0。什么给了?

【问题讨论】:

    标签: unit-testing haskell cabal hunit


    【解决方案1】:

    背景

    所以这是交易,cabal 网站上的文档是“未来文档”,也就是说,并非所有这些功能都已实现和发布。 Cabal-install 0.14.0 带有detailed-0.9 接口,这是文档中指定的版本(detailed-1.0),但我还没有遇到与此相关的任何问题。如果您有 cabal-install 0.10.2 附带的 Haskell 平台版本 2011.4,您将无法使用 detailed-0.9 接口。您需要升级到 cabal-install 0.14.0 附带的 Haskell Platform 2012.2。您也可以单独升级 cabal-install,我就是这样做的,因为在 Fedora 17 上,Haskell 平台仅在 2011.4 上。

    安装

    在文档here 中,您将看到如何将detailed-0.9 接口与QuickCheck 一起使用的示例。它提到了一些具有 HUnit、QuickCheck1 和 QuickCheck2 接口的包,但只有 QuickCheck2 的包在 hackage 上可用。如果您想要其余框架的软件包,您需要使用 darcs(一个 VCS)从this 位置下载它们。您要为 HUnit 接口运行的命令是:darcs get http://community.haskell.org/~ttuegel/cabal-test-hunit/。您可能需要调整 .cabal 文件才能构建它,特别是它依赖于 ghc 3.*cabal 1.10。我将其更改为我的版本(ghc 4.*cabal 1.14)并且构建良好。

    测试

    一旦你建立了界面,你需要在你的测试模块中做一些事情,以便 Cabal 可以运行它。具体来说,您需要同时导入Distribution.TestSuiteDistribution.TestSuite.HUnit。之后,您需要使用 HUnit 接口中提供的函数将您的 HUnit 测试转换为 Cabal 测试。以下是相关的代码行:

    import qualified Distribution.TestSuite as Cabal
    import qualified Distribution.TestSuite.HUnit as CabalHUnit
    
    tests = map (\(x,y) -> CabalHUnit.test x y) [("Login tests", loginTests)]
    

    就是这样!您应该能够运行 cabal configure --enable-tests && cabal build && cabal test 并看到您的单元测试通过(或失败)。

    编辑
    编辑澄清 detailed-0.9 接口包含在 cabal-install 0.14.0 中,而不是 detailed-1.0

    【讨论】:

    • 该解决方案不适用于 HP 2012.2。 cabal --version 分别显示 0.14.01.14.0,但 cabal configure --enable-tests 仍然显示“测试类型为:exitcode-stdio-1.0,detailed-0.9”。所以官方的1.14.0还是没有detailed-1.0
    • @nponeccop 很抱歉我的解决方案具有误导性。我已经对其进行了编辑以使其更加清晰。需要说明的是,“detailed-1.0”接口还没有出来,所以你必须使用“detailed-0.9”接口。到目前为止我还没有遇到任何应该在1.0界面而不是0.9界面,而是YMMV的东西。
    • 对于通过 Google 搜索到达这里的任何人:请注意,更简单的解决方案是使用测试类型 exitcode-stdio-1.0 而不是 detailed。这是一个结合了exitcode-stdio-1.0HUnit 的工作示例:gist.github.com/23Skidoo/8019225
    【解决方案2】:

    虽然 Dwilson 的回答很好,但 detailed 目前还没有得到很好的支持。您可以使用exitcode-stdio-1.0Test.FrameworkHUnitcabal 集成。

    它将所有成功和失败的测试输出到stdout,如果测试失败,则构建失败。见我的gist

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2012-09-27
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多