我有一个sbt项目,正在为此编写集成测试。集成测试将部署项目中定义的API。我需要sbt中项目的版本,以便部署已发布到远程存储库(x.x.x-SNAPSHOT)的API的相应版本。部署后,我将对其进行集成测试。
是否可以将键从sbt传递到单元测试类?我正在使用Scalatest和sbt 1.2.7
答案 0 :(得分:1)
如果您在派生的JVM中运行单元/集成测试,则可以通过系统属性将该版本传递给该JVM:
Test / fork := true
Test / javaOptions += s"-Dproject.version=${version.value}"
根据设置单元测试的方式更改范围(您可能需要使用其他配置,甚至需要执行特定任务)。
如果您不想在派生的JVM中运行测试,则可以在运行测试之前使用以下设置来设置系统属性:
Test / testOptions += Tests.Setup(() => sys.props += "project.version" -> version.value)
在这两种情况下,您都应该在测试中访问project.version
系统属性以获取版本号:
val version = sys.props("project.version")
或者,您可以生成文件并将其放入生成的资源目录,然后从此处加载版本号:
// build.sbt
Test / resourceGenerators += Def.task {
val versionFile = (Test / resourceManaged).value / "version.txt"
IO.write(versionFile, version.value)
Vector(versionFile)
}
// your test
val is = getClass.getClassLoader.getResourceAsStream("version.txt")
val version = try {
scala.io.Source.fromInputStream(is).mkString
} finally {
is.close()
}