2011-07-13 81 views
4

ScalaTest有非常好的文檔,但他們很短,並沒有給出一個 驗收測試的例子。如何使用ScalaTest編寫驗收測試?

如何使用ScalaTest編寫Web應用程序的驗收測試?

+7

上的網頁http://www.scalatest.org/getting_started_with_feature_spec給出了一個驗收測試的例子。你在找什麼? – paradigmatic

回答

3

使用Selenium 2可以獲得一定的里程數。我將Selenium 2 WebDriver與Selenium DSL的變體here結合使用。

最初,我改變了DSL以便使它從REPL(參見下文)運行起來更容易一些。然而,像這樣構建測試的更大挑戰之一是,它們很快就會失效,然後成爲維護的噩夢。

稍後,我開始爲應用程序中的每個頁面創建一個包裝類,其中便利操作將要發送到該頁面的事件映射到底層的WebDriver調用。這樣,每當下層頁面發生變化時,我只需要更改我的頁面包裝器,而不是更改整個腳本。因此,我的測試腳本現在以單個頁面包裝器上的調用表示,每個調用都返回一個反映UI新狀態的頁面包裝器。似乎工作得很好。

我傾向於使用FirefoxDriver構建我的測試,然後在將測試滾動到我們的QA環境之前,檢查HtmlUnit驅動程序是否提供了可比較的結果。如果這樣,然後我使用HtmlUnit驅動程序運行測試。

這是我原來的修改硒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) 

}