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

Выполнение чего-либо до или после всех тестов Scalatest

У меня есть набор сканированных тестов, которые проверяют разные конечные точки API RESTful. Я действительно хочу, чтобы они были разделены на разные файлы для лучшей организации.

Моя проблема заключается в том, как начать что-то (HTTP-сервер в моем случае, но не имеет значения, что это такое) перед всеми тестами и отключить его после всех тестов.

Я знаю о BeforeAndAfterAll, но это выполняется только до/после внутри одного тестового файла. Мне нужно что-то подобное, но для всех тестов, например:

- запустите HTTP-сервер перед тестированием
- запустить все тестовые комплекты
- закрыть http-сервер

4b9b3361

Ответ 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!") {  }
    }
}