使用 SBT 编译测试并将它们打包以便稍后运行
Posted
技术标签:
【中文标题】使用 SBT 编译测试并将它们打包以便稍后运行【英文标题】:Compile tests with SBT and package them to be run later 【发布时间】:2013-04-29 15:49:42 【问题描述】:我正在使用 SBT 和 Play!框架。目前,我们的管道中有一个提交阶段,我们发布到工件我们的二进制文件。二进制文件是使用 dist 任务生成的。然后管道运行用 scala 编写的冒烟和验收测试。它们使用 sbt 运行。
我想做的是编译冒烟和验收测试以及二进制文件并将它们发布到工件。这将允许管道下载这些二进制文件(测试套件)并运行它们,而不是每次都重新编译它们,这需要很长时间。
我尝试了生成 jar 的 sbt test:compile,但是我找不到运行测试的方法。
【问题讨论】:
你所说的“管道”到底是什么意思? “管道”是否指的是单独的构建服务器,例如 Jenkins? 是的,我们有一个由 Jenkins 管理的部署管道。它的作用是每当有人推送到 master 时下载代码,在其上运行测试,如果成功,则使用 dist 任务构建二进制文件。然后它继续将其发布到 Artifactory。 我不明白你为什么不在同一个构建节点上同时运行构建和测试,两者都使用 sbt。此外,我的测试运行时间比编译时间长得多,所以我很惊讶你的测试正好相反。 好吧,我们正在这样做,有点像:在我们构建的同一个节点中,我运行单元测试。然后我的 Jenkins 与公司的 Jenkins 通信,并让它在 QA 环境中部署二进制文件。然后它会返回信息,然后我们继续测试。在这一步中,我们使用 'sbt smoke:tests' 运行烟雾测试。这是缓慢的一步。因为 jenkins 作业再次下载代码,sbt 更新 ivy 存储库,构建二进制文件,五分钟后,运行一个需要 7 秒的测试套件,即冒烟测试。我想短路它的这一步。希望有帮助! 【参考方案1】:sbt 不要在工件中发布测试
publishArtifact in GlobalScope in Test:== false
来源:https://github.com/sbt/sbt/blob/a7413f6415687f32e6365598680f3bb8545c46b5/main/src/main/scala/sbt/Defaults.scala#L1118
这是如何启用它
// enable publishing the jar produced by `test:package`
publishArtifact in (Test, packageBin) := true
// enable publishing the test API jar
publishArtifact in (Test, packageDoc) := true
// enable publishing the test sources jar
publishArtifact in (Test, packageSrc) := true
来源:http://www.scala-sbt.org/release/docs/Detailed-Topics/Artifacts
运行测试
scala -classpath pipeline.jar classpath scalatest-<version>.jar org.scalatest.tools.Runner -p compiled_tests
pipeline.jar
是您从管道收到的测试工件
或者你可以通过 sbt 设置一个测试项目
http://www.scala-sbt.org/release/docs/Detailed-Topics/Testing.html
【讨论】:
所以我确实设法做到了。我用 test:package 任务生成的是一个 jar。现在我无法运行它。它说它找不到主要课程。我的整个测试套件的主要类是什么? 你好纪尧姆。实际上我永远无法让它与 ScalaTest 一起使用,因为我使用的是 Specs2。我将检查该跑步者的工作方式并回复您。 我让它与 specs2 一起工作。以下命令有效:“java $* -cp $classpath specs2.junitxml test.acceptance.LocationAcceptanceSpec” 其中 classpath 是运行 dist 任务时在运行脚本中定义的变量以上是关于使用 SBT 编译测试并将它们打包以便稍后运行的主要内容,如果未能解决你的问题,请参考以下文章