【问题标题】:Can I actually build and run an executable from the same package as part of a test suite?我真的可以从同一个包中构建和运行一个可执行文件作为测试套件的一部分吗?
【发布时间】:2018-07-07 17:04:57
【问题描述】:

令我震惊的是,我真的不知道用黑盒测试与 Cabal 打包的可执行文件的方法。

例如,使用 npm,我可以运行任意 shell 命令,而且我当然可以连接它,以便转换和执行必要的源代码,并检查它们的副作用。

Stack(如 here 所说) 构建可执行文件并将它们发布到 $PATH 以供测试套件使用,这样我就可以轻松运行它们。

但是对于 Cabal,测试套件显然甚至不能依赖于可执行文件,因此无法强制构建后者。 (我错了吗?)即使那样,我也必须知道编译后的二进制文件的路径。

我该如何解决这个问题?

我的情况的细节是可执行文件必须广泛分析系统的状态和相应的分支,我想集成测试它不会忘记这样做。

还请注意,我对直接运行相关的 IO 函数感到不安,因为我发现它不够集成。或者,更确切地说,我希望可以运行单个 IO 函数,并且将程序作为一个整体运行。就我而言,已经有测试 shell 脚本,但我真的很想“将它们纳入”。

【问题讨论】:

  • 我认为 cabal 本身并不支持这一点:github.com/haskell/cabal/issues/5415。但是,您可以轻松地将所有代码(包括main)移动到内部library 节(github.com/haskell/cabal/pull/3022),然后手动运行与可执行文件运行相同的main 函数。您也可以将可执行文件的所有源添加到hs-source-dirs,然后所有内容都将构建两次——一次用于实际可执行文件,一次用于测试——但可以从测试套件中导入。我会推荐便利库的方法。
  • @PeterAmidon 恰好是我在几个小时前提交了这张票。我想我应该澄清这个问题。
  • 哦,抱歉。我觉得你在票里说的没错,我只是把它作为一个方便的总结。您是否只是在寻找适合您用例的通用方法之一的更充实的版本?
  • @PeterAmidon 根本不需要道歉。我在问题中添加了一条注释,希望能澄清这一方面。此外,您同意我收集到的关于测试包的executable 部分的信息,这令人心旷神怡。我的问题主要是是否可以运行完整的、构建的可执行文件,以便完全确信它会按照包装盒上的说明进行操作。如果没有,我将简单地向 Cabal 提交另一个问题。
  • 啊哈,我现在明白了。如果您不介意第二个(主要是虚拟的)阴谋集团项目,我认为可能有办法做到这一点,但我正在研究它。

标签: haskell testing integration-testing cabal black-box-testing


【解决方案1】:

事实证明,至少现在有一种(有点笨拙的)方法可以做到这一点,使用新的(ish)build-tool-depends Cabal 字段。已经有一些讨论(https://github.com/haskell/cabal/issues/5411https://github.com/haskell/cabal/pull/4104#issuecomment-266838873build-tool-depends 仅在构建时可用,并且有一个单独的字段用于在运行组件时应该可用的可执行文件。但是,这个单独的运行时工具依赖字段还不存在。幸运的是,Cabal(至少 2.1 和 2.2)似乎完全没有这种区别:build-tool-depends 中列出的可执行文件实际上在cabal new-test 运行测试套件时可用。这意味着您可以使用如下所示的pkg.cabal 文件:

name: pkg
executable exe
  ...
test-suite test
  ...
  build-tool-depends: pkg:exe

当您运行测试套件时,可执行文件将在路径上构建。

【讨论】:

    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    相关资源
    最近更新 更多