Как написать приемочный тест с помощью ScalaTest?

ScalaTest имеет очень хорошую документацию, но она короткая и не содержит примеров приемочного теста.

Как я могу написать приемочный тест, используя ScalaTest для веб-приложения?


person rjc    schedule 13.07.2011    source источник
comment
На странице scalest.org/getting_started_with_feature_spec приведен пример приемочного теста. Что именно вы ищете?   -  person paradigmatic    schedule 13.07.2011


Ответы (2)


Использование Selenium 2 дает вам некоторое преимущество. Я использую Selenium 2 WebDriver в сочетании с найденным вариантом Selenium DSL здесь.

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

Позже я начал создавать класс-оболочку для каждой страницы в приложении с удобными операциями, сопоставляющими событие, которое должно быть отправлено на эту страницу, с базовыми вызовами WebDriver. Таким образом, всякий раз, когда изменяется подчиненная страница, мне просто нужно изменить оболочку моей страницы, а не менять весь сценарий. При этом мои тестовые сценарии теперь выражаются в терминах вызовов отдельных оболочек страниц, где каждый вызов возвращает оболочку страницы, отражающую новое состояние пользовательского интерфейса. Кажется, неплохо получается.

Я обычно строю свои тесты с помощью FirefoxDriver, а затем, прежде чем запускать тест в нашу среду QA, проверяю, дает ли драйвер HtmlUnit сопоставимые результаты. Если это так, то я запускаю тест с помощью драйвера HtmlUnit.

Это была моя оригинальная модификация Selenium DSL:

/**
 * Copied from [[http://comments.gmane.org/gmane.comp.web.lift/44563]], adjusting it to no longer be a trait that you need to mix in,
 * but an object that you can import, to ease scripting.
 *
 * With this object's method imported, you can do things like:
 *
 * {{"#whatever"}}: Select the element with ID "whatever"
 * {{".whatever"}}: Select the element with class "whatever"
 * {{"%//td/em"}}: Select the "em" element inside a "td" tag
 * {{":em"}}: Select the "em" element
 * {{"=whatever"}}: Select the element with the given link text
 */
object SeleniumDsl {

  private def finder(c: Char): String => By = s => c match {
    case '#' => By id s
    case '.' => By className s
    case '$' => By cssSelector s
    case '%' => By xpath s
    case ':' => By name s
    case '=' => By linkText s
    case '~' => By partialLinkText s
    case _ => By tagName c + s
  }

  implicit def str2by(s: String): By = finder(s.charAt(0))(s.substring(1))

  implicit def by2El[T](t: T)(implicit conversion: (T) => By, driver: WebDriver): WebElement = driver / (conversion(t))

  implicit def el2Sel[T <% WebElement](el: T): Select = new Select(el)

  class Searchable(sc: SearchContext) {
    def /[T <% By](b: T): WebElement = sc.findElement(b)

    def /?[T <% By](b: T): Box[WebElement] = tryo(sc.findElement(b))

    def /+[T <% By](b: T): Seq[WebElement] = sc.findElements(b)
  }

  implicit def scDsl[T <% SearchContext](sc: T): Searchable = new Searchable(sc)

}
person Wilfred Springer    schedule 19.08.2011

ScalaTest теперь предлагает Selenium DSL:

http://www.scalest.org/user_guide/using_selenium

person Bill Venners    schedule 07.08.2012