用Selenium 測試 Ajax 項目

粗看 Selenium
在典型的在線商店中,需要用戶輸入或選擇衆多步驟後纔可以完成整個購物流程。作爲web應用的開發者,你如何保證你程序的質量和正確性呢?如果能有辦法測試你功能的正確性,那問題就迎刃而解了,但如何做到呢?

Selenium 是一個由ThoughtWorks做的專門爲web應用所做的非常有效的功能測試工具。Selenium 的 tests 直接在瀏覽器裏跑,就像用戶真的在操作一樣。Selenium 可運行 Windows, Linux, 和 Macintosh 的各種瀏覽器, 如 Internet Explorer, Mozilla 和 Firefox。

看看Selenium 的 online demo 。點擊右上角的"All"按鈕來啓動運行test cases, 如無意其外,你將看到所有都是綠行。注意action的綠色是會比assertions淺的,這是因爲他們測試的所有東西都只是verify或 assert 命令。如果有一個assertion 失敗了,則那行命令會變爲紅色,並且Selenium 會停止運行。如果verify 命令失敗了,那行命令也會變爲紅色,但是不會讓測試停下來。

在 Selenium 中的Test suites 和 cases 實際上是由 HTML 寫成的, 它們只是很簡單的 HTMLs。 test suite 中沒行都只是關聯了一個test case, 例如:

test-case實際上是由 "Selenese" 寫成的 HTML 文檔,裏面包有一個table,3個列,所有的命令最多隻有兩個參數,所以足夠位置擺放。一個典型的test case像這樣:

 

 當你開始運行測試 (例如 按 "All"按鈕), Selenium 的 TestRunner 會自動解釋 HTML 格式的 test-case, 並運行你的web應用,並在頁面下方的框架中顯示運行的情形。 Selenium 允許你通過在瀏覽器裏模擬用戶的行爲來進行測試。這當然不代表它可以代替unit-testing,只是我們通常會用它來進行web應用的功能測試。它也 可以被加入持續繼承測試(continuous-integration)中,作爲常規的自動迴歸測試(regression testing)。如果想更深入瞭解Selenium, 請參看在線文檔 "Selenium: Usage".

 

開始測試 Ajax 在你的web應用功能是用JavaScript實現時,Selenium 就顯得極爲有用了。 Ajax, 是Asynchronous JavaScript and XML 的簡稱,是web應用中的一種web 交互技術。它可以實現在頁面不需要刷新的情況下,在後臺與服務器交互少量數據,並即時改變頁面內容。這意味着網頁看起來更實時,更有動態和更實用。

 

Ajax 中指示正在"讀取數據"的標籤 剛纔那句話是對Ajax的技術定義,對於我們大多數人來說,Ajax意味着頁面向GMail 或 Flickr 那樣。當你點一個連接時,它不會產生頁面刷新,而是頁面會和服務器交互後返回來再更改一部分頁面。在點擊連接和看到結果之間延遲的這段時間,讓測試看起來 那麼的棘手。讓我們來假設我們的頁面包含了一個text field 和一個 button。text field 的初始值是oldValue。 如果你點擊button, Ajax就會啓動,並把text field的值改爲 "newValue", 而沒有刷新任何頁面。那我們怎麼去測試它呢? 你會很自然的去打開頁面, 點擊button, 然後檢查text field。但是你在Selenium中的這個test case失敗了! 測試失敗的原因也許並不明顯。這個意外的發生是因爲Ajax的異步性,它並不會馬上從服務器上得到結果。所以當你按下button時,Selenium 就開始馬上檢查是否有改變值。Selenium 並不知道需要去等待結果。那我們如何去讓這個測試在Ajax下生效呢? 我們如何去讓Selenium 等待返回的結果呢?

 

有些人認爲解決這個問題的辦法是用 clickAndWait 命令來代替 click 命令;但是在使用以 "AndWait" 爲後序的命令時,Selenium 會等待頁面刷新。但是明顯的,頁面不會刷新,這樣就使得Selenium 永遠在等待了。明顯這個方法行不通。另外一個方法是在 clickassertValue 之間加入暫停時間。讓它暫停5秒,讓服務器有足夠的時間返回相應。這種方法在大多數時候是可行的,但是如果服務器相應時間大於5秒,如網速很慢,測試機重啓等的時候,就會失敗了。

 

你或許會加大等待時間來保證更正確,但是這樣明顯會使得你的測試越來越慢。所以明顯的這個辦法並沒有按需而慢下拉,所以這也不是最佳的解決辦法。 幸運的是,Selenium 現在已經提供了這種我們非常需要的技術支持。當field 的值在單前頁面改變時,你能用 waitForValue 命令去讓 Selenium 等待到這個期望值出現爲止。 所以爲了讓剛纔的失敗的測試通過,你需要把它其中的assertValue 命令改變如下:

 

當執行這個命令的時候, Selenium 會暫停執行當前的test case 和等待所期待的值。當新的值 "newValue" 出現在 text field 時, 測試再次開始。但你需要注意的是,如果你寫錯期望值了, 那 Selenium 將會等待這個值30分鐘。 就如你想到的那樣,Selenium 已經提供了很多測試Ajax 效果的命令。

例如,如果你想等待某些文本會在頁面上出現,那你可用waitForText 命令;如果你想檢查當前頁面的Title是否有改變,則用waitForTitle;

如果你想檢查某個 HTML 元素是否有在頁面中被移除,應用 waitForElementNotPresent 命令。 實際上,對於每個Selenium Accessor, 都會有相應的 waitForXxxxwaitForNotXxxx 命令。

當你用 verifyXxxx or assertXxxx 去檢查某些東西時,總可以有 waitForXxxx 去測試異步效果。如果預先確定了 waitForXxxxwaitForNotXxxx 命令但又達不到預期,那會怎樣呢?

對於這種情況,我們有waitForCondition 命令去指定一個Javascript 的真假表達式(Boolean expression), 然 Selenium 去等待表達式的值爲true爲止。

waitForCondition 命令的格式是

waitForCondition script timeout (in ms)

這樣在測試複雜的 Ajax 效果時就更爲便捷了。

 

 實際上如果你深入研究 Selenium 的 source code 的話, 你會發現所有前序爲 waitForXxxxwaitForNotXxxx 的命令都是繼承了waitForCondition 的。 Grig Gheorghiu 寫了一篇關於這方面的blog: Ajax testing with Selenium using waitForCondition. 當他寫這篇文章時,waitForCondition 僅僅是用戶自己擴展Selenium, 現在已經成爲Selenium 核心代碼的一部分了。

 

總結 在這篇簡短的文章中, 我們介紹了Selenium,一個web應用測試工具。同樣地,我們也討論瞭如何去用waitForXxxx 命令來測試 Ajax 應用,也演示瞭如何用 Selenium 去測試一些Ajax 異步效果。 如果你想知道更多有關於 waitForXxxx 命令, Selenium 的開發者提供了一些簡單的測試例子 演示瞭如何測試 Ajax, 如編輯替換,自動填充和拖拉效果等。這些例子是基於script.aculo.us, 來做的, 它是大家都非常熟悉的 Ajax library- prototype.js的子項目。

 

 (自 http://www.infoq.com/articles/testing-ajax-selenium , cac譯。)

發佈了29 篇原創文章 · 獲贊 10 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章