13

我有戏!2 用于 Scala 应用程序,我正在使用 Specs2 进行测试。我可以使用test命令运行所有测试,或者使用test-only MyParticularSpec.

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

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

等等。

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

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

编辑我在使用时已经回答了自己test-only。命令行选项仍然不适用于该test任务。按照sbt 指南,我尝试创建一个额外的 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?

4

5 回答 5

7

首先,按照specs2 指南,必须在规范中添加标签,像这样

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

    "include this one" in {
      true
    }
  }
}

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

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

test-only MySpec -- exclude foo
test-only MySpec -- include foo
于 2012-10-25T08:47:01.913 回答
5

您也可以在不更改构建的情况下使用

test-only * -- exclude integration

在 Play 2.1-RC3 中测试

于 2013-02-05T10:33:38.517 回答
4

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

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

此处的specs2用户指南和此处的 Play 文档中有这方面的示例。

于 2012-10-26T09:45:04.733 回答
2

我正在使用 Play2.2,有两种方法可以做到这一点,具体取决于您是否在游戏控制台中。

  1. 从控制台类型:test-only full.namespace.to.TestSpec
  2. 从终端类型:test-only "full.namespace.to.TestSpec"
于 2014-03-22T04:16:32.697 回答
0

我在试图弄清楚如何为 ScalaTest with Play 做类似的事情时遇到了这个问题。SBT 有关于如何配置额外测试配置的详细文档,但这些可能需要对 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)
}
于 2013-02-18T12:29:09.103 回答