天天看點

基于TestNG 與Selenium 的自動化測試設計與實施

1、引言

  2、工具介紹

基于TestNG 與Selenium 的自動化測試設計與實施

圖1

  selenium 系列一共有4款工具

  selenium core:支援dhtml的測試案例(效果類似資料驅動測試),它是selenium ide和selenium rc的引擎。

  selenium ide:firefox的一個插件,支援腳本錄制。

  selenium rc:selenium remote control。

  通過selenium編寫測試case的理想化是先通過selenium ide錄制腳本,通過firebug輔助定位頁面元素,然後通過selenium rc來完善測試腳本。selenium ide是firefox的一個插件,是可以進行腳本錄制以及案例轉換,是以selenium ide+firebug會成為你日後寫測試案例的兩大助手,但遺憾的是上述兩個工具都依賴firefox浏覽器,如果你的程式不支援firefox浏覽器,就隻能通過手工編碼來完成自動化測試腳本,對于初學者來講,如果沒有這兩個工具的輔助,在編寫測試腳本時還是比較困難的,但熟悉了selenium api和掌握了頁面元素查找的方法以後,這兩個工具就顯得沒那麼重要了。

 testng,單元測試工具典型代表,可能大部分開發人員隻對junit比較熟悉,junit是 java 語言單元測試目前的一站式解決方案。這個架構值得稱贊,因為它把測試驅動的開發思想介紹給 java開發人員并教給他們如何有效地編寫單元測試。但是,在過去的幾年中,junit的改進不大;是以,為當今複雜的環境編寫測試已經變成一個越來越困難的任務,即 junit必須與其他一些補充性測試架構內建起來。而 testng是一個測試 java應用程式的新架構。我選擇testng是因為它是一種基于注釋的測試架構,通過添加諸如靈活的裝置、測試分類、參數測試和依賴方法等特性來克服junit的一些不足之處。此外,testng運作于java 5.0(通過注釋)和java 1.4(通過javadoc樣式的注釋)之上。我來列舉一下ng的優勢:

基于TestNG 與Selenium 的自動化測試設計與實施

  關鍵字:參數化。testng将資料驅動的自動化測試的概念诠釋的淋漓盡緻,我舉個例子,一個被測試方法根據不同的入參組合出20個case,根據資料驅動測試的思想,我們隻需要寫一個測試方法,然後準備20種參數組合的資料。如果使用junit你可能需要寫20個測試方法,而testng通過注釋就可以實作參數化。将20種不同的入參組合整理到一個excel檔案中管理,檔案裡可以增加用例描述甚至測試方案等相關資訊,如果增加新case,隻需要增加一行測試資料即可,如圖:

基于TestNG 與Selenium 的自動化測試設計與實施

  測試方法隻需要寫一個,如圖所示:

基于TestNG 與Selenium 的自動化測試設計與實施

  關鍵字:失敗和重運作,在大型測試套件中,這種重新運作失敗測試的能力顯得尤為友善。這是 testng獨有的一個特性。在 junit 4中,如果測試套件包括 1000項測試,其中 3項失敗,很可能就會迫使您重新運作整個測試套件(修改錯誤以後)。不用說,這樣的工作可能會耗費幾個小時。一旦 testng中出現失敗,它就會建立一個 xml配置檔案(如圖4),對失敗的測試加以說明。如果利用這個檔案執行 testng運作程式,testng就隻運作失敗的測試。是以,1000項測試有3項 failed,這種場景你隻需重新運作三個失敗的測試腳本,而不是整個測試套件。

  這裡隻列舉了testng比較明顯的優勢,除了上述優勢以外還有很多,這裡就不詳細闡述。

基于TestNG 與Selenium 的自動化測試設計與實施

圖4

 dbunit,它通過有效地管理測試場景中的資料簡化了使用資料庫的工作。其設計理念就是在測試之前,備份資料庫,然後給對象資料庫植入我們需要的準備資料,最後,在測試完畢後,讀入備份資料庫,回溯到測試前的狀态,通過dbunit還可以輔助資料持久層的測試工作,如驗證一個實體通過被測試程式(dao)進行持久化的操作是否正确,驗證資料實體是否按照預期寫入資料庫,并且提供了将資料從資料庫與xml檔案存儲中互相轉換的功能。

基于TestNG 與Selenium 的自動化測試設計與實施

  上圖是從客戶表中導出的一條資料,如果測試過程中需要這條資料,那可以通過dbunit将此條資料初始化到資料庫中。

  還有一種情況,如果是新增一個客戶,那這個檔案裡的資料可以用來做斷言預期的依據,dbunit可以将xml轉換為dataset甚至 javabean,你可以直接通過資料集進行比較而不是每個字段都要比較一次。

基于TestNG 與Selenium 的自動化測試設計與實施

  不過dbunit也有自己的缺陷,如上圖所示,當通過dbunit與資料庫互動時需要檢查表的主鍵,如果某張表沒有設定主鍵就沒有辦法使用dbunit的api,隻能通過其它方式實作。

  fitnesse,業務驅動測試的工具代表,fit是一種通用的開放架構,将測試人員編寫的測試方法轉換成表格的形式展現給客戶,常用于自動化驗收測試,在頁面上以表格形式記錄測試用例輸入、預期輸出内容,自動運作并顯示測試執行結果。但是增加了開發人員一些工作量,要想讓fit與你的軟體通信,需要自己編寫fit fixture來實作業務與程式邏輯的轉換。

