使用 Selenium 實現基於 Web 的自動化測試

(轉自http://www.ibm.com/developerworks/cn/web/1209_caimin_seleniumweb/index.html)html

Selenium 是一個用於 Web 應用程序測試的工具。Selenium 的測試用例直接運行在瀏覽器中,就像真正的用戶在操做同樣。與主流的 web 自動化測試框架還有 QTP,基於 Ruby 的 WATIR 等相比,Selenium 支持 IE、Mozilla Firefox 多種瀏覽器,支持自動錄製腳本以及 Java、c#、ruby 等多種運行語言的自動生成,用例製做快捷,運行快速。相比起來 Selenium 要顯得更爲靈活實用。java

Selenium 的主要功能包括:web

1)測試與瀏覽器的兼容性:測試應用程序可否兼容工做在不一樣瀏覽器和操做系統之上。chrome

2)測試系統功能:錄製用例自動生成測試腳本,用於迴歸功能測試或者系統用例說明。express

簡而言之,Selenium 就是一款能夠錄製用戶操做,幫助 Web 測試人員簡化重複勞動的工具。apache

目前爲止 Selenium 有兩種版本:編程

  • Selenium 1(Selenium RC,Remote Control):傳統 Selenium 框架,支持多種編程語言腳本生成。但須要啓動一個代理 Server 來處理用戶與測試 Server 之間的通信。
  • Selenium 2(Selenium Webdriver):全新自動化接口,突破了 Selenium 1 的一些限制,剔除了中間 Server,但因爲寫這篇文章爲止自動生成腳本工具對 Selenium 2 的支持還很差,適合熟悉 Selenium API 的手寫 case 測試人員使用。

閱讀本文讀者能夠學習到如下技能:c#

  • 瞭解 Selenium 自動化測試框架的基本概念。
  • 學會搭建應用 Selenium 自動化測試框架的環境。
  • 搭建一個自集成的測試容器以持續測試 Selenium 測試用例。

本文着重介紹傳統 Selenium 1 的原理及使用方法。接下來讓咱們看看 Selenium 是如何調用錄製腳本並實現自動測試的。瀏覽器

Selenium 1 實現原理

Selenium 引入了 Remote Control Server 這樣一個代理 Server,JavaScript 腳本注入和與 Server 通信都經過這個代理 Server 來進行。以下圖所示:ruby

圖 1. Remote Control 模式運行流程
圖 1. Remote Control 模式運行流程

之因此引入這個代理 Remote Control Server 是由於「同源策略」的限制,經過這個代理服務器來「欺騙」遠程 Server,達到使其覺得是從同一個地方 load 代碼以正確返回請求數據的效果。

流程說明:

  1. 客戶端創建與 selenium-RC server 的鏈接。
  2. Selenium RC Server 啓動一個瀏覽器(或是已經使用中),並注入 JS 代碼
  3. 將 Selenese 代碼傳到客戶端的 Selenium-Core 中。
  4. Selenium-Core 翻譯並解析執行用戶錄製的操做。
  5. 讓代理 Server 進行通信
  6. Remote Control Server 負責跟遠程 Web 應用服務器進行通信。
  7. 操做完成,顯示結果,並執行下一指令。

以上就是 Selenium Remote Control 的執行原理,接下來的章節中將一步步以圖例加說明的方式快速說明如何使用 Selenium 來錄製腳本,導入 Java 工程,而後按期維護工程。


使用 Selenium 實現自動化測試

使用 Selenium IDE 錄製用戶操做

Selenium IDE 是一個基於 Firefox 的插件,用戶能夠在經過這個插件將客戶端操做錄製成腳本並導出爲 Java、c#、Ruby 等多種運行語言以便統一管理測試用例。

下載 FireFox: 推薦 Firefox 5.0 以上,目前 Selenium IDE 只提供 Firefox 的插件。

下載 Selenium IDE:http://seleniumhq.org/download/

安裝插件:

Tools --> Add-ons --> 將下載的 selenium-ide-1.x.xpi 文件拖入對話框便可安裝。

安裝後能夠啓動 IDE 插件查看是否安裝成功。

圖 2. 啓動 Selenium IDE 插件
圖 2. 啓動 Selenium IDE 插件

安裝後,以 IBM Systems Director 產品爲例,說明如何實現「用戶登陸」這個測試用例。

  1. 點擊錄製按鈕 以下圖 3 中的 1
  2. 錄製過程當中,登陸用戶界面,輸入用戶名密碼。以下圖 4
  3. 而後能夠經過是否包含某些字符串來驗證是否登陸成功。若是下圖 5
  4. 回到登陸 IDE 界面,查看已錄製步驟 如圖 3 中的 2
  5. 在 IDE 界面中能夠驗證錄製的腳本,必要時回到第四步,如圖 3 中的 3

