如果您使用了雲環境,那麼測試對於確保應用程序的可靠性至關重要。學習使用開源工具 Selenium、Windmill 和 twill 進行自動化功能測試。本文討論的技術適用於 Google App Engine、博客軟體或自己編寫的應用程序。
簡介
隨著應用程序漸漸脫離獨立的宿主模型並進入到雲中,可靠性和可預測性變得更加重要。在雲環境中,有許多因素是我們無法控制的,因此編寫健壯的經過測試的代碼比以往更加迫切。
|
大部分開發人員(不管他們是否測試自己的代碼)至少都了解過關於代碼測試的課程。Web 開發人員 — 比大部分開發人員更了解代碼測試 — 需要快速交付應用程序,因此常常會因為交付期限緊迫而忽略單元測試。在某些流程中,忽略對代碼進行單元測試是不妥當的,因為單元測試能夠測試應用程序的實際組件,並且向其他開發人員解釋代碼的內部工作。對 Web 應用程序進行功能測試則是另一回事,並且由於各種原因沒有得到重視。
在本文中,我講解了幾個能夠幫助您對 Web 應用程序進行功能測試的工具。在這裡,我使用的應用程序是 Google App Engine,但這些測試技巧適用於任何 Web 應用程序。我還要強調的是,放棄功能測試並不是總是正確的,因為執行功能測試很快很容易,至少低級的測試是這樣的。在本文中,我講解了 3 個功能測試工具:Windmill、Selenium 和 twill。Windmill 和 Selenium 都是 Web 功能測試框架,它們允許在 Web 瀏覽器中自動化測試 JavaScript 和 Asynchronous JavaScript and XML (Ajax) 應用程序的用戶界面。Twill 是一個輕量級 Web 腳本工具,它負責非-JavaScript 應用程序的功能測試。
使用 twill 進行功能測試
|
我將從輕量級命令行 Web 瀏覽器和腳本工具(twill)以及默認的 Google App Engine 項目開始討論功能測試。
首先,建立一個與您的應用程序的連接。為此,需要使用 go 命令,如清單 1 所示。注意,如果您輸入 show,它將顯示實際的輸出結果。
# twill-sh -= Welcome to twill! =- >> go localhost:8087 ==> at http://localhost:8087 current page: http://localhost:8087 >> show Hello World! current page: http://localhost:8087 |
twill 的另一個有趣特性是查看 http 狀態代碼。
> go http://localhost:8087 ==> at http://localhost:8087 current page: http://localhost:8087 >> code 200 current page: http://localhost:8087 >> code 400 ERROR: code is 200 != 400 current page: http://localhost:8087 |
從命令的輸出可以看到,如果獲得的狀態代碼與預期的代碼不匹配,將返回一個錯誤。twill 還支持以腳本的形式運行這些行為。您可以隨意命名該文件並將其傳遞到 twill-sh。如果將這些命令放到名為 test_twill.script 的文件中,您將看到類似於清單 3 的輸出。
# twill-sh test_twill.script >> EXECUTING FILE test_twill.script AT LINE: test_twill.script:0 ==> at http://localhost:8087 AT LINE: test_twill.script:1 -- 1 of 1 files SUCCEEDED. |
如果要自動化測試 Web 應用程序的非 JavaScript 部分,那麼 twill 是一個非常方便的工具。twill 還有一些我沒有提到的特性,比如處理變數、cookie、表單和 http 身份驗證等。如果想了解高級的用例,請參閱 參考資料。
使用 Selenium 進行功能測試
Selenium 是一個重量級的測試工具,它允許在瀏覽器中進行跨平台測試。編寫跨平台 JavaScript 代碼是 Web 開發人員必須忍受的苦差事。編寫 Web 應用程序是很困難的,當您認為大功告成時,卻發現一些難以覺察的 bug,它們僅在某些瀏覽器上才表現得明顯。
不幸的是,單元測試不能捕捉這種 bug。事實上,這種 bug 通常讓 Web 開發人員覺得測試並不可靠。他們認為測試是個苦差事,並且它們有時會延遲產品的交付,況且測試是很不可靠的。所以為什麼要多此一舉呢?
Selenium(以及其他瀏覽器測試工具)能夠解決這個問題。您可以編寫在每個瀏覽器中運行的功能測試,然後實現一個根據源代碼的每次簽入運行功能測試的持續集成系統。這樣就能快速捕捉瀏覽器中的潛在 bug,然後進行修復。
Selenium 執行的最基礎的工作是記錄瀏覽器行為,然後將結果用於測試。看看圖 1 中的示例,您會看到一個包含有 Base URL 的窗口。該窗口記錄需要測試的 Web 站點的行為。在這個例子中,我測試的是一個 Google App Engine 站點:http://shell.appspot.com,它是一個用於演示的 Ajax Python 解釋器。在記錄會話之後,您可以用 Python 導出測試並使用 Selenium 運行它們。
為了運行測試,僅需將測試存儲為 Python 代碼(或其他語言的代碼),接著下載並運行 Selenium RC 測試伺服器,然後就可以運行測試了。清單 4 是一個測試例子。
from selenium import selenium import unittest, time, re class NewTest(unittest.TestCase): def setUp(self): self.verificationErrors = [] self.selenium = selenium("localhost", 4444, "*chrome", "http://shell.appspot.com") self.selenium.start() def test_new(self): sel = self.selenium sel.open("/") sel.click("link=source") sel.wait_for_page_to_load("30000") def tearDown(self): self.selenium.stop() self.assertEqual([], self.verificationErrors) if __name__ == "__main__": unittest.main() |
您可以啟動 Selenium RC,它在多個瀏覽器上充當測試的代理,然後運行功能測試。清單 5 給出了 Selenium RC 的輸出結果。
# java -jar selenium-server.jar 01:18:47.909 INFO - Java: Apple Inc. 1.5.0_16-133 01:18:47.910 INFO - OS: Mac OS X 10.5.6 i386 01:18:47.915 INFO - v1.0-beta-1 [2201], [1994] 01:18:48.044 INFO - Version Jetty/5.1.x 01:18:48.045 INFO - Started HttpContext[/,/] 01:18:48.047 INFO - Started HttpContext[/selenium-server] 01:18:48.047 INFO - Started HttpContext[/selenium-server/driver] 01:18:48.055 INFO - Started SocketListener on 0.0.0.0:4444 [output suppressed for space] |
我希望您閱讀完整的 Selenium RC FAQ,以理解它如何與多個瀏覽器進行交互(參見 參考資料)。如您所見,使用 Selenium 自動化跨平台功能測試非常容易,並且支持很多語言,包括 HTML、Java™ 代碼、C#、Perl、PHP、Python 和 Ruby。
Windmill
Windmill 是一個類似於 Selenium 的 Web 測試框架,但也有一些不同之處。一個主要的區別是 Windmill 是用 Python 和 JavaScript 編寫的,並且是在 Chandler 項目下開發的。這個開源項目是 Microsoft® Outlook 的有力競爭者。
要開始使用 Windmill,僅需運行命令:sudo easy_install windmill。這將安裝 windmill 測試框架。接下來,如果輸入 windmill firefox,將打開 Windmill IDE(見圖 2)。然後會打開測試頁面,如圖 3 所示。在圖 2 中您可以看到,IDE 記錄行為的方式與 Selenium 很相似。然後保存該測試文件,它類似於清單 6 中的輸出。
# Generated by the windmill services transformer from windmill.authoring import WindmillTestClient def test_recordingSuite0(): client = WindmillTestClient(__name__) client.click(id=u'recordedClickId') client.click(id=u'textFieldOne') client.type(text=u'foo bar', id=u'textFieldOne') client.click(id=u'btnSub') |
這裡有一個選項可以將測試保存為 JSON 或 Python,在本例中我保存為 Python。接下來,僅需從命令行的測試選項運行測試文件,就能夠實際運行測試。清單 7 顯示了運行測試的代碼。
# windmill firefox test=windmill_test.py http://tutorial.getwindmill.com/ Started ['/Applications/Firefox.app/Contents/MacOS/firefox-bin', '-profile', '/var/folders/1K/ 1KgyCzqJHButzT6vq8vwHU+++TI/-Tmp-/tmp_ovtnN.mozrunner', 'http://tutorial.getwindmill.com/windmill-serv/start.html'] Server running... |
您可以對這個例子稍作修改,就可用於 Google App Engine 應用程序或其他 Web 應用程序。Windmill 還提供出色的文檔,解釋如何執行高級任務,比如使用插件擴展 Windmill。
結束語
功能測試對 Web 開發過程十分重要。如果沒有功能測試,Web 開發就像猜謎遊戲一樣,容易出現錯誤的部署和重構。
那麼,是不是所有 Web 開發人員都必須執行功能測試呢?我認為是這樣的,所有 Web 應用程序都應該接受測試,尤其是在雲環境中使用的應用程序。不對 Web 應用程序進行功能測試是很危險的,並且用 Selenium、Windmill 和 twill 進行最低級別的測試是非常容易的。在此引用 twill 的作者 Titus Brown 的話結束本文 “如果沒有測試代碼,您怎麼知道它能正常工作呢?”。(責任編輯:A6)
[火星人 ] 使用開源工具測試 Web 應用程序已經有650次圍觀