(目前,對(duì)著一塊了解不多,也許以后就要加以重視了)
如何使用 Selenium 測(cè)試工具對(duì) Ruby on Rails 和 Ajax 應(yīng)用程序進(jìn)行功能測(cè)試 ![]() |
![]() |
![]() |
級(jí)別: 中級(jí) Christian Hellsten , IT 專家, IBM 2006 年 1 月 04 日 驗(yàn)收測(cè)試(也稱功能測(cè)試)是用來(lái)測(cè)試手工任務(wù)的功能的,但是手工測(cè)試這些任務(wù)可能很花時(shí)間,并且容易出現(xiàn)人為的錯(cuò)誤。在本文中,作者為架構(gòu)師、開(kāi)發(fā)人員和測(cè)試人員展示了如何使用 Selenium 測(cè)試工具來(lái)自動(dòng)化驗(yàn)收測(cè)試。通過(guò)自動(dòng)化測(cè)試,可以節(jié)省時(shí)間,并消除測(cè)試人員所犯的錯(cuò)誤。文中還給出了一個(gè)例子,以演示如何將 Selenium 應(yīng)用到現(xiàn)實(shí)中使用 Ruby on Rails 和 Ajax 的項(xiàng)目上。 Web 應(yīng)用程序的驗(yàn)收測(cè)試常常涉及一些手工任務(wù),例如打開(kāi)一個(gè)瀏覽器,并執(zhí)行一個(gè)測(cè)試用例中所描述的操作。但是手工執(zhí)行的任務(wù)容易出現(xiàn)操作人員人為的錯(cuò)誤,也比較費(fèi)時(shí)間。因此,盡可能將這些任務(wù)自動(dòng)化,以消除人為因素,這是一種很好的做法。于是 Selenium 之類的測(cè)試工具就有了用武之地。Selenium 幫助您自動(dòng)化驗(yàn)收測(cè)試,從而可以構(gòu)建經(jīng)過(guò)更嚴(yán)格測(cè)試、因而更為可靠也更易于維護(hù)的軟件。 驗(yàn)收測(cè)試也稱黑盒測(cè)試和功能測(cè)試,是測(cè)試和檢驗(yàn)應(yīng)用程序是否能按照涉眾(stakeholder)的功能性需求、非功能性需求和其他重要需求來(lái)運(yùn)行的一種方法。驗(yàn)收測(cè)試是單元測(cè)試和組合測(cè)試的補(bǔ)充,后兩者通常是使用 xUnit 框架編寫的。驗(yàn)收測(cè)試也可以使用編程語(yǔ)言來(lái)編寫,但是 Selenium 和其他類似的工具,例如 Fitnesse,也支持用特定于工具的文檔格式編寫測(cè)試。 驗(yàn)收測(cè)試與單元測(cè)試和組合測(cè)試有以下不同之處:
在討論 Selenium 之前,我要介紹關(guān)于以下三個(gè)話題的一些背景知識(shí),因?yàn)檫@些話題雖然不是本文的主題,但是和本文密切相關(guān):
持續(xù)集成的目標(biāo)是自動(dòng)化構(gòu)建和測(cè)試過(guò)程,以便每天自動(dòng)運(yùn)行一次或多次這些過(guò)程,而不是每個(gè)月手動(dòng)地運(yùn)行一次。使用持續(xù)集成的最大好處是,代碼的更改會(huì)定期地自動(dòng)被集成。如果系統(tǒng)受損,沒(méi)有構(gòu)建成功,Apache Continuum 和 Luntbuild 之類的持續(xù)集成工具可以自動(dòng)通過(guò)發(fā)送電子郵件通知團(tuán)隊(duì)(見(jiàn) 參考資料)。 Ajax 是 Asynchronous JavaScript and XML 的縮寫,這是為相當(dāng)老的技術(shù)新創(chuàng)造的一個(gè)術(shù)語(yǔ)。Ajax 背后的主要思想是,由于只需更新部分頁(yè)面而不是整個(gè)頁(yè)面,所以 Web 應(yīng)用程序可以更快地對(duì)用戶操作做出響應(yīng)。 Ajax 將更多的復(fù)雜性引入到 Web 應(yīng)用程序中,這一點(diǎn)也反映在測(cè)試中。這是因?yàn)?Ajax 就像它的名稱所表明的那樣,使用 JavaScript 和異步 HTTP 請(qǐng)求來(lái)更新頁(yè)面內(nèi)容。每個(gè)瀏覽器在實(shí)現(xiàn)中與其他瀏覽器相比有一些小小的不同。Selenium 是測(cè)試和檢測(cè)這些差異的很好的工具,因?yàn)樗诖蠖鄶?shù)流行的瀏覽器中都能夠運(yùn)行。 Ruby 是一種開(kāi)放源碼的解釋型腳本語(yǔ)言,用于快捷、容易地進(jìn)行面向?qū)ο蟪绦蛟O(shè)計(jì)。它提供了大量的庫(kù),而且簡(jiǎn)單易用,還具有可擴(kuò)展性和可移植性。該語(yǔ)言是由 Yukihiro “Matz” Matsumoto 創(chuàng)造的,目的是讓程序員將更多的注意力放在手頭的任務(wù)上,擺脫語(yǔ)法的煩惱。 Rails 是由 David Heinemeier Hansson 創(chuàng)造的一種全棧的(full-stack)、開(kāi)放源碼的 Ruby Web 框架。Rails 的目標(biāo)是使現(xiàn)實(shí)中的應(yīng)用程序編寫起來(lái)需要的代碼更少,并且比 J2EE 和 XML 之類的語(yǔ)言更容易。所有層都能夠無(wú)縫地一起工作,因此可以使用一種語(yǔ)言編寫從模板到控制流乃至業(yè)務(wù)邏輯的各種東西。Rails 使用 YAML 而不是 XML 配置文件以及注釋形式的反射和運(yùn)行時(shí)擴(kuò)展。這里不存在編譯階段 —— 程序修改后將直接運(yùn)行。
Selenium 是 ThoughtWorks 專門為 Web 應(yīng)用程序編寫的一個(gè)驗(yàn)收測(cè)試工具。據(jù) Selenium 主頁(yè)所說(shuō),與其他測(cè)試工具相比,使用 Selenium 的最大好處是: Selenium 測(cè)試直接在瀏覽器中運(yùn)行,就像真實(shí)用戶所做的一樣。Selenium 測(cè)試可以在 Windows、Linux 和 MacintoshAnd 上的 Internet Explorer、Mozilla 和 Firefox 中運(yùn)行。其他測(cè)試工具都不能覆蓋如此多的平臺(tái)。 使用 Selenium 和在瀏覽器中運(yùn)行測(cè)試還有很多其他好處。下面是主要的兩大好處:
Selenium 的核心,也稱 browser bot,是用 JavaScript 編寫的。這使得測(cè)試腳本可以在受支持的瀏覽器中運(yùn)行。browser bot 負(fù)責(zé)執(zhí)行從測(cè)試腳本接收到的命令,測(cè)試腳本要么是用 HTML 的表布局編寫的,要么是使用一種受支持的編程語(yǔ)言編寫的。 Selenium 適用于以下瀏覽器:
通過(guò) Selenium 命令,腳本編寫者可以描述 browser bot 在瀏覽器中所執(zhí)行的操作。可以將這些命令分成兩類 —— 操作(action) 和斷言(assertion):
在 Selenium 網(wǎng)站上可以找到可用命令的完整列表(見(jiàn) 參考資料)。
可以按兩種模式來(lái)使用 Selenium:test runner 和 driven。這兩種模式在復(fù)雜性和編寫方式方面有所不同。driven 測(cè)試腳本編寫起來(lái)往往要更復(fù)雜一些,因?yàn)樗鼈兪怯镁幊陶Z(yǔ)言編寫的。但是如果使用 Python 或 Ruby 之類的高級(jí)動(dòng)態(tài)編程語(yǔ)言,那么這種復(fù)雜性方面的差異就很小。 兩種模式之間最大的不同點(diǎn)在于,如果使用 driven 腳本,測(cè)試有一部分在瀏覽器之外運(yùn)行,而如果使用 test runner 腳本的話,測(cè)試是完全在瀏覽器中運(yùn)行的。 不管是 test runner 還是 driven 測(cè)試用例,都可以與持續(xù)集成工具集成。
Selenium test runner 腳本,也稱測(cè)試用例(test case),是用 HTML 語(yǔ)言通過(guò)一個(gè)簡(jiǎn)單的表布局編寫的,如 清單 1 所示。 清單 1. Selenium 測(cè)試用例的結(jié)構(gòu)
test runner 腳本通常與所測(cè)試的應(yīng)用程序(AUT)部署在同一個(gè)服務(wù)器上。這是因?yàn)?browser bot 使用 JavaScript 來(lái)模擬用戶操作。這些腳本在一個(gè)受限制的沙箱環(huán)境中運(yùn)行。如果需要繞過(guò)這些限制,可以使用一個(gè)代理。 test runner 腳本使用與 xUnit 框架相同的測(cè)試套件(test suite)和測(cè)試用例概念。測(cè)試用例和命令按照它們?cè)跍y(cè)試套件和測(cè)試用例中出現(xiàn)的順序依次執(zhí)行。在 清單 1 中:
即使對(duì)于非技術(shù)人員來(lái)說(shuō),test runner 腳本也易于閱讀和編寫。當(dāng)在一個(gè)瀏覽器中打開(kāi) 清單 1 中的例子時(shí),將得到類似這樣的一個(gè)表:
接下來(lái),我將描述如何使用命令和斷言編寫一個(gè)簡(jiǎn)單但是完整的測(cè)試用例。 執(zhí)行 清單 2 中的測(cè)試腳本時(shí),它將執(zhí)行以下操作:
清單 2. 在測(cè)試用例中使用命令和斷言的例子
要達(dá)到對(duì)應(yīng)用程序的完全測(cè)試覆蓋,通常需要不止一個(gè)測(cè)試用例。這就是 Selenium 使用測(cè)試套件的原因。測(cè)試套件用于將具有類似功能的一些測(cè)試用例編成一組,以便讓它們按順序運(yùn)行。 測(cè)試套件和測(cè)試用例一樣,都是用簡(jiǎn)單的 HTML 表編寫的。Selenium 執(zhí)行的缺省測(cè)試套件的名稱是 TestSuite.html。清單 3 展示了一個(gè)測(cè)試套件,該套件像通常的用戶一樣測(cè)試應(yīng)用程序。注意,測(cè)試套件使用一個(gè)只包含一列的表,表中的每一行指向一個(gè)包含某個(gè)測(cè)試用例的文件。 清單 3. 測(cè)試套件示例
接下來(lái)我將把目光轉(zhuǎn)移到 driven 測(cè)試腳本。
driven Selenium 腳本是用多種受支持的編程語(yǔ)言中的一種編寫的 —— 目前可用的有 Java、Ruby 和 Python 驅(qū)動(dòng)程序。這些腳本在瀏覽器之外的一個(gè)單獨(dú)的進(jìn)程中運(yùn)行。驅(qū)動(dòng)程序的任務(wù)是執(zhí)行測(cè)試腳本,并通過(guò)與運(yùn)行在瀏覽器中的 browser bot 進(jìn)行通信來(lái)驅(qū)動(dòng)瀏覽器。驅(qū)動(dòng)程序與 browser bot 之間的通信使用一種簡(jiǎn)單的特定于 Selenium 的連接語(yǔ)言 Selenese。 driven 腳本比 test runner 腳本更強(qiáng)大、更靈活,可以將它們與 xUnit 框架集成。driven 腳本的缺點(diǎn)(與 test runner 腳本相比)是,這種腳本編寫和部署起來(lái)更復(fù)雜。這是因?yàn)轵?qū)動(dòng)程序必須執(zhí)行以下任務(wù):
driven 腳本更依賴于應(yīng)用程序運(yùn)行時(shí)環(huán)境。例如,Java 驅(qū)動(dòng)程序使用一個(gè)嵌入式 Jetty 或 Tomcat 實(shí)例來(lái)部署所測(cè)試的應(yīng)用程序。目前,已經(jīng)有人在致力于將 Selenium 集成到 Ruby on Rails 中,但是在我撰寫本文之際,這個(gè)集成版本還沒(méi)有被發(fā)布。 清單 4 摘自一個(gè)使用 Ruby 驅(qū)動(dòng)程序的 driven 測(cè)試腳本。注意,我省略了用于啟動(dòng)服務(wù)器和瀏覽器的步驟,這個(gè)測(cè)試腳本代碼幾乎和 test runner 腳本一樣簡(jiǎn)單。 清單 4. 使用 Ruby 驅(qū)動(dòng)程序的例子
在接下來(lái)的兩節(jié)(現(xiàn)實(shí)中的需求 和 現(xiàn)實(shí)中的用例)中,我將描述如何在現(xiàn)實(shí)場(chǎng)景中使用 Selenium,并針對(duì)用 Ruby on Rails 和一點(diǎn)兒 Ajax 技術(shù)編寫的一個(gè)簡(jiǎn)單的股票報(bào)價(jià)查看器應(yīng)用程序編寫 Selenium 測(cè)試用例。雖然這個(gè)應(yīng)用程序是用 Ruby on Rails 編寫的,但是也可以將這個(gè)例子應(yīng)用于任何 Web 應(yīng)用程序,因?yàn)闇y(cè)試腳本是按 test runner 模式以 HTML 編寫的。這個(gè)示例應(yīng)用程序是用 Ruby 1.8.3 和 Ruby on Rails 0.14.2 測(cè)試的,但是它也可能可以使用更舊的或更新的版本。 如果有 Linux,那么發(fā)行版中通常已經(jīng)包括了 Ruby。在命令提示符下運(yùn)行 接下來(lái)的步驟是通過(guò) RubyGems 打包系統(tǒng)安裝 Ruby on Rails。為此,只需執(zhí)行 在我撰寫本文之際,目前可用的 Selenium 版本是 0.6。我已經(jīng)將它集成在示例應(yīng)用程序中(見(jiàn) 下載 小節(jié)),我的做法是從 http://selenium.thoughtworks.com/ 下載 Selenium Core 包,然后將名為 selenium 的文件夾復(fù)制到用于靜態(tài)內(nèi)容的文件夾。在 Ruby on Rails 應(yīng)用程序中,這個(gè)文件夾的名稱是 public。在 J2EE Web 應(yīng)用程序中,可以將 selenium 文件夾放在 Web 應(yīng)用程序的根目錄或 WAR 歸檔文件中。 最后一步是下載示例應(yīng)用程序。從 下載 小節(jié)中獲得這個(gè)包。解壓應(yīng)用程序,并打開(kāi)一個(gè)命令提示符。然后轉(zhuǎn)入應(yīng)用程序被解壓到的那個(gè)目錄。為了啟動(dòng)應(yīng)用程序,運(yùn)行 圖 1. 從命令提示符下運(yùn)行 Ruby on Rails ![]()
在本節(jié)中,我將列出示例應(yīng)用程序的用例。通過(guò)這些簡(jiǎn)化的用例,可以編寫模擬用戶所執(zhí)行步驟的驗(yàn)收測(cè)試,并驗(yàn)證這些步驟的結(jié)果是否與預(yù)期相符。股票報(bào)價(jià)應(yīng)用程序?qū)崿F(xiàn)了以下四個(gè)用例:
實(shí)現(xiàn)這些用例的代碼已經(jīng)編寫好了;可以在 app 目錄中找到該代碼,測(cè)試用例在 public/selenium/tests 文件夾中。 大多數(shù)人都知道登錄頁(yè)面是如何工作的 —— 輸入用戶名和密碼,然后將數(shù)據(jù)提交到服務(wù)器。如果憑證有效,就可以成功登錄,并看到受安全保護(hù)的資源。在示例應(yīng)用程序中,這個(gè)測(cè)試用例包含以下用戶操作和斷言,必須將它轉(zhuǎn)換成一個(gè) Selenium 測(cè)試用例:
圖 2 展示了用于這些需求的 Selenium 測(cè)試用例。注意,我是在運(yùn)行測(cè)試之后截取屏幕快照的。綠色箭頭表示成功地通過(guò)驗(yàn)證的斷言。 圖 2. 登錄和查看股票測(cè)試用例 ![]() 查看股票頁(yè)面顯示一個(gè)公司列表。用于這個(gè)頁(yè)面的測(cè)試用例非常簡(jiǎn)單,所以被包括在前一個(gè)測(cè)試用例的后面。該測(cè)試用例驗(yàn)證當(dāng)前位置是否為 /main/list_stocks,以及頁(yè)面是否包含文本 查看股票細(xì)節(jié)用例是在查看股票頁(yè)面上觸發(fā)的。用戶在一個(gè)公司名稱上單擊鼠標(biāo)時(shí),就觸發(fā)了到服務(wù)器的一個(gè) Ajax 請(qǐng)求。服務(wù)器的響應(yīng)包括該公司的詳細(xì)信息,這些信息將插入到當(dāng)前頁(yè)面中,而不必重新裝載完整的頁(yè)面。用于這個(gè)用例的測(cè)試用例執(zhí)行以下用戶操作:
由于使用了 Ajax,請(qǐng)求是異步發(fā)生的。在一般的 Web 應(yīng)用程序中,所有東西通常都是同步的,因此這一點(diǎn)提出了一種不同的挑戰(zhàn)。可以像測(cè)試其他功能一樣來(lái)測(cè)試 Ajax 功能。惟一的不同是,必須讓 Selenium 暫停,等待 Ajax 命令完成。為此,可以使用 圖 3 展示了被轉(zhuǎn)換成 Selenium 用例的需求。 圖 3. 查看股票細(xì)節(jié)測(cè)試用例 ![]() 注意 圖 4. 失敗的查看股票細(xì)節(jié)測(cè)試用例 ![]()
退出用例很容易實(shí)現(xiàn),簡(jiǎn)單來(lái)說(shuō)只有以下兩步:
圖 5 展示了最后這個(gè)測(cè)試用例。 圖 5. 退出用例 ![]() 所有測(cè)試都被添加到 圖 6 左側(cè)顯示的缺省測(cè)試套件中。 圖 6. 示例應(yīng)用程序的測(cè)試套件 ![]() 最后要做的是在 Mozilla Firefox 和 Microsoft Internet Explorer 中執(zhí)行測(cè)試套件。為此,在瀏覽器中打開(kāi) 還可以單步調(diào)試測(cè)試套件,這意味著 Selenium 將很慢地執(zhí)行測(cè)試套件,這樣當(dāng)測(cè)試套件在瀏覽器中執(zhí)行時(shí),就可以看到它的每一步。
Selenium 是軟件工程師、設(shè)計(jì)人員和測(cè)試人員的工具箱中又一個(gè)有用且重要的工具。通過(guò)將該工具與持續(xù)集成工具相結(jié)合,團(tuán)隊(duì)就可以將驗(yàn)收測(cè)試自動(dòng)化,并構(gòu)建更好的軟件,因?yàn)樗麄兛梢愿菀住⒏纭⒏l繁地發(fā)現(xiàn) bug。Selenium 的另一個(gè)優(yōu)點(diǎn)是可以節(jié)省時(shí)間,使開(kāi)發(fā)人員和測(cè)試人員不必將時(shí)間花在本可以(也應(yīng)該)自動(dòng)化的手工任務(wù)上,從而讓團(tuán)隊(duì)將精力放在更有價(jià)值的活動(dòng)上。
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
討論
|