Как я могу пометить некоторые ScalaTests, чтобы они выполнялись только при явном вызове - PullRequest
2 голосов
/ 27 апреля 2019

Я новичок в SBT и самый масштабный, но мне интересно, как некоторые из моих org.scalatest._ тестов могут выполняться только "по требованию".

В SBT я могу вызывать все юнит-тесты, например sbt:Sprout> test, или все IntegrationTests, например sbt:Sprout> it:test. Мне нужен способ аннотировать тесты, который позволяет при вызове sbt:Sprout test пропускать их, но с другим вызовом выполняет ТОЛЬКО эти тесты. Самые масштабные документы говорят о каком-то вызове sbt:Sprout> test-only *RedSuite, который позволил бы мне «классифицировать» мои тесты, но не ясно, как использовать это, чтобы они НЕ выполнялись как юнит-тесты. Одни только org.scalatest.Tag не сбрасывают его со значения «по умолчанию» выполнения, когда sbt:Sprout> test. Мне нужно, чтобы они были ignored, если они не вызваны явно.

Возможен ли этот вариант использования в ScalaTest через SBT?

Ответы [ 2 ]

4 голосов
/ 27 апреля 2019

Вы можете указать имена тегов тестов для включения или исключения из прогона.Чтобы указать теги для включения, используйте -n, ​​а затем список имен тегов для включения.Аналогичным образом, чтобы указать исключаемые теги, используйте -l, за которым следует список имен тегов, чтобы исключить

(пожалуйста, посмотрите здесь для получения дополнительной информации в официальных документах).

Например:

package com.test

import org.scalatest.FlatSpec
import org.scalatest.Tag

object IncludeTest extends Tag("com.tags.Include")
object ExcludeTest extends Tag("com.tags.Exclude")

class TestSuite extends FlatSpec {

 "Test1" taggedAs(IncludeTest) in {
   val sum = 1 + 1
   assert(sum === 2)
  }

 "Test2" taggedAs(ExcludeTest) in {
   val minus = 2 - 1
   assert(minus === 1)
 }
}

Чтобы включить IncludeTest и исключить тег ExcludeTest, необходимо выполнить:

test-only org.* -- -n com.tags.Include -l com.tags.Exclude
2 голосов
/ 28 апреля 2019

assume утверждение, указанное внутри объекта контекста фикстуры , может использоваться для реализации семантики условного игнорирования, зависящей от флага среды. Например, рассмотрим следующее IfIgnored приспособление

trait IfIgnored extends Assertions {
  assume(System.getenv("runIgnoredTest").toBoolean, "!!! TEST IGNORED !!!")
}

который может быть создан, например, так:

it should "not say goodbye" in new IfIgnored  {
  Hello.greeting shouldNot be ("goodbye")
}

Теперь, если мы определим следующие настройки в build.sbt

Test / fork := true,
Test / envVars := Map("runIgnoredTest" -> "false")

и следующие тесты

class HelloSpec extends FlatSpec with Matchers {
  "The Hello object" should "say hello" in {
    Hello.greeting shouldEqual "hello"
  }

  it should "not say goodbye" in new IfIgnored  {
    Hello.greeting shouldNot be ("goodbye")
  }

  it should "not say live long and prosper" in new IfIgnored {
    Hello.greeting shouldNot be ("live long and prosper")
  }
}

затем выполнение sbt test должно вывести

[info] HelloSpec:
[info] The Hello object
[info] - should say hello
[info] - should not say goodbye !!! CANCELED !!!
[info]   scala.Predef.augmentString(java.lang.System.getenv("runIgnoredTest")).toBoolean was false !!! TEST IGNORED !!! (HelloSpec.scala:6)
[info] - should not say live long and prosper !!! CANCELED !!!
[info]   scala.Predef.augmentString(java.lang.System.getenv("runIgnoredTest")).toBoolean was false !!! TEST IGNORED !!! (HelloSpec.scala:6)
[info] Run completed in 2 seconds, 389 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 2, ignored 0, pending 0
[info] All tests passed.

, где мы видим только should say hello бег, а остальные были проигнорированы.

Чтобы выполнить только игнорируемые тесты, мы можем определить следующую пользовательскую команду testOnlyIgnored:

commands += Command.command("testOnlyIgnored") { state =>
  val ignoredTests = List(
    """"should not say goodbye"""",
    """"should not say live long and prosper""""
  ).mkString("-z ", " -z ", "")

  """set Test / envVars := Map("runIgnoredTest" -> "true")""" ::
    s"""testOnly -- $ignoredTests""" :: state
}

Обратите внимание, как мы используем аргумент -z runner для запуска определенных тестов, например,

testOnly -- -z "should not say goodbye" -z "should not say live long and prosper"

Также обратите внимание, как мы вручную добавляем имена тестов в ignoredTests. Теперь выполнение sbt testOnlyIgnored должно вывести

[info] HelloSpec:
[info] The Hello object
[info] - should not say goodbye
[info] - should not say live long and prosper
[info] Run completed in 2 seconds, 298 milliseconds.
[info] Total number of tests run: 2
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.

там, где мы видим, should say hello не был запущен, в то время как все игнорируемые тесты были выполнены.

Если мы откажемся от необходимости запускать игнорируемые тесты отдельно, тогда мы можем использовать предоставленную аннотацию ignore, например,

ignore should "not say goodbye" in {
  Hello.greeting shouldNot be ("goodbye")
}

который на sbt test выводит

[info] HelloSpec:
[info] The Hello object
[info] - should say hello
[info] - should not say goodbye !!! IGNORED !!!
[info] - should not say live long and prosper !!! IGNORED !!!
[info] Run completed in 2 seconds, 750 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 2, pending 0
...