Как создать тестовое оборудование для каждого примера функционального теста - PullRequest
0 голосов
/ 06 января 2019

Scala Noob здесь.

В настоящее время я пытаюсь создать функциональные тесты для веб-приложения на основе Play (Scala), используя specs2. Сами примеры просты, т.е.

class SignInSpec extends PlaySpecification {

  // bring the workflow steps in scope and instrument browser with them    
  import utils.WorkflowSteps.AuthSteps

  "An activated user".should {
    "be able to sign in to the admin console" in new WithDbData(webDriver = WebDriverFactory(FIREFOX)) {

      // this should be: browser.signIn(testData.manager)
      // with the manager already persisted in the database
      browser.signIn(Manager(None, "me@home.com", "12341234", "John", "Doe", List("admin")))
    }
  }
}

Чего я хотел бы добиться, так это снабдить каждый пример определенным набором тестовых данных, некоторые из которых уже будут сохранены в базе данных. Поэтому мне нужен метод настройки и метод разбора каждого примера, который подготавливает класс TestData, заполняет его соответствующими данными и сохраняет некоторые из них, чтобы пример мог начинаться с определенного состояния базы данных. В конечном итоге мне нужен механизм плагинов, в котором плагины определяли тестовые данные для набора примеров (воспринимайте это как применение схемы кредитования).

Что я сделал до сих пор:

  • Я пытался использовать некоторую разновидность Around, но я не знаю, как передать данные в пример, так как мне пришлось бы добавить дополнительное возвращаемое значение.
  • Я пробовал контекст ForEach в specs2, но это конфликтует с WithBrowser Play
  • Я играл с неявными значениями vals, но опять же я не знаю, как добавить неявный параметр в блок, который преобразуется из конструктора в параметр вызова функции, используя DelayedInit

Есть идеи, как поступить, чтобы достичь следующего?

  • Расширение спецификации или примера из дополнительной характеристики или класса, который вызывает пример с одним параметром TestData
  • Эта дополнительная черта или класс должны быть в состоянии подготовить тестовые данные и сохранить их части
  • Эта дополнительная черта или класс должны быть совместимы с WithBrowser

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Одним из решений может быть следующее:

 case class TestData(manager: Manager) extends WithDbData(webDriver = WebDriverFactory(FIREFOX))


 class SignInSpec extends PlaySpecification with ForEach[TestData] {

   // bring the workflow steps in scope and instrument browser with them    
   import utils.WorkflowSteps.AuthSteps

   "An activated user".should {
     "be able to sign in to the admin console" in { data: TestData =>
        import data._

        browser.signIn(manager)
     }
   }

   def foreach[R : AsResult](f: TestData => R): Result = ???
 }

Это за счет необходимости import data._, но это также позволяет избежать двойного вложения предыдущего решения.

0 голосов
/ 06 января 2019

Один из подходов - использование так называемых «кредитных инструментов»:

     def withTestData(test: TestData => Unit) = {
       val data = setupTestData() 
       try { 
         test(data)
       } finally {
         destroyTestData(data)
       }
     }



    "An activated user" should "be able to sign in to the admin console" in withTestData { data =>
       new WithDbData(webDriver = WebDriverFactory(FIREFOX)) {
         browser.signIn(data.manager)
       }
     }

и т. Д.

...