我实际上可以作为测试套件的一部分从同一程序包中生成并运行可执行文件吗?

时间:2018-07-07 17:04:58

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

令我感到震惊的是,我真的不知道一种方法来对Cabal打包的可执行文件进行黑盒测试。

例如,使用npm,我可以运行任意的shell命令,并且可以连接它,以便编译和执行必要的源代码,并检查其副作用。

堆栈(如here构建可执行文件并将其发布到测试套件的$PATH中,因此我可以轻松地运行它们。

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

我该如何解决这个问题?

我的情况的特殊之处在于,可执行文件必须广泛地分析系统的状态并相应地分支,并且我想进行集成测试以确保它不会忘记这样做。

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

1 个答案:

答案 0 :(得分:2)

事实证明,至少在目前,使用新的(ish)build-tool-depends Cabal字段有一种(稍微有点怪异)的方法。关于build-tool-depends的一些讨论(https://github.com/haskell/cabal/issues/5411https://github.com/haskell/cabal/pull/4104#issuecomment-266838873)仅在构建时可用,并且有一个单独的字段用于可执行文件,这些可执行文件在运行时应该可用一个组件。但是,此单独的运行时工具取决于字段尚不存在。幸运的是,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

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