您的位置:軟件測試 > 開源軟件測試 > 開源功能測試工具 > Selenium
使用Selenium測試時必需知道的7件事
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時間:[ 2015/11/20 14:16:48 ] 推薦標簽:單元測試工具 Selenium

  Selenium是一套用于進行瀏覽器自動化測試的開源工具集,可進行Web應(yīng)用的端到端測試。Selenium主要包括兩個工具:一是Selenium IDE,這是一個在Firefox上運行的插件,可對用戶的行為進行錄制與回放,還可以將錄制的內(nèi)容生成代碼后在Selenium Remote Control上運行。二是本文的重點Selenium WebDriver(簡稱WebDriver),這是一個開源的項目,能夠讓用戶編寫在各種主流瀏覽器上運行的互操作代碼。目前已經(jīng)推出了支持C#、Java等語言的類庫。W3C的WebDriver規(guī)范也正是在這個開源項目的基礎(chǔ)上發(fā)展起來的。
  WebDriver可謂QA工程師進行UI測試強大的利器,它提供了豐富的API以實現(xiàn)訪問DOM、運行JavaScript、模擬鍵盤輸入等操作。利用WebDriver進行編程可實現(xiàn)UI測試的完全自動化,為回歸測試、乃至持續(xù)集成流程提供了極大的便利性。盡管如此,但使用WebDriver編寫測試需要投入大量的時間,并且由于瀏覽器行為的多樣性,以及UI的易變性,需要進行大量的代碼維護工作。與應(yīng)用程序的代碼一樣,編寫測試代碼同樣需要遵循良好的代碼規(guī)范與設(shè)計,糟糕的代碼結(jié)構(gòu)會很快使得測試代碼的維護變成一個無底洞,終被團隊無奈地拋棄。
  在今年的OpenWest 2015大會上,來自Lucidchart的Jared Yarn進行了一場關(guān)于Selenium WebDriver測試方面的演講,并隨后撰文總結(jié)了演講的內(nèi)容。他首先談起了所在的團隊在使用WebDriver時所遇到的困境,當時他們維護著由大約40個不同開發(fā)者編寫的300多個測試用例(該團隊沒有專職的測試人員,測試代碼全部由開發(fā)者編寫),每天的運行都會產(chǎn)生70個左右的錯誤,這一情況在分配了專門的維護人員之后也沒有多少改善。為了徹底改進測試集的可靠性、可伸縮性以及可維護性,Yarn與整個團隊一起對整個測試代碼結(jié)構(gòu)進行了重構(gòu)。經(jīng)過重構(gòu)后,誤判的失敗率降到了1%以下,并且編寫測試的時間也大大縮短了。
  Yarn將這次重構(gòu)的成功歸結(jié)為以下七點。
  創(chuàng)建Application User對象
  團隊首先要解決的問題是編寫測試所需投入的精力過大,為了克服這一點,他們設(shè)計了一些實體對象。首先創(chuàng)建的是一種Application User對象,它代表了網(wǎng)站的后端功能,并且通過一些輔助方法提供了準備測試場景、或是在測試完成前進行teardown(清理)工作的功能。以下是使用這種對象的一個示例:
  class EditorPerformanceTest extends LucidSpec {
  val user = new ChartUser
  override def beforeAll() {
  user.login()
  user.createDocument()
  }
  …
  override def afterAll() {
  user.finished()
  }
  通過這種對象的應(yīng)用,所有的準備工作被簡化成兩個方法調(diào)用(login與createDocument),而teardown中的邏輯則由finished方法實現(xiàn),因此開發(fā)者可以專注于具體的測試邏輯,將精力集中在bug修復或特性的檢測。
  創(chuàng)建Application Driver對象
  WebDriver的API非常豐富,單是定位某個UI元素有不下20種做法,這種巨大的靈活性也令人望而生畏。有數(shù)之不盡的方式可以完成拖放、單擊、滾動以及輸入等操作。為了簡化這一點,Yarn的團隊設(shè)計了一種Application Driver類,以簡化一些常見的操作。它首先繼承自WebDriver類,并引用了Selenium中的Actions類,隨后加入了一些方法用于實現(xiàn)常見的用戶操作,例如單擊元素與執(zhí)行腳本等等。可以通過下面這個UML圖概括這個類的設(shè)計。

  其使用方法如下:
  def dragAndDrop(cssFrom: String, cssTo: String) {
  val elem1 = getElementByCss(cssFrom)
  val elem2 = getElementByCss(cssTo)
  actions.dragAndDrop(elem1, elem2)
  }
  def contextClickByCss(css: String)
  actions.contextClick(getElementByCss(css))
  }
  通過ID訪問DOM對象
  在WebDriver測試過程中,如何定位一個DOM元素是有挑戰(zhàn)性的任務(wù)之一。常見的方式包括XPath、CSS路徑以及各種復雜的CSS選擇器(類似于jQuery),但這些方式在元素移動了位置或改變了CSS類名之后會失效,不得不重新修改代碼。因此,Yarn建議使用DOM元素的ID進行定位,這種方式的好處是不受元素所在位置、以及所應(yīng)用的樣式的影響。Yarn的團隊隨后對產(chǎn)品的某一重要特性進行了UI改版,而由于頁面中的ID保持不變,因此測試代碼的改動非常之少。
  頁面對象模式
  頁面對象模式(Page Object Pattern)是測試代碼可維護性的關(guān)鍵因素,這一模式本身非常簡單,它表示每個頁面應(yīng)了解如何執(zhí)行該頁面當中的所有操作。舉例來說,登錄頁面知道應(yīng)當如何提交用戶的認證信息、如何點擊“忘記密碼鏈接”等等操作。如果將這些功能轉(zhuǎn)移到一個公用的地方,可以在所有測試中重用這部分功能。以下代碼表示了一個文檔頁面的功能:
  object DocsList extends RetryHelper with MainMenu with Page {
  val actionsPanel = new ActionsPanel
  val fileBrowser = new FileBrowser
  val fileTree = new FileTree
  val sharingPanel = new SharingPanel
  val invitationPanel = new InvitationPanel
  這個頁面中的操作非常多,因此Yarn將其分解為多個較小的類,每個類都代表了頁面中某個塊的功能。它們各自包含在這一區(qū)域內(nèi)可執(zhí)行的操作的相關(guān)方法,正如以下代碼所示:
  def clickCreateDocument(implicit user: LucidUser) {
  doWithRetry() {
  user.clickElement("new-document-button")
  }
  }
  def selectDocument(fileNum: Int=0)(implicit user: LucidUser) {
  doWithRetry() {
  user.driver.getElements(docIconCss)(fileNum).click()
  }
  }
  def numberOfDocsEquals(numberOfDocs: Int)(implicit user: LucidUser) : Boolean ={
  predicateWithRetry(WebUser.longWaitTime *5, WebUser.waitTime) {
  numberOfDocuments == numberOfDocs
  }
  }

上一頁12下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd