在 Haskell 中自动进行 运行 单元测试

Automatically running unit tests in Haskell

有没有办法 运行 我的测试套件与我的构建命令?我所能找到的就是我可以 运行 例如cabal testcabal build 之后。我想要的是一种在 运行 时自动 运行 我的测试的方法,例如cabal build.

我想要一个解决方案,可以为任何构建包的人自动执行此操作,而不需要他们 运行 不同的脚本。一个类比是 java 构建脚本,其中默认构建目标 运行s 编译后进行单元测试。

我发现这是一个非常糟糕的主意,因为它是破坏交叉编译的意外的非规范行为,但您可以将其与 Custom 构建类型一起破解。

这是一个例子mypackage.cabal:

cabal-version:       >=2.0
name:                mypackage
version:             0.1.0.0
author:              None
maintainer:          none@example.com
build-type:          Custom

custom-setup
  setup-depends:
    base  >= 4.5,
    Cabal >= 2.0

executable mypackage
  main-is: Main.hs
  build-depends: base >= 4
  default-language: Haskell2010

test-suite test
  type: exitcode-stdio-1.0
  build-depends: base >= 4
  main-is: Test.hs

和相应的 Setup.hs:

import Control.Monad
import Distribution.Simple
import Distribution.Simple.Setup
import Distribution.Simple.Test
import Distribution.Simple.Build

main = defaultMainWithHooks simpleUserHooks {
  postBuild = myPostBuild
}

myPostBuild args flags desc info =
  when ("exe:mypackage" `elem` buildArgs flags) $ do
    build desc info defaultBuildFlags { buildDistPref = buildDistPref flags } []
    test ["test"] desc info defaultTestFlags {
      testDistPref = buildDistPref flags
    }

这确实导致了一个项目,其中 cabal build 也在我的 Cabal 3.0.0.0 系统上构建和运行测试,但我不知道这有哪些额外的注意事项。

您可以在使用 cabal v2 项目时使用 cabal.project.local 来执行此操作(例如,cabal v2-build 是默认设置,因此与 cabal 3.0 版和 cabal build 相同向上)。

策略只是在构建目录中放置一个 cabal.project.local 文件,其内容为:

tests: true