基于TestNG 與Selenium 的自動化測試設計與實施

  3、自動化測試實施過程

  通過上面幾種工具的組合,靈活使用,就可以搭建出一套适合自己的自動化測試平台。

  下面我來介紹一下,這些工具在不同測試場景下的使用情況:

  1)接口測試

  (testng+dbunit)接口自動化測試可以通過單元測試來完成,利用testng對每一個接口編寫單元測試代碼,通過dbunit初始化資料庫,将一個或多個測試并被定義為<suite>标簽,批量執行測試代碼并生成測試報告。

基于TestNG 與Selenium 的自動化測試設計與實施

  2)webservice接口自動化測試

  目前大多數網際網路公司都采用soa架構,是以對于webservice接口類型的測試顯得更加重要。通常測試工程師可能會借助soapui等工具進行web service的測試,不可否認soapui在進行單一webservice接口測試中具有非常好的效果,但是在接口組合測試,以及在測試結果需要進行資料庫校驗的情況下就顯得不是那麼的自動化,總是需要人工幹預,這在一定程度上導緻測試效率偏低,是以我們在這裡介紹如何使用fitnesse這塊開源産品實作接口測試自動化(未完待有時間補充)

  3)web應用系統的自動化(selenium +  testng + dbunit)

  testng 尤其适合與selenium結合使用,可以實作其他測試架構無法實作的測試,例如使用依賴項進行測試,重新運作失敗了的測試,以及使用單獨檔案中定義的參數進行參數化測試。所有這些特性結合在一起,使它在衆多 web應用程式測試架構中脫穎而出。

  在測試自動化中,測試代碼不僅僅包含測試邏輯,還包含許多其他的代碼,比如url拼接、html/xml解析、通路ui控件,等等。若把測試邏輯與這些無關的代碼混在一起,測試邏輯将很難了解,也不容易維護。而采用分層結構可以解決這一問題。在分層的測試架構中,其三層結構為:

基于TestNG 與Selenium 的自動化測試設計與實施

  (1)資料層,包含ui資料和測試資料;ui資料是指在頁面中需要輸入的資料,如,普通客戶新裝,你需要在頁面裡輸入三戶資訊,包括訂購的産品及資源資料。這些通過頁面注入的資料我們統稱為ui資料,需要在執行測試前提前整理到excel中,如圖所示:

基于TestNG 與Selenium 的自動化測試設計與實施

  實作起來比較容易,使用testng注釋功能,就可以将這些資料作為頁面的輸入。而測試資料是指資料庫中基礎資料,這些資料是用來支撐整個系統運作的,比如操作員及組織權限,新裝訂購的套餐,套餐與産品的關系資料等等,沒有這些資料,系統就沒有辦法正常運作,是以執行測試腳本之前要對這些基礎資料進行初始化;還有一種情況當執行完一次測試腳本時産生的新資料會影響測試腳本的二次運作,這意味着運作任何測試之前,都希望資料庫具有一組幹淨的資料,使用 dbunit 的 clean_insert 指令確定在先前運作的測試中建立的行被删除掉,是以我可以重新運作測試,該測試可以不斷建立資料并且不用考慮資料庫限制。将測試資料提前整理到xml檔案,也可以從資料庫直接導出到xml檔案裡,如圖所示:

基于TestNG 與Selenium 的自動化測試設計與實施

  在執行測試腳本前,通過dbunit将這些檔案裡的資料提前初始到資料庫裡,這樣一來資料庫就是程式所期望的樣子。

  (2)測試用例層,包含業務邏輯和控制邏輯。驅動程式webdriver(selenium2.0)負責ui資料的載入,在頁面回放時将ui資料輸入到頁面中。前台頁面回放完成後,資料進入持久階段,這時需要比對背景業務處理邏輯,比如客戶資料是否正确寫入資料庫,産品訂購是否正确。由于輸入的不同,場景的不同,業務邏輯比對也會不同,是以這塊腳本的編寫是整個環節中比較重要的部分。為了能夠區分這些分支,需要将整個新裝流程拆分多個子產品進行管理,使用testng将測試用例分組,形成多個test suite進行控制。

  (3)待測系統層,與測試端完全分離,被測系統隻需要提供url通過http協定就可以被測試腳本調用執行。

  4、自動化測試的持續內建

  持續內建是一種軟體開發實踐,對于提高軟體開發效率并保障軟體開發品質提供了理論基礎,持續內建保障了每個時間點上團隊成員送出的代碼是能成功內建的。換言之,任何時間點都能第一時間發現軟體的內建問題,也能盡快将測試腳本投入生産使用。

  通過svn統一代碼管理,在ant或maven腳本增加測試元件配置,當例行編譯結束後即可以使用hudson定時啟動測試腳本的運作工作。運作結束後傳回測試報告給測試人員。整個疊代周期如下圖所示:

基于TestNG 與Selenium 的自動化測試設計與實施

  5、結語

  軟體自動化測試彌補了手工測試時重複勞動的缺陷,而且能在軟體開發過程中盡早發現缺陷,是以實施自動化測試是非常有必要的。本文中介紹了幾種自動化測試工具,通過不同的工具組合成适用自己的自動化測試架構,不僅使自動化測試在産品測試中發揮其獨特的作用,而且還節約了資源成本,包括測試工具購買的成本以及人力資源成本等。

====================================分割線================================

最新内容請見作者的github頁:http://qaseven.github.io/