当我运行stack test
时或stack 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. 当前编译和运行测试的最佳方法是什么?我对此的最佳猜测是尝试将测试放入单独的阴谋包中。
2.是否有某种原因导致堆栈不这样做或不能这样做?
最佳答案
我使用 stack build <pkgname>:test:<testsuite>
做了一些实验当您将所有 app/src/main 放在一个 directory cabal-project 中时,发现没有什么真正令人愉快的事情。
现在我没有调查这是否是由于堆栈使用 Cabal
造成的问题作为一个库或者这是否是一个堆栈问题。
以下是一些可能相关的问题
- Turning on test coverage rebuilds all packages #1940
- stack ghci foo:test:bar uses library dependencies unless --test is passed #1845
- Allow stack test to skip certain test suites #1659
- How to specify a subset of tests to run? #2519
- "stack test " does not run tests? #1961
但我想如果没有人提供更好的答案,您就必须提交错误。
<小时/>一个可能但相当丑陋的解决方案(在我看来)是将测试套件、应用程序和库拆分为单独的 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: []
请注意,您需要包含一个“虚拟”库部分才能编译,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
无需重建库和/或应用程序部分,但堆栈足够智能,如果您在运行测试之前更改它,则可以重建库部分。
更新
为了便于将来引用,这里有一个已打开票证的链接:
To use stack to compile and run only the tests #2710
关于haskell - 我可以使用 Haskell 的堆栈来编译并_仅_运行测试吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028933/