我真的可以从同一个包构建和 运行 一个可执行文件作为测试套件的一部分吗?

Can I actually build and run an executable from the same package as part of a test suite?

令我震惊的是,我真的不知道有什么方法可以对用 Cabal 打包的可执行文件进行黑盒测试。

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

堆栈 (如前所述 here 构建可执行文件并将它们发布到 $PATH 中用于测试套件,因此我可以轻松地 运行 他们

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

我该如何解决这个问题?

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

另请注意,我对 运行 直接使用相关 IO 功能感到不安,因为我发现它 不够完整 。或者,更确切地说,我希望可以 运行 单个 IO 函数和 运行 整个程序。就我而言,已经有测试 shell 脚本,但我真的很想 "bake them in".

事实证明,有一种(有点老套的)方法可以做到这一点,至少目前是这样,使用新的(大概)build-tool-depends Cabal 字段。已经有一些讨论(https://github.com/haskell/cabal/issues/5411, https://github.com/haskell/cabal/pull/4104#issuecomment-266838873build-tool-depends 仅在构建时可用,并且有一个单独的可执行文件字段,当 运行ning一个组件。但是,这个单独的 运行-time 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

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