如何在"it"(集成测试)配置中提供"测试"类?

Rob*_*ing 33 sbt

我想在SBT中的"测试"和"它"配置之间分享一个帮助特征,但我还没弄明白如何.

这是一个最小的例子:

项目/ Build.scala

import sbt._
import Keys._

object MyBuild extends Build {

  val scalaTest = "org.scalatest" %% "scalatest" % "2.0" % "test,it"

  lazy val myProject =
    Project(id = "my-project", base = file("."))
      .configs(IntegrationTest)
      .settings(Defaults.itSettings: _*)
      .settings(
        scalaVersion := "2.10.3",
        libraryDependencies ++= Seq(
          scalaTest
        )
      )
}
Run Code Online (Sandbox Code Playgroud)

的src /测试/阶/ Helpers.scala

trait Helper {
  def help() { println("helping.") }
}
Run Code Online (Sandbox Code Playgroud)

的src /测试/阶/ TestSuite.scala

import org.scalatest._

class TestSuite extends FlatSpec with Matchers with Helper {
  "My code" should "work" in {
    help()
    true should be(true)
  }
}
Run Code Online (Sandbox Code Playgroud)

SRC /它/斯卡拉/ ItSuite.scala

import org.scalatest._

class ItSuite extends FlatSpec with Matchers with Helper {
  "My code" should "work" in {
    help()
    true should be(true)
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,在sbt,"测试"工作:

sbt> test
helping.
[info] TestSuite:
[info] My code
[info] - should work
[info] Run completed in 223 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 0 s, completed Dec 17, 2013 1:54:56 AM
Run Code Online (Sandbox Code Playgroud)

但"它:测试"不编译:

sbt> it:test
[info] Compiling 1 Scala source to ./target/scala-2.10/it-classes...
[error] ./src/it/scala/ItSuite.scala:3: not found: type Helper
[error] class ItSuite extends FlatSpec with Matchers with Helper {
[error]                                                   ^
[error] ./src/it/scala/ItSuite.scala:5: not found: value help
[error]     help()
[error]     ^
[error] two errors found
[error] (it:compile) Compilation failed
[error] Total time: 1 s, completed Dec 17, 2013 1:55:00 AM
Run Code Online (Sandbox Code Playgroud)

Eug*_*ota 18

如果要从Test配置中共享代码,最好从中创建自定义测试配置Test.见自定义的测试配置.

project/Build.scala成了:

import sbt._
import Keys._

object MyBuild extends Build {
  lazy val FunTest = config("fun") extend(Test)

  val scalaTest = "org.scalatest" %% "scalatest" % "2.0" % "test"

  lazy val myProject =
    Project(id = "my-project", base = file("."))
      .configs(FunTest)
      .settings(inConfig(FunTest)(Defaults.testSettings) : _*)
      .settings(
        scalaVersion := "2.10.3",
        libraryDependencies ++= Seq(
          scalaTest
        )
      )
}
Run Code Online (Sandbox Code Playgroud)

也重命名src/it/src/fun/.现在fun:test有效:

> fun:test
helping.
[info] ItSuite:
[info] My code
[info] - should work
[info] Run completed in 245 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 1 s, completed Dec 17, 2013 8:43:17 AM
Run Code Online (Sandbox Code Playgroud)


Cao*_*lte 15

您可以在项目中重新定义IntegrationTest Configuration以扩展Test配置而不是Runtime Configuration(默认值).这将使您的测试配置中的所有内容都可用于IntegrationTest配置.

import sbt._
import Keys._

object MyBuild extends Build {

  val scalaTest = "org.scalatest" %% "scalatest" % "2.0" % "test,it"

  lazy val IntegrationTest = config("it") extend(Test)

  lazy val myProject =
    Project(id = "my-project", base = file("."))
      .configs(IntegrationTest)
      .settings(Defaults.itSettings: _*)
      .settings(
        scalaVersion := "2.10.3",
        libraryDependencies ++= Seq(
          scalaTest
        )
      )
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你将两者都拉到其他地方的范围内,它可能无法编译,但即使你明确地选择了错误的一个,它也应该在内部解析为相同的配置空间,因为两个配置都绑定到"它",我认为这才是真正重要的.(如果愿意,您可以随时将其重命名为MyIntegrationTest.) (4认同)