在堆栈中运行测试套件的惯用方法

时间:2017-11-10 12:14:09

标签: haskell testing haskell-stack

Haskell初学者在这里。

我正在努力寻找一种运行我在.cabal文件中定义的测试套件的好方法。鉴于您在test-suite文件中添加了.cabal个部分,我希望您可以使用stack runtests这样的单个命令运行所有部分。

我找到的最佳答案是: Haskell Stack Ghci test-suite建议您必须运行

stack ghci --test module:test:libtests

然而,有两件事让我很恼火,我认为必须有更好的方法。

  1. 明确调用stack ghci --test module:test:libtests很麻烦。如果我在项目变大时有更多的测试套件,我不想这样做。
  2. 更糟糕的是,我最终进入了互动环节,不得不自己打电话给main。这不会缩放。
  3. 是不是有更好的方法来为堆栈项目运行测试套件?当然我可以做一些shell脚本,但是hey stack应该知道如何运行我的测试,我在.cabal文件中指定了所有内容。

    我尝试stack runghc --test,但这没有用。

    项目设置:

    .
    ├── app
    │   └── Main.hs
    ├── LICENSE
    ├── README.md
    ├── Setup.hs
    ├── src
    │   ├── Lib.hs
    │   └── WordNumber.hs
    ├── stack.yaml
    ├── test
    │   └── Spec.hs
    └── WordNumber.cabal
    

    WordNumber.cabal

    name:                WordNumber
    version:             0.1.0.0
    -- synopsis:
    -- description:
    homepage:            https://github.com/githubuser/WordNumber#readme
    license:             BSD3
    license-file:        LICENSE
    author:              Author name here
    maintainer:          example@example.com
    copyright:           2017 Author name here
    category:            Web
    build-type:          Simple
    extra-source-files:  README.md
    cabal-version:       >=1.10
    
    library
      hs-source-dirs:      src
      exposed-modules:     Lib, WordNumber
      build-depends:       base >= 4.7 && < 5
      default-language:    Haskell2010
    
    executable wordnumber
      hs-source-dirs:      app
      main-is:             Main.hs
      ghc-options:         -threaded -rtsopts -with-rtsopts=-N
      build-depends:       base
                         , WordNumber
      default-language:    Haskell2010
    
    test-suite wordnumber-test
      type:                exitcode-stdio-1.0
      hs-source-dirs:      test
      main-is:             Spec.hs
      build-depends:       base
                         , WordNumber
                         , hspec
      ghc-options:         -threaded -rtsopts -with-rtsopts=-N
      default-language:    Haskell2010
    

    更新: 其实我觉得自己找不到答案有点愚蠢。它是stack teststack build --test,也有记录。

    然而,对于关注HaskellBook的人来说,可能并不那么明显。出于某种原因,测试章节中的所有测试都以繁琐的方式执行,并且从未提及使用stack test的运行测试。

1 个答案:

答案 0 :(得分:9)

stack test运行位于.cabal文件中的测试。如果需要,它会运行stack build,因此您无需在测试前手动构建。

进一步了解:https://docs.haskellstack.org/en/stable/GUIDE/#stack-test