如何使用ScalaTest编写验收测试



ScalaTest有非常好的文档,但是它们很短,并且没有给出示例验收测试。

如何使用ScalaTest为web应用程序编写验收测试?

使用Selenium 2可以获得一些效果。我将Selenium 2 WebDriver与在这里找到的Selenium DSL变体结合使用。

最初,我改变DSL是为了使它更容易从REPL运行(见下文)。然而,构建这样的测试的一个更大的挑战是,它们很快就会失效,然后成为维护的噩梦。

后来,我开始为应用程序中的每个页面创建包装器类,使用方便的操作将要发送到该页的事件映射到底层WebDriver调用。这样,每当底层页面发生更改时,我只需要更改页面包装,而不是更改整个脚本。这样,我的测试脚本现在就可以用单个页面包装器上的调用来表示了,其中每个调用都会返回一个反映UI新状态的页面包装器。看起来效果不错。

我倾向于使用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)
}

ScalaTest现在提供了Selenium DSL:

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

最新更新