QTP VS Seleniumjavascript
下面我想先稍微討論一下這兩個工具,我主要從功能和文檔資料這兩方面對比QTP和Selenium。html
功能java
從Web測試的角度,兩個工具都能知足正常的測試需求,這個你無需懷疑!但QTP更強大些,由於:python
1.它是商業軟件,只要你有錢,什麼均可以有。linux
2.它支持對操做Windows窗口,當你要從Web上下載一些東西,天然此時就會彈出一個「下載框」,因爲那個框框是Windows窗口,Selenium是處理不了的,因此必須經過第三方的腳本處理。web
文檔和參考資料資料ajax
若是你這方面的新手,當你用QTP/Selenium時,相信書和文檔是你第同樣會找的東西。在這樣面,QTP使用在中國使用仍是蠻普遍的,資料和書籍也至關豐富,而Selenium的資料就相對比較少一些,找資料最好的地方就是官方論壇。apache
爲何用Selenium編程
既然上面兩項都是QTP優勝一些,爲何咱們仍是用Selenium,由於:跨域
1.Selenium使用靈活,簡單,寫出的測試案例很是簡潔,優美,也易於維護。
2.Selenium RC支持用多種語言編寫測試案例,你能夠用VS2008寫測試案例了: >。
3.若是你有一個測試平臺,你會發現把QTP整合到平臺是很麻煩的事情。
4.......
若是以上Selenium的優勢不能打動你,又或者你是測試新手,對測試經驗很少,對編程也不熟悉,那麼你仍是繼續使用QTP吧,不過相信有一天,你會開始嘗試Selenium的。
Selenium名字的來源
在這裏,我還想說一下關於Selenium名字的來源,頗有意思的: >:Selenium的中文名爲「硒」,是一種化學元素的名字,它對汞 (Mercury)有自然的解毒做用,實驗代表汞暴露水平越高,硒對汞毒性的拮抗做用越明顯,因此說硒是汞的剋星。你們應該知道Mercury測試工具系 列吧(QTP,QC,LR,WR...),他們功能強大,但卻價格不菲,你們對此又愛又恨!故thoughtworks特地把他們的Web開源測試工具命 名爲Selenium,以此幫助你們脫離汞毒。
Selenium 簡介
一.Selenium 是什麼?
Selenium是ThroughtWorks公司一個強大的開源Web功能測試工具系列,本系列如今主要包括如下4款:
1.Selenium Core:支持DHTML的測試案例(效果相似數據驅動測試),它是Selenium IDE和Selenium RC的引擎。
2.Selenium IDE:FireFox的一個插件,支持腳本錄製。(只支持selenium語言)
3.Selenium RC:Selenium Remote Control。(支持不少語言,如:C#,Java,Python,Ruby 等)後續的系列文章我會主要針對Selenium RC展開介紹。
4.Selenium Grid:容許同時並行地、在不一樣的環境上運行多個測試任務,極大地加快Web應用的功能測試。
二.選擇合適的Selenium工具
既然Selenium工具備4款這麼多,那到底如何選擇呢??我從"Selenium官網"這裏找了一個表:
Selenium IDE | Selenium Remote Control | Selenium Core | Selenium Core HTA | |
瀏覽器支持 | 僅Firefox | 不少 | 全部 | 僅IE |
須要遠程安裝 | 否 | 否 | 是 | 否 |
支持 HTTPS/SSL | 是 | 是* | 是 | 是 |
支持跨域 | 是 | 是* | 否 | 是 |
須要Java | 否 | 是 | 否 | 否 |
將測試結果保存到磁盤 | 是 | 是 | 否 | 是 |
多語言支持 | 僅Selenese | 不少 | 僅Selenese | 僅Selenese |
這裏沒有介紹Selenium Grid,但介紹了另一個Selenium Core HTA,Selenium Core HTA實際上是Selenium Core的額外模式,你只要Selenium Core配置稍加修改,即爲HTA模式,Selenium Core HTA能夠在IE最高安全等級(特權)下工做,這意味着它僅能在IE下工做,因爲限制較大,下面將排除對Selenium Core HTA的討論。
1.瀏覽器支持:
(1).Selenium IDE僅能夠在Firefox中工做。
(2).Selenium Remote Control支持不少瀏覽器,包括最經常使用的:firefox,ie,safari等N款瀏覽器。
(3).Selenium Core支持的瀏覽器是最廣的,這點和它的實現有關。做爲IDE和RC的引擎,Selenium Core幾乎能夠在任何瀏覽器中工做。
2.須要遠程安裝:是否須要在被測網站的服務端安裝?
這裏只有Selenium Core須要,這是出於同源策略的緣由。這也是Selenium Core一個很大的限制,試問,若是你要測試Google.com,還得在google的服務器上裝一個Selenium Core,那是多搞笑的一件事。
而Selenium IDE和Selenium Core HTA不會被同源策略所限制,由於他們對瀏覽器擴展了。
Selenium RC提供一個代碼服務器來保證Selenium JS文件看似來自相同的遠程服務器,從而符合同源策略;代理服務器欺騙瀏覽器,讓它認爲這裏的確有像http://www.google.com/selenium/這樣的目錄。
3.支持HTTPS/SSL:
這裏不說了,都支持。Selenium RC在「是」後面加*由於它是在最近版本支持的,僅此而已。
4.須要Java:準確的說是須要JRE
這項只有Selenium RC須要,上面2中所說的「代理服務器」是一個Java程序,需在跑測試案例前啓動。
5.將測試結果保存到磁盤
只有Selenium Core不能將任何測試結果寫到磁盤上(由於它是用javascript寫的,它不容許向磁盤寫數據),其解決方案是固然你能夠將測試結果發送到另一臺服務器保存。這也是Selenium Core的一大限制。
6.多語言支持
(1).Selenium IDE僅支持Selenium語言。
(2).Selenium RC支持不少語言,如:C#,Java,Python,Ruby等。
(3).Selenium Core也是僅支持Selenium語言。
Selenium語言的測試案例以下:
它的優勢是:簡單,用(Command,Target,Value)三種元素組成一個行爲,而且有輔助錄製腳本工具(如:Firefox IDE,Selenium Core等),不懂程序的測試人員均可以輕鬆地編寫測試案例。
它的缺點是:Selenese有一些嚴格的限制:它沒有條件(沒有"if"表達式),而且它沒有循環(沒有"For"表達式)。這會使編寫複雜的測試變得困難甚至不可能。
OK,如今咱們來研究下到底該使用哪款工具開展測試!
(1).Selenium IDE支持而且只支持Firefox瀏覽器,支持的瀏覽器太少,而依附於Firefox也不便於往後開展自動化測試,可是,它的錄製快捷好用!而且有代碼轉換功能,能夠把Selenium語言測試案例轉爲C#,Java等語言的測試案例,我建議使用Selenium IDE + FireBug進行測試案例的編寫,而後轉爲其餘語言的測試案例後,再調用Selenium RC運行測試案例。
(2).Selenium Core,它的優勢是編寫測試案例簡單,而且支持絕大多數的瀏覽器,但缺點也一樣明顯,Selenium Core須要遠程安裝,Selenese語言也限制了複雜案例的可能性,而且沒有良好的外部擴展,這是些都會是致命的問題。由於一個款測試工具不可能100%知足你測試需求的,當它不能知足你測試需求時候,它必須有一個擴展機制可讓你可使用其餘的方式知足你需求,不然這款測試軟件即便功能強大,也請三思慎用,不然當投入大量資源後才發現某些問題不能解決,那時候已經晚了,這是個人切身體會。
(3).Selenium RC是我推薦使用的工具,它支持不少瀏覽器,可使用C#,Java等語言編寫測試案例,易於維護,同時提供了很好的擴展性,因此後續的文檔我會以Selenium RC做爲默認的測試工具。
Selenium 是 ThoughtWorks 專門爲 Web 應用程序編寫的一個驗收測試工具。據 Selenium 主頁所說,與其餘測試工具相比,使用 Selenium 的最大好處是:
Selenium 測試直接在瀏覽器中運行,就像真實用戶所作的同樣。Selenium 測試能夠在 Windows、Linux 和 MacintoshAnd 上的 Internet Explorer、Mozilla 和 Firefox 中運行。其餘測試工具都不能覆蓋如此多的平臺。
使用 Selenium 和在瀏覽器中運行測試還有不少其餘好處。下面是主要的兩大好處:
Selenium 的核心,也稱 browser bot,是用 JavaScript 編寫的。這使得測試腳本能夠在受支持的瀏覽器中運行。browser bot 負責執行從測試腳本接收到的命令,測試腳本要麼是用 HTML 的表佈局編寫的,要麼是使用一種受支持的編程語言編寫的。
Selenium 適用於如下瀏覽器:
Internet Explorer | Mozilla | Firefox | Safari | |
Windows XP | 6.0 | 1.6+, 1.7+ | 0.8+, 0.9+, 1.0 | |
Red Hat Linux | 1.6+, 1.7+ | 0.8+, 0.9+, 1.0+ | ||
Mac OS X 10.3 | 不支持 | 1.6+, 1.7+ | 0.8+, 0.9+, 1.0+ | 1.3+ |
經過 Selenium 命令,腳本編寫者能夠描述 browser bot 在瀏覽器中所執行的操做。能夠將這些命令分紅兩類 —— 操做(action) 和斷言(assertion):
在 Selenium 網站上能夠找到可用命令的完整列表(見 參考資料)。
能夠按兩種模式來使用 Selenium:test runner 和 driven。這兩種模式在複雜性和編寫方式方面有所不一樣。driven 測試腳本編寫起來每每要更復雜一些,由於它們是用編程語言編寫的。可是若是使用 Python 或 Ruby 之類的高級動態編程語言,那麼這種複雜性方面的差別就很小。
兩種模式之間最大的不一樣點在於,若是使用 driven 腳本,測試有一部分在瀏覽器以外運行,而若是使用 test runner 腳本的話,測試是徹底在瀏覽器中運行的。
無論是 test runner 仍是 driven 測試用例,均可以與持續集成工具集成。
Selenium test runner 腳本,也稱測試用例(test case),是用 HTML 語言經過一個簡單的表佈局編寫的,如 清單 1 所示。
<table border="1"> <tr> <td>First command</td> <td>Target</td> <td>Value</td> </tr> <tr> <td>Second command</td> <td>Target</td> <td>Value</td> </tr> </table> |
test runner 腳本一般與所測試的應用程序(AUT)部署在同一個服務器上。這是由於 browser bot 使用 JavaScript 來模擬用戶操做。這些腳本在一個受限制的沙箱環境中運行。若是須要繞過這些限制,可使用一個代理。
test runner 腳本使用與 xUnit 框架相同的測試套件(test suite)和測試用例概念。測試用例和命令按照它們在測試套件和測試用例中出現的順序依次執行。在 清單 1 中:
type
命令時,這一列可能就是一個文本域所指望的值。即便對於非技術人員來講,test runner 腳本也易於閱讀和編寫。當在一個瀏覽器中打開 清單 1 中的例子時,將獲得相似這樣的一個表:
First command | Target | Value |
Second command | Target | Value |
接下來,我將描述如何使用命令和斷言編寫一個簡單可是完整的測試用例。
執行 清單 2 中的測試腳本時,它將執行如下操做:
address_field
的文本框中輸入 Betelgeuse state prison
。Submit
的輸入區。注意,這裏使用 XPath 找到 Submit 按鈕,這致使表單數據被髮送到服務器。Address change successful
。 <table> <tr> <td>open</td> <td>/change_address_form.html</td> <td></td> </tr> <tr> <td>type</td> <td>address_field</td> <td>Betelgeuse state prison</td> </tr> <tr> <td>clickAndWait</td> <td>//input[@name='Submit']</td> <td></td> </tr> <tr> <td>verifyTextPresent</td> <td>Address change successful</td> <td></td> </tr> </table> |
要達到對應用程序的徹底測試覆蓋,一般須要不止一個測試用例。這就是 Selenium 使用測試套件的緣由。測試套件用於將具備相似功能的一些測試用例編成一組,以便讓它們按順序運行。
測試套件和測試用例同樣,都是用簡單的 HTML 表編寫的。Selenium 執行的缺省測試套件的名稱是 TestSuite.html。清單 3 展現了一個測試套件,該套件像一般的用戶同樣測試應用程序。注意,測試套件使用一個只包含一列的表,表中的每一行指向一個包含某個測試用例的文件。
<table> <tr> <td>Test suite for the whole application</td> </tr> <tr> <td><a href="test_main_page.html">Access main page</a></td> </tr> <tr> <td><a href="test_login.html">Login to application</a></td> </tr> <tr> <td><a href="test_address_change.html">Change address</a></td> </tr> <tr> <td><a href="test_logout.html">Logout from application</a></td> </tr> </table> |
接下來我將把目光轉移到 driven 測試腳本。
driven Selenium 腳本是用多種受支持的編程語言中的一種編寫的 —— 目前可用的有 Java、Ruby 和 Python 驅動程序。這些腳本在瀏覽器以外的一個單獨的進程中運行。驅動程序的任務是執行測試腳本,並經過與運行在瀏覽器中的 browser bot 進行通訊來驅動瀏覽器。驅動程序與 browser bot 之間的通訊使用一種簡單的特定於 Selenium 的鏈接語言 Selenese。
driven 腳本比 test runner 腳本更強大、更靈活,能夠將它們與 xUnit 框架集成。driven 腳本的缺點(與 test runner 腳本相比)是,這種腳本編寫和部署起來更復雜。這是由於驅動程序必須執行如下任務:
driven 腳本更依賴於應用程序運行時環境。例如,Java 驅動程序使用一個嵌入式 Jetty 或 Tomcat 實例來部署所測試的應用程序。目前,已經有人在致力於將 Selenium 集成到 Ruby on Rails 中,可是在我撰寫本文之際,這個集成版本尚未被髮布。
清單 4 摘自一個使用 Ruby 驅動程序的 driven 測試腳本。注意,我省略了用於啓動服務器和瀏覽器的步驟,這個測試腳本代碼幾乎和 test runner 腳本同樣簡單。
. . puts selenium.open('/logout.html') puts selenium.verify_location('/index.html') . . |
在接下來的兩節(現實中的需求 和 現實中的用例)中,我將描述如何在現實場景中使用 Selenium,並針對用 Ruby on Rails 和一點兒 Ajax 技術編寫的一個簡單的股票報價查看器應用程序編寫 Selenium 測試用例。雖然這個應用程序是用 Ruby on Rails 編寫的,可是也能夠將這個例子應用於任何 Web 應用程序,由於測試腳本是按 test runner 模式以 HTML 編寫的。這個示例應用程序是用 Ruby 1.8.3 和 Ruby on Rails 0.14.2 測試的,可是它也可能可使用更舊的或更新的版本。
若是有 Linux,那麼發行版中一般已經包括了 Ruby。在命令提示符下運行 ruby -v
,檢查您所擁有的版本。對於大多數平臺,均可以在 http://www.ruby-lang.org/ 上找到一個 Ruby 發行版。
接下來的步驟是經過 RubyGems 打包系統安裝 Ruby on Rails。爲此,只需執行 gem install rails --include-dependencies
。在某些平臺上,必須執行一些額外的步驟,因此請訪問 Ruby on Rails 網站,以得到更多細節。
在我撰寫本文之際,目前可用的 Selenium 版本是 0.6。我已經將它集成在示例應用程序中(見 下載 小節),個人作法是從http://selenium.thoughtworks.com/ 下載 Selenium Core 包,而後將名爲 selenium 的文件夾複製到用於靜態內容的文件夾。在 Ruby on Rails 應用程序中,這個文件夾的名稱是 public。在 J2EE Web 應用程序中,能夠將 selenium 文件夾放在 Web 應用程序的根目錄或 WAR 歸檔文件中。
最後一步是下載示例應用程序。從 下載 小節中得到這個包。解壓應用程序,並打開一個命令提示符。而後轉入應用程序被解壓到的那個目錄。爲了啓動應用程序,運行 ruby script/server
。應該看到 Rails 成功啓動了,如 圖 1 所示。
在本節中,我將列出示例應用程序的用例。經過這些簡化的用例,能夠編寫模擬用戶所執行步驟的驗收測試,並驗證這些步驟的結果是否與預期相符。股票報價應用程序實現瞭如下四個用例:
實現這些用例的代碼已經編寫好了;能夠在 app 目錄中找到該代碼,測試用例在 public/selenium/tests 文件夾中。
大多數人都知道登陸頁面是如何工做的 —— 輸入用戶名和密碼,而後將數據提交到服務器。若是憑證有效,就能夠成功登陸,並看到受安全保護的資源。在示例應用程序中,這個測試用例包含如下用戶操做和斷言,必須將它轉換成一個 Selenium 測試用例:
圖 2 展現了用於這些需求的 Selenium 測試用例。注意,我是在運行測試以後截取屏幕快照的。綠色箭頭表示成功地經過驗證的斷言。
查看股票頁面顯示一個公司列表。用於這個頁面的測試用例很是簡單,因此被包括在前一個測試用例的後面。該測試用例驗證當前位置是否爲 /main/list_stocks,以及頁面是否包含文本 Click on a company name to view details
。
查看股票細節用例是在查看股票頁面上觸發的。用戶在一個公司名稱上單擊鼠標時,就觸發了到服務器的一個 Ajax 請求。服務器的響應包括該公司的詳細信息,這些信息將插入到當前頁面中,而沒必要從新裝載完整的頁面。用於這個用例的測試用例執行如下用戶操做:
Acme Oil
。Acme Automotive
。因爲使用了 Ajax,請求是異步發生的。在通常的 Web 應用程序中,全部東西一般都是同步的,所以這一點提出了一種不一樣的挑戰。能夠像測試其餘功能同樣來測試 Ajax 功能。唯一的不一樣是,必須讓 Selenium 暫停,等待 Ajax 命令完成。爲此,可使用 pause
命令來等待 Ajax 命令的完成。另外,Joseph Moore 在他最近的 blog 貼中提到,還可使用 waitForValue
和waitForCondition
命令代替 pause 命令(見 參考資料)。
圖 3 展現了被轉換成 Selenium 用例的需求。
注意 pause
命令:必須使用這些命令,以便等待異步請求完成和更新頁面內容。若是沒有 500 毫秒的暫停,測試將失敗(如圖 4 所示)。
pause
命令還測試 Ajax 功能的非功能性需求。500 毫秒對於 pause 命令是一個很好的值,由於 Ajax 請求應該快速地執行和完成。能夠試着去掉 pause
命令,看看結果如何。若是測試在您的機器上失敗,那麼試着將這個值增長到 1000 毫秒。
退出用例很容易實現,簡單來講只有如下兩步:
圖 5 展現了最後這個測試用例。
全部測試都被添加到 圖 6 左側顯示的缺省測試套件中。
最後要作的是在 Mozilla Firefox 和 Microsoft Internet Explorer 中執行測試套件。爲此,在瀏覽器中打開http://localhost:3000/selenium/TestRunner.html
,而後單擊 圖 6 中所示的 All 按鈕。失敗的測試用例和斷言將被標記爲紅色,可是這裏,在兩個瀏覽器中全部用例都應該能夠成功完成(一樣見 圖 6)。注意,我使用的是 Mozilla Firefox 1.0.7 和 Internet Explorer 6.0。
還能夠單步調試測試套件,這意味着 Selenium 將很慢地執行測試套件,這樣當測試套件在瀏覽器中執行時,就能夠看到它的每一步。
Selenium 是軟件工程師、設計人員和測試人員的工具箱中又一個有用且重要的工具。經過將該工具與持續集成工具相結合,團隊就能夠將驗收測試自動化,並構建更好的軟件,由於他們能夠更容易、更早、更頻繁地發現 bug。Selenium 的另外一個優勢是能夠節省時間,使開發人員和測試人員沒必要將時間花在本能夠(也應該)自動化的手工任務上,從而讓團隊將精力放在更有價值的活動上。
下載
描述 | 名字 | 大小 | 下載方法 |
---|---|---|---|
Sample application | wa-selenium-ajax-example.zip | 286KB | HTTP |
學習
waitForValue
和 waitForCondition
命令 —— Joseph Moore 提出的 pause
命令的 替代品。得到產品和技術