如何使用SBT对胖罐运行ScalaTest测试?

问题描述 投票:2回答:1

我有一个简单的SBT项目,包括src/main/scala中的一些Scala代码和src/test/scala中的一些测试代码。我使用sbt-assembly插件创建一个胖jar,用于部署到远程系统上。胖jar包含Scala项目的所有依赖项,包括Scala运行时本身。一切都很好。

现在我想弄清楚我可以对胖罐运行Scala测试的方法。我尝试了显而易见的事情,创建一个新的配置扩展Test配置并修改dependencyClasspath为胖JAR而不是默认值,但是这失败因为(我假设因为)scala运行时包含在胖罐中并以某种方式发生碰撞使用已加载的scala运行时。

我的解决方案现在有效,但它有严重的缺点。我只是使用Fork.javaorg.scalatest.tools.Runner运行器上调用Java,类路径设置为包含测试代码和胖jar以及所有测试依赖项。缺点是没有SBT测试丰富度,没有testQuick,没有testOnly,测试失败报告是stdout。

我的问题可以归结为:当这些测试不依赖于相应的SBT compile输出时,如何使用SBT的测试命令来运行测试,而是依赖于包含所有scala运行时的胖JAR文件?

scala sbt scalatest sbt-assembly
1个回答
0
投票

尝试将胖jar添加到测试类路径的第一个位置,就像这样

Test / fullClasspath := Attributed.blank((assembly / assemblyOutputPath).value) :: (Test / fullClasspath).value.toList

在这里,assemblyOutputPath给出了脂肪罐的路径。我的理解是JVM加载它在类路径上遇到的first class,所以实际上我们将测试fat jar。

我们可以像这样在自定义命令testAgainstFatJar中捕获这个想法

commands += Command.command("testAgainstFatJar") { state =>
    "set assembly / test := {}" ::
    "assembly" ::
    "set Test / fullClasspath := Attributed.blank((assembly / assemblyOutputPath).value) :: (Test / fullClasspath).value.toList" ::
    "test" :: state
}

检查胖罐确实在show Test / fullClasspath的第一个位置

© www.soinside.com 2019 - 2024. All rights reserved.