ScalaTest有非常好的文档,但它们很短,并没有举例说明 验收测试。
如何使用ScalaTest为Web应用程序编写验收测试?
答案 0 :(得分:3)
使用Selenium 2可以获得一些里程。我正在使用Selenium 2 WebDriver与找到的here的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)
}
答案 1 :(得分:2)
ScalaTest现在提供Selenium DSL: