将密钥传递给集成测试

时间:2019-01-11 19:51:33

标签: scala testing sbt

我有一个sbt项目,正在为此编写集成测试。集成测试将部署项目中定义的API。我需要sbt中项目的版本,以便部署已发布到远程存储库(x.x.x-SNAPSHOT)的API的相应版本。部署后,我将对其进行集成测试。

是否可以将键从sbt传递到单元测试类?我正在使用Scalatest和sbt 1.2.7

1 个答案:

答案 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()
}