Как программно игнорировать/пропускать тесты с помощью ScalaTest?

Я запускаю некоторые тесты с помощью ScalaTest, которые полагаются на подключения к тестовым серверам. В настоящее время я создал свой собственный Spec, похожий на этот:

abstract class ServerDependingSpec extends FlatSpec with Matchers {
 def serverIsAvailable: Boolean = {
 // Check if the server is available
 }
}

Можно ли игнорировать (но не прерывать) тесты, когда этот метод возвращает false?

В настоящее время я делаю это "хакерским" способом:

"Something" should "do something" in {
 if(serverIsAvailable) {
 // my test code
 }
}

но я хочу что-то вроде

whenServerAvailable "Something" should "do something" in { 
 // test code
}

или

"Something" should "do something" whenServerAvailable { 
 // test code
}

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

Как это сделать?

3 ответа

Для достижения этой цели вы можете использовать Тэги:

Документация о том, как использовать теги: http://www.scalatest.org/user_guide/tagging_your_tests

Добавление и удаление тегов с тегами с параметрами командной строки: http://www.scalatest.org/user_guide/using_the_runner#specifyingTagsToIncludeAndExclude

Пример кода:

import org.scalatest.Tag
object ServerIsAvailable extends Tag("biz.neumann.ServerIsAvailable")
"Something" should "do something" taggedAs(ServerIsAvailable) in { 
 // your test here
}

Выполнение тестов

Запуск тестов - сложная задача. Он работает только для testOnly и testQuick не тестировать. В примере testOnly является short для testOnly *

sbt "testOnly -- -l biz.neumann.ServerAvailable"


Я бы использовал cancel:

"Something" should "do something" in {
 if(!serverIsAvailable) {
 cancel
 }
 // my test code
}

Или упростите его еще с помощью assume:

"Something" should "do something" in {
 assume(serverIsAvailable)
 // my test code
}


Вот несколько трюков, чтобы пропустить тест, основанный на условии:

object WhenServerAvailable extends Tag(if (serverIsAvailable) "" else classOf[Ignore].getName)
"Something" should "do something" taggedAs WhenServerAvailable in { ... }

licensed under cc by-sa 3.0 with attribution.