驗(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 之類(lèi)的測(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 框架編寫(xiě)的。驗(yàn)收測(cè)試也可以使用編程語(yǔ)言來(lái)編寫(xiě),但是 Selenium 和其他類(lèi)似的工具,例如 Fitnesse,也支持用特定于工具的文檔格式編寫(xiě)測(cè)試。
驗(yàn)收測(cè)試與單元測(cè)試和組合測(cè)試有以下不同之處:
* 應(yīng)用程序是作為一個(gè)完整的端到端實(shí)體來(lái)測(cè)試的,而不是像單元測(cè)試和組合測(cè)試那樣,只是測(cè)試一個(gè)類(lèi)或一組類(lèi)。
* 驗(yàn)收測(cè)試是在用戶界面(例如一個(gè)瀏覽器)上執(zhí)行的,而不是在 Web 應(yīng)用程序界面上執(zhí)行的。
* 編寫(xiě)測(cè)試用例的人不一定知道應(yīng)用程序的內(nèi)部結(jié)構(gòu),因此也被稱作黑盒測(cè)試。非技術(shù)性用戶也可以編寫(xiě)驗(yàn)收測(cè)試。
背景知識(shí)
在討論 Selenium 之前,我要介紹關(guān)于以下三個(gè)話題的一些背景知識(shí),因?yàn)檫@些話題雖然不是本文的主題,但是和本文密切相關(guān):
* 持續(xù)集成
* Ajax
* Ruby/Ruby on Rails
持續(xù)集成
持續(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 之類(lèi)的持續(xù)集成工具可以自動(dòng)通過(guò)發(fā)送電子郵件通知團(tuán)隊(duì)(見(jiàn) 參考資料)。
Ajax
Ajax 是 Asynchronous JavaScript and XML 的縮寫(xiě),這是為相當(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/Ruby on Rails
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)用程序編寫(xiě)起來(lái)需要的代碼更少,并且比 J2EE 和 XML 之類(lèi)的語(yǔ)言更容易。所有層都能夠無(wú)縫地一起工作,因此可以使用一種語(yǔ)言編寫(xiě)從模板到控制流乃至業(yè)務(wù)邏輯的各種東西。Rails 使用 YAML 而不是 XML 配置文件以及注釋形式的反射和運(yùn)行時(shí)擴(kuò)展。這里不存在編譯階段 —— 程序修改后將直接運(yùn)行。
什么是 Selenium?
Selenium 是 ThoughtWorks 專門(mén)為 Web 應(yīng)用程序編寫(xiě)的一個(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è)試還有很多其他好處。下面是主要的兩大好處:
* 通過(guò)編寫(xiě)模仿用戶操作的 Selenium 測(cè)試腳本,可以從終端用戶的角度來(lái)測(cè)試應(yīng)用程序。
* 通過(guò)在不同瀏覽器中運(yùn)行測(cè)試,更容易發(fā)現(xiàn)瀏覽器的不兼容性。
Selenium 的核心,也稱 browser bot,是用 JavaScript 編寫(xiě)的。這使得測(cè)試腳本可以在受支持的瀏覽器中運(yùn)行。browser bot 負(fù)責(zé)執(zhí)行從測(cè)試腳本接收到的命令,測(cè)試腳本要么是用 HTML 的表布局編寫(xiě)的,要么是使用一種受支持的編程語(yǔ)言編寫(xiě)的。
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 命令
通過(guò) Selenium 命令,腳本編寫(xiě)者可以描述 browser bot 在瀏覽器中所執(zhí)行的操作?梢詫⑦@些命令分成兩類(lèi) —— 操作(action) 和斷言(assertion):
* 操作模擬用戶與 Web 應(yīng)用程序的交互。例如,單擊一個(gè)按鈕和填寫(xiě)一個(gè)表單,這些都是常見(jiàn)的用戶操作,可以用 Selenium 命令來(lái)自動(dòng)化這些操作。
* 斷言驗(yàn)證一個(gè)命令的預(yù)期結(jié)果。常見(jiàn)的斷言包括驗(yàn)證頁(yè)面內(nèi)容或當(dāng)前位置是否正確。
在 Selenium 網(wǎng)站上可以找到可用命令的完整列表(見(jiàn) 參考資料)。
Selenium 模式
可以按兩種模式來(lái)使用 Selenium:test runner 和 driven。這兩種模式在復(fù)雜性和編寫(xiě)方式方面有所不同。driven 測(cè)試腳本編寫(xiě)起來(lái)往往要更復(fù)雜一些,因?yàn)樗鼈兪怯镁幊陶Z(yǔ)言編寫(xiě)的。但是如果使用 Python 或 Ruby 之類(lèi)的高級(jí)動(dòng)態(tài)編程語(yǔ)言,那么這種復(fù)雜性方面的差異很小。
兩種模式之間大的不同點(diǎn)在于,如果使用 driven 腳本,測(cè)試有一部分在瀏覽器之外運(yùn)行,而如果使用 test runner 腳本的話,測(cè)試是完全在瀏覽器中運(yùn)行的。
不管是 test runner 還是 driven 測(cè)試用例,都可以與持續(xù)集成工具集成。
test runner 模式
Selenium test runner 腳本,也稱測(cè)試用例(test case),是用 HTML 語(yǔ)言通過(guò)一個(gè)簡(jiǎn)單的表布局編寫(xiě)的,如 清單 1所示。
清單 1. Selenium 測(cè)試用例的結(jié)構(gòu)
clearcase/" target="_blank" >cccccc><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 腳本通常與所測(cè)試的應(yīng)用程序(AUT)部署在同一個(gè)服務(wù)器上。這是因?yàn)?browser bot 使用 JavaScript 來(lái)模擬用戶操作。這些腳本在一個(gè)受限制的沙箱環(huán)境中運(yùn)行。如果需要繞過(guò)這些限制,可以使用一個(gè)代理。