Выполнение чего-либо до или после всех тестов Scalatest
У меня есть набор сканированных тестов, которые проверяют разные конечные точки API RESTful.
Я действительно хочу, чтобы они были разделены на разные файлы для лучшей организации.
Моя проблема заключается в том, как начать что-то (HTTP-сервер в моем случае, но не имеет значения, что это такое) перед всеми тестами и отключить его после всех тестов.
Я знаю о BeforeAndAfterAll, но это выполняется только до/после внутри одного тестового файла. Мне нужно что-то подобное, но для всех тестов, например:
- запустите HTTP-сервер перед тестированием
- запустить все тестовые комплекты
- закрыть http-сервер
Ответы
Ответ 1
Предполагаемый способ сделать это - использовать вложенные пакеты. Suite имеет метод nestedSuites, который возвращает IndexedSeq [Suite] (в 2.0, в 1.9.1 это List [Suite]). Suite также имеет метод runNestedSuites, который отвечает за выполнение любых вложенных наборов. По умолчанию runNestedSuites вызывает nestedSuites, а в каждом возвращенном Suite либо запускается напрямую, либо если дистрибьютор передается, помещает вложенный набор в дистрибутив, чтобы они могли запускаться параллельно.
Итак, что вы действительно хотите сделать, это сделать Foo и Bar в классы и вернуть экземпляры из метода nestedSuites EndpointTests. Там класс, который делает это легко называется Suites. Вот пример его использования:
import org.scalatest._
import matchers.MustMatchers
class Foo extends FunSpec with MustMatchers {
describe("Message here...") {
it("Must do something") { }
it("Must be ok") { }
}
}
class Bar extends FunSpec with MustMatchers {
describe("Hello you...") {
it("One more!") { }
}
}
class EndpointTests extends Suites(new Foo, new Bar) with BeforeAndAfterAll {
override def beforeAll(configMap: Map[String, Any]) {
println("Before!") // start up your web server or whatever
}
override def afterAll(configMap: Map[String, Any]) {
println("After!") // shut down the web server
}
}
Одна из потенциальных проблем заключается в том, что если вы используете обнаружение, чтобы найти объекты для запуска, все три объекта EndpointTests, Foo и Bar будут обнаружены. В ScalaTest 2.0 вы можете аннотировать Foo и Bar с помощью @DoNotDiscover, а ScalaTest Runner не обнаружит их. Но sbt все равно будет. В настоящее время мы улучшаем sbt так, чтобы он проходил через обнаруженные объекты, которые были аннулированы с помощью DoNotDiscover, но это будет в sbt 0.13, которого еще нет. Тем временем вы можете заставить sbt игнорировать их, добавив неиспользуемый параметр конструктора в Foo и Bar.
Ответ 2
В качестве альтернативы вы можете просто использовать объект.
object TestServer {
startServer()
}
При доступе к объекту он будет инициализирован, начиная с сервера.
Просто создайте общую черту в теле, к которой вы обращаетесь к объекту.
Тогда mixin, что характерно для всех ваших тестов. Готово.
Если ваш сервер работает в режиме демона (например, приложение Play! в тестовом режиме), он будет автоматически отключен после выполнения всех тестов.
Ответ 3
Хорошо, нашел способ. Кажется (если кто-то здесь не может меня исправить), что Scalatest не имеет возможности "мастерского" набора. Но... вы можете создать его.
Вы можете составить набор из черт. Поэтому, используя пример моей конечной точки:
class EndpointTests extends FunSpec with MustMatchers with BeforeAndAfterAll
with Foo with Bar {
override def beforeAll(configMap: Map[String, Any]) {
println("Before!") // start up your web server or whatever
}
override def afterAll(configMap: Map[String, Any]) {
println("After!") // shut down the web server
}
}
Хорошо, но как насчет тестов? Обратите внимание на Foo
с помощью Bar
. Я привожу зависимые тесты в качестве признаков.
См. Здесь:
trait Foo extends FunSpec with MustMatchers {
describe("Message here...") {
it("Must do something") { }
it("Must be ok") { }
}
}
trait Bar extends FunSpec with MustMatchers {
describe("Hello you...") {
it("One more!") { }
}
}