在 IDE 中重運行錄製的腳本經過就說明腳本沒問題,能夠用於測試用例代碼導出了。

圖 3. Selenium IDE 錄製窗口
圖 3. Selenium IDE 錄製窗口
圖 4. 錄製過程當中,輸入用戶名密碼
圖 4. 錄製過程當中,輸入用戶名密碼
圖 5. 經過確認是否包含某些文字來驗證是否成功登陸
圖 5. 經過確認是否包含某些文字來驗證是否成功登陸

使用 Selenium IDE 導出 JUnit 測試用例

在 Selenium IDE 中執行成功後,就能夠把測試腳本導出成 JUnit 測試用例了,如圖 6 所示:

圖 6. 導出 JUnit 代碼
圖 6. 導出 JUnit 代碼

導出用例以下:

清單 1. VerifyLogin.java
 import com.thoughtworks.selenium.*; 
 import org.junit.After; 
 import org.junit.Before; 
 import org.junit.Test; 

 public class VerifyLogin extends SeleneseTestCase { 
 @Before 
 public void setUp() throws Exception { 
     selenium = new DefaultSelenium("localhost", 4444, "*chrome", "localhost:8422/"); 
     selenium.start(); 
 } 

 @Test 
 public void testVerifyDirectorLogin() throws Exception { 
     selenium.setTimeout("300000"); 
     selenium.open("/ibm/console/logon.jsp"); 
     selenium.type("id=j_username", "test"); 
     selenium.type("id=j_password", "test"); 
     selenium.click("id=other"); 
     selenium.waitForPageToLoad("300000"); 
     verifyTrue(selenium.isTextPresent("IBM Systems Director")); 
 } 

 @After 
 public void tearDown() throws Exception { 
    selenium.stop(); 
   } 
 }

說明:首先實例化一個 DefaultSelenium 對象,傳入的參數分別是 RC 服務器 IP、端口、瀏覽器類型和待測試的 Server 的信息。而後在測試方法裏調用 Selenium 1 的 API,這裏的代碼徹底由 IDE 生成,就爲咱們省去了不少重複代碼工做。

運行測試用例:

有了基於 JUnit 的運行測試用例就能夠把它導入到 Java IDE 中執行測試了。執行中既須要客戶端驅動支持(用於 Eclipse 編譯),也須要啓動 RC Server:

Selenium RC Server 下載:http://seleniumhq.org/download/

Selenium Client Driver:http://seleniumhq.org/download/

執行命令 java –jar selenium-server-standalone-2.5.0.jar 啓動 Selenium RC Server:

圖 7. 啓動 Selenium RC Server
圖 7. 啓動 Selenium RC Server

啓動後就能夠直接在 Eclipse 中運行測試用例,RC Server 就會啓動新窗口並自動按照錄制腳本進行測試。並可在 Eclipse 中查看運行結果。

下面讓咱們看看怎樣脫離 Eclipse 本身搭建一個能夠持續測試的容器。

構建 JUnit 測試容器以持續測試 Selenium 的測試用例

咱們搭建的這個容器能夠檢測某個文件夾裏全部的測試用例自動運行 JUnit 代碼進行測試。若是須要還能夠將這個容器合併到持續集成環境裏,以達到不間斷持續功能性測試的需求。

在這裏咱們會用到 Ant 工具。能夠在這裏下載:

Ant 下載:http://ant.apache.org/

基礎架構

圖 8. 基於 Selenium 的 JUnit 的測試容器架構圖
圖 8. 基於 Selenium 的 JUnit 的測試容器架構圖

能夠看見測試人員的工做如紫色箭頭所示,而自動化工做如藍色箭頭所示。

這套框架的意義在於,它能自動識別測試用例,並讀取配置文件以測試套件運行不一樣的測試用例。它還能夠被合併到項目持續集成軟件中,按期地持續進行基於 Web 的功能性測試,並將報告以郵件形式通知管理人員。

說明:

  1. 由測試人員錄製腳本並導出 JUnit。
  2. 測試人員修改配置文件,將測試用例包含在測試套件中。
  3. 合併在持續集成軟件後,框架會按期檢測配置的測試套件
  4. 逐個加載測試用例。
  5. 以測試套件爲單位其執行全部測試用例。
  6. 執行完成後將測試套件的結果報告以郵件形式通知管理人員

實現這套框架最關鍵的當屬 Ant 執行腳本了,也是程序執行的入口。這裏列出 Ant 的運行腳本,以供讀者參考:

