mde*_*ich 7 scala sbt specs2 sbt-assembly sbt-native-packager
我有一个有趣的问题,我基本上需要创建一个.jar(加上所有的类路径依赖项),其中包含一个 SBT 项目(加上它的任何子项目)的所有测试。这个想法是我可以只使用运行 jarjava -jar并且所有测试都将执行。
我听说这可能与 sbt-assembly 有关,但您必须手动运行您拥有assembly的每个 sbt 子项目(每个子项目都有自己的.jars),理想情况下,我只想运行一个命令,.jar为您碰巧拥有的每个 sbt root+sub 项目中的每个测试(以同样的方式,如果您test在带有子项目的 sbt 项目中运行,它将为所有内容运行测试)。
我们当前使用的测试框架是 specs2,但我不确定这是否有所不同。
有谁知道这是否可能?
sbt 1.3.x 没有这个功能。定义的测试与测试框架(如 Specs2)和 sbt 的构建提供的 runner 一起执行,该构建也会反射性地发现您定义的测试(例如哪个类扩展了 Spec2 的测试特征?)。理论上,我们已经拥有了大量您需要的东西,因为Test / fork := true创建了一个名为的程序ForkMain并在另一个 JVM 中运行您的测试。缺少的是调度您定义的测试。
值得庆幸的是,Specs2 提供了一个开箱即用的运行程序specs2.run(参见外壳中):
scala -cp ... specs2.run com.company.SpecName [argument1 argument2 ...]
Run Code Online (Sandbox Code Playgroud)
所以基本上你需要知道的是:
以下是使用 sbt 获取它们的方法:
> print Test/fullClasspath
* Attributed(/private/tmp/specs-runner/target/scala-2.13/test-classes)
* Attributed(/private/tmp/specs-runner/target/scala-2.13/classes)
* Attributed(/Users/eed3si9n/.coursier/cache/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.13/1.2.0/scala-xml_2.13-1.2.0.jar)
...
> print Test/definedTests
* Test foo.HelloWorldSpec : subclass(false, org.specs2.specification.core.SpecificationStructure)
Run Code Online (Sandbox Code Playgroud)
我们可以specs2.run从 sbt shell 中执行runner 如下:
> Test/runMain specs2.run foo.HelloWorldSpec
Run Code Online (Sandbox Code Playgroud)
跨子项目聚合测试需要一些思考。我会推荐以下内容,而不是创建一个巨大的组装球。创建一个虚拟子项目testAgg,然后将所有的Test/externalDependencyClasspath和收集Test/packageBin到它的target/dist. 然后,您可以获取所有 JAR 并java -jar ...根据需要运行。
如何以编程方式解决这个问题?请参阅从多个范围获取值。
> print Test/fullClasspath
* Attributed(/private/tmp/specs-runner/target/scala-2.13/test-classes)
* Attributed(/private/tmp/specs-runner/target/scala-2.13/classes)
* Attributed(/Users/eed3si9n/.coursier/cache/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.13/1.2.0/scala-xml_2.13-1.2.0.jar)
...
> print Test/definedTests
* Test foo.HelloWorldSpec : subclass(false, org.specs2.specification.core.SpecificationStructure)
Run Code Online (Sandbox Code Playgroud)
这运行如下:
> testAgg/test
[info] HelloWorldSpec
[info]
[info] The 'Hello world' string should
[info] + contain 11 characters
[info] + start with 'Hello'
[info] + end with 'world'
[info]
[info]
[info] Total for specification HelloWorldSpec
[info] Finished in 124 ms
3 examples, 0 failure, 0 error
[info] testAgg / Test / test 1s
Run Code Online (Sandbox Code Playgroud)
如果您真的想要,您可能可以根据所有子项目的配置从collectDefinedTestsmake生成源代码,并尝试制作一个巨大的组装球,但我将作为练习留给读者:)testAggTest
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |