歡迎您光臨本站 註冊首頁

使用開源工具測試 Web 應用程序

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
如果您使用了雲環境,那麼測試對於確保應用程序的可靠性至關重要。學習使用開源工具 Selenium、Windmill 和 twill 進行自動化功能測試。本文討論的技術適用於 Google App Engine、博客軟體或自己編寫的應用程序。

簡介

隨著應用程序漸漸脫離獨立的宿主模型並進入到雲中,可靠性和可預測性變得更加重要。在雲環境中,有許多因素是我們無法控制的,因此編寫健壯的經過測試的代碼比以往更加迫切。

twill 和 Google App Engine 介紹

在 參考資料 小節中,有一篇詳盡的文章介紹如何從頭構建可以運行的 “Hello World” 應用程序。在 OS X 平台上,您可以下載 Google App Engine Launcher,它將為您創建 “Hello World” 應用程序的模板(boilerplate)文件。

要開始使用 twill,需要運行命令:sudo easy_install twill。接下來,僅需調用 twill-sh 腳本工具交互地測試您的應用程序。

大部分開發人員(不管他們是否測試自己的代碼)至少都了解過關於代碼測試的課程。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 進行功能測試

Easy Install

Easy Install 是一個幫助您從本地或網路安裝 Python 包的工具。通常使用 easy_install 命令從網路安裝包。

我將從輕量級命令行 Web 瀏覽器和腳本工具(twill)以及默認的 Google App Engine 項目開始討論功能測試。

首先,建立一個與您的應用程序的連接。為此,需要使用 go 命令,如清單 1 所示。注意,如果您輸入 show,它將顯示實際的輸出結果。


清單 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 狀態代碼。


清單 2. 示例 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 的輸出。


清單 3. 更多的示例 twill 輸出
# 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 運行它們。


圖 1. Selenium IDE 窗口

為了運行測試,僅需將測試存儲為 Python 代碼(或其他語言的代碼),接著下載並運行 Selenium RC 測試伺服器,然後就可以運行測試了。清單 4 是一個測試例子。


清單 4. 示例 Selenium 測試
				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 的輸出結果。


清單 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 中的輸出。


圖 2. Windmill IDE 窗口

圖 3. Windmill 教程

清單 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 顯示了運行測試的代碼。


清單 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次圍觀

http://coctec.com/docs/linux/show-post-68904.html