清單 2. Build.xml
如下爲部分重點內容,會在後面加以說明。完整的 build.xml 請查看附件。
 <?xml version="1.0" encoding="UTF-8"?> 
 <project name="automationtesting" default="run" basedir="."> 
 ……
 <!-- 調用 Junit task 運行測試用例-->
 <mkdir dir="${xml}/${var}" /> 
 <junit printsummary="yes"> 
 <classpath> 
 <fileset dir="${lib}"> 
 <include name="**/*.jar" /> 
 </fileset> 
 <pathelement path="${classpath}" /> 
 </classpath> 
 <batchtest todir="${xml}/${var}"> 
 <filelist refid="casesToBeRunning"></filelist> 
 <formatter type="xml" /> 
 </batchtest> 
 </junit> 
……
 <!-- 調用 Junitreport task 生成報表-->
 <junitreport todir="${reports}"> 
 <fileset dir="${xml}/${var}"> 
 <include name="TEST-*.xml" /> 
 </fileset> 
 <report id="${var}_Report" format="noframes" todir="${reports}/html"> 
 <param name="TITLE" expression="Automation Testing Results for ${var}" /> 
 </report> 
 </junitreport> 
……

 <!-- 調用 mail task 發送郵件-->
 <mail mailhost="xx.xx.xx.xx" subject="${reportResult} Result for TestSuite: ${var}"> 
 <from address="AutomationTestTool" /> 
 <to address="xxxx@cn.ibm.com" /> 
 <message mimetype="text/html" src="${reports}\html\Testsuite-report-${var}.html"> 
 </message> 
 <fileset dir="${reports}\html"> 
 <include name="Testsuite-report-${var}.html" /> 
 <include name="Testcase-reports-${var}.zip" /> 
 </fileset> 
 </mail> 
 </project>

說明:程序的入口是 Run task,在 Run task 裏先是編譯整個工程,而後讀取 TestSuites.xml 配置文件,循環執行每個測試套件。過程當中,以此執行如下操做:

  • 讀取配置的而且實現 TestCase 的 Java 類;
  • 調用 Ant 的 junit task 執行測試用例;
  • 調用 Ant 的 junitreport task 生成報表;
  • 調用 Ant 的 mail task 發送報表到指定郵箱。
清單 3. TestSuites.xml 配置文件樣例
 <TestSuites> 
 <TestSuite enable="false" id="DiscoverTestSuite"> 
 <Testcase>VerifyLogin</Testcase> 
 <Testcase>DiscoverDevice</Testcase> 
 </TestSuite> 
 <TestSuite enable="true" id="DeleteDeviceTestSuite"> 
 <Testcase>VerifyLogin</Testcase> 
 <Testcase>DeleteDevice</Testcase> 
 </TestSuite> 
 </TestSuites>

說明:配置文件中定義了兩個測試套件,第一個包含了 2 個測試用例,先 Login 再發現設備。第二個也包含了 2 個測試用例,先 Login 再刪除設備。而第一個測試套件 enable=false 將不被執行。

到此爲止,一個簡單的可持續測試框架就已經搭建完畢,來運行下看看結果吧

運行測試組建

用 ant 命令執行 Build.xml 便可運行測試框架。

圖 9. 工具運行時
圖 9. 工具運行時

執行完成後就會將全部測試用例的結果以報告形式發送郵件到指定郵箱。

圖 10. 報告式樣
圖 10. 報告式樣

結束語

本文首先介紹了 Selenium 以及 Selenium 1 的實現原理。緊接着用一個 Login 的簡單例子講述瞭如何去搭建 Selenium 運行環境,並將其導出爲 JUnit 代碼。最後構建了一個基於 Ant 的自動化測試 Selenium 框架,持續地對生成的 JUnit 測試用例進行管理以及功能性測試。讀者也能夠借鑑該腳本搭建本身的輕量級的單元測試框架。

目前主流的 web 自動化測試框架還有 QTP,基於 Ruby 的 WATIR。與這些框架相比,Selenium 支持 IE、Mozilla Firefox 等多種瀏覽器,同時支持自動錄製腳本以及 Java、C#、Ruby 等多種運行語言的自動生成,測試用例製做快捷,運行也比較快速。對於較爲輕量級相比起來 Selenium 要顯得更爲靈活實用。Selenium 不只用於功能性測試及迴歸測試,同時也可用於 Web 可視化驗收測試。更多的,Selenium 可集成在諸如 Cruise 持續集成軟件中,爲總體項目提供更大集成測試範圍。

相關文章
相關標籤/搜索