Играть! 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?
Ответы
Ответ 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)
}