jcallin
jcallin

Reputation: 75

Passing keys to integration test

I have an sbt project for which I am writing integration tests. The integration test deploys the API defined in the project. I need the version of the project from sbt in order to deploy the corresponding version of the API which has been published to a remote repository (x.x.x-SNAPSHOT). After it is deployed, I'll run integration tests against it.

Is there a way to pass Keys from sbt to a unit test class? I'm using Scalatest and sbt 1.2.7

Upvotes: 0

Views: 273

Answers (1)

Vladimir Matveev
Vladimir Matveev

Reputation: 127791

If you run your unit/integration tests in a forked JVM, you can pass the version through a system property to that JVM:

Test / fork := true

Test / javaOptions += s"-Dproject.version=${version.value}"

Change the scope according to how you set up your unit tests (you might need to use a different configuration or even a specific task).

If you don't want to run your tests in a forked JVM, you could use the following setting to set up the system property before running your tests:

Test / testOptions += Tests.Setup(() => sys.props += "project.version" -> version.value)

In either of these cases, you then should access the project.version system property in your tests to get the version number:

val version = sys.props("project.version")

Alternatively, you can generate a file and put it into your generated resources directory, and load the version number from there:

// 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()
}

Upvotes: 2

Related Questions