我可以使用Haskell的堆栈来编译和运行_only_测试吗?

时间:2016-10-13 19:01:22

标签: haskell haskell-stack

当我运行stack teststack test <package>:<test-suite>时,输出看起来像:

package: configure (lib + exe + test)
package: build (lib + exe + test)
package: copy/register
package: test (suite: tests)

它最终基本上编译了我的所有更改两次:一次用于exe或lib,第二次用于测试。

我想要的是像stack test --test-only这样的命令会产生类似的东西:

package: configure (test)
package: build (test)
package: copy/register
package: test (suite: tests)

我已经查看了可用的命令行标志和堆栈文档。我也试过谷歌搜索,看看是否有人谈过类似的东西。

所以我的问题是:
1.目前最好的编译和运行 测试的方法是什么?我最好的猜测是尝试将测试放在一个单独的cabal包中 2.堆栈没有或不能做到这一点有什么原因吗?

1 个答案:

答案 0 :(得分:4)

我使用stack build <pkgname>:test:<testsuite>进行了一些实验,当你在一个目录 cabal-project中拥有所有app / src / main时,没有发现任何真正令人满意的事。

现在我没有调查这是否是一个问题,因为使用Cabal作为库的堆栈或者这是否是堆栈问题。

这里有一些可能相关的问题

但我想如果没有人提供更好的答案,你必须提交错误。

一个可能但非常难看的解决方案(在我看来)是将测试套件,应用程序和库分成单独的cabal项目 - 这是我用于测试的示例文件夹结构。

myproject
├── stackapp            
│   ├── app             
│   │   └── Main.hs     
│   ├── ChangeLog.md    
│   ├── LICENSE         
│   ├── Setup.hs        
│   └── stackapp.cabal  
├── stacksrc            
│   ├── ChangeLog.md    
│   ├── LICENSE         
│   ├── Setup.hs        
│   ├── src             
│   │   └── Lib.hs      
│   └── stacksrc.cabal  
├── stacktest           
│   ├── ChangeLog.md    
│   ├── LICENSE         
│   ├── Setup.hs        
│   ├── src             
│   ├── stacktest.cabal 
│   └── tst             
│       └── Spec.hs     
└── stack.yaml  
  

stack.yaml

resolver: lts-7.3

packages:
- './stacksrc'
- './stacktest'
- './stackapp'
extra-deps: []
flags: {}
extra-package-dbs: []

请注意,您需要包含一个&#34;虚拟&#34;库部分为了使它编译,cabal对于既没有lib也没有exe部分的cabal文件很挑剔。

  

stacktest.cabal

...
library
  -- dummy
  build-depends:       base >=4.9 && <4.10
  hs-source-dirs:      src
  default-language:    Haskell2010

test-suite tests
  type:          exitcode-stdio-1.0
  main-is:       Spec.hs
  hs-source-dirs: tst
  build-depends: base
               , stacksrc
               , hspec
               , hspec-expectations-pretty-diff

  default-language: Haskell2010

然后你可以修改测试并运行stack stacktests:test:tests而无需重建lib和/或应用程序部分,但堆栈足够智能,如果在运行测试之前更改它,则重建lib部分。

更新

以下参考是打开的票证的链接:

To use stack to compile and run only the tests #2710