Подтвердить что ты не робот

Играть! framework: настроить те тесты, которые выполняются

У меня есть игра! 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\"")

и, возможно, больше. Все еще не понятно, что такое правильный синтаксис.

Кто-нибудь знает, как передать аргументы с параметрами specs2 из sbt?

4b9b3361

Ответ 1

Если вы хотите передать несколько аргументов, вы можете добавить несколько строк к одному Test.Argument

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

Вот примеры этого в руководстве пользователя specs2 здесь и в документации Play есть.

Ответ 2

Сначала, следуя руководству 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

Ответ 3

Вы также можете использовать без каких-либо изменений в своей сборке

test-only * -- exclude integration

Протестировано в Play 2.1-RC3

Ответ 4

Я использую Play2.2, и есть 2 способа сделать это в зависимости от того, находитесь ли вы в игровой консоли.

  • Из типа консоли: test-only full.namespace.to.TestSpec
  • От типа терминала: test-only "full.namespace.to.TestSpec"

Ответ 5

Я столкнулся с этим вопросом, пытаясь понять, как сделать что-то подобное для ScalaTest с Play. SBT имеет подробную документацию о том, как настроить дополнительные тестовые конфигурации, но они могут использовать немного настройки для Play.

Помимо тонко различной конфигурации Проекта, я обнаружил, что я хотел скрыть кучу тестовых настроек из PlaySettings. Далее выполняется и генерируется проект Intellij с интеграционными тестовыми источниками в каталоге /it. Я все еще могу не пропускать сообщения и крючки жизненного цикла,

object BuildSettings {
  def testSettings = {
    // required for ScalaTest. See http://stackoverflow.com/info/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)
}