玩!框架:自定义运行哪些测试

时间:2012-10-25 08:05:16

标签: scala testing playframework-2.0 sbt specs2

我玩了! 2用于Scala应用程序,我使用Specs2进行测试。我可以使用test命令或test-only MyParticularSpec的特定规范运行所有测试。

我想做的是在规范中标记一些特定的规范,甚至是单个方法,以便执行以下操作:

  • 运行所有非集成的测试(即不访问外部资源)
  • 运行在写入模式下不访问外部资源的所有测试(但仍在运行读取测试)
  • 运行所有测试但是给定一个

等等。

我想这样的事情应该是可行的,也许是通过添加一些注释,但我不知道该怎么做。

  

是否存在选择性运行某些测试而不是其他测试的机制?

编辑我在使用test-only时已经回答了问题。命令行选项仍然不适用于test任务。在sbt guide之后我试图创建一个额外的sbt配置,比如

object ApplicationBuild extends Build {
  // more settings
  lazy val UnitTest = config("unit") extend(Test)
  lazy val specs = "org.scala-tools.testing" %% "specs" % "1.6.9" % "unit"

  val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA)
    .configs(UnitTest)
    .settings(inConfig(UnitTest)(Defaults.testTasks) : _*)
    .settings(
      testOptions in UnitTest += Tests.Argument("exclude integration"),
      libraryDependencies += specs
    )
}

当我传递没有选项的参数时,例如当我放置Test.Argument("plan")时,这是有效的。但我无法找到如何传递更复杂的论点。我试过了

Tests.Argument("exclude integration")
Tests.Argument("exclude=integration")
Tests.Argument("-exclude integration")
Tests.Argument("-exclude=integration")
Tests.Argument("exclude", "integration")
Tests.Argument("exclude \"integration\"")

可能还有更多。仍然没有任何线索是什么是正确的语法。

  

有没有人知道如何将带有选项的参数传递给sbt的specs2?

5 个答案:

答案 0 :(得分:7)

首先,在the specs2 guide之后,必须在规范中添加标签,例如

class MySpec extends Specification with Tags {
  "My spec" should {
    "exclude this test" in {
      true
    } tag ("foo")

    "include this one" in {
      true
    }
  }
}

要包含的命令行参数记录在here

然后可以选择性地包括或排除测试

test-only MySpec -- exclude foo
test-only MySpec -- include foo

答案 1 :(得分:5)

您也可以在不对构建进行任何更改的情况下使用

test-only * -- exclude integration

在Play 2.1-RC3中测试

答案 2 :(得分:4)

如果要传递多个参数,可以将多个字符串添加到一个Test.Argument

testOptions in Test += Tests.Argument("include", "unit")

specs2 用户指南here和Play文档there中有一些示例。

答案 3 :(得分:2)

我使用的是Play2.2,根据您是否在播放控制台中,有两种方法可以执行此操作。

  1. 从控制台类型:test-only full.namespace.to.TestSpec
  2. 从终端类型:test-only "full.namespace.to.TestSpec"

答案 4 :(得分:0)

我试图弄清楚如何使用Play为ScalaTest做类似的事情时遇到了这个问题。 SBT有关于如何配置additional test configurations的详细文档,但这些可能会对Play进行一些调整。

除了微妙的不同项目配置外,我发现我想从PlaySettings中获取一堆测试设置。以下是在“ / it ”目录中运行并生成带有集成测试源的Intellij项目。我可能仍然缺少报告和生命周期钩子,

object BuildSettings {
  def testSettings = {
    // required for ScalaTest. See http://stackoverflow.com/questions/10362388/using-scalatest-in-a-playframework-project
    testOptions in Test := Nil
  }

  def itSettings = {
    // variously cribbed from https://github.com/playframework/Play20/blob/master/framework/src/sbt-plugin/src/main/scala/PlaySettings.scala
    sourceDirectory in IntegrationTest <<= baseDirectory / "it"
    scalaSource in Test <<= baseDirectory / "it"
    libraryDependencies += "play" %% "play-test" % play.core.PlayVersion.current % "it"
  }
}

object ApplicationBuild extends Build {
  val main = play.Project(
    appName,
    appVersion,
    Dependencies.dependencies)
    .configs( IntegrationTest )
    .settings(Dependencies.resolutionRepos)
    .settings(BuildSettings.testSettings)
    .settings(Defaults.itSettings : _*)
    .settings(BuildSettings.itSettings)
}