面向開發(fā)的測試技術(shù)(三):Web自動化測試

引子:自上世紀(jì)末Kent Beck提出TDD(Test-Driven Development)開發(fā)理念以來,開發(fā)和測試的邊界變的越來越模糊,從原本上下游的依賴關(guān)系歪沃,逐步演變成你中有我日月、我中有你的互賴關(guān)系,甚至很多公司設(shè)立了新的QE(Quality Engineer)職位燃箭。和傳統(tǒng)的QA(Quality Assurance)不同昏苏,QE的主要職責(zé)是通過工程化的手段保證項目質(zhì)量肴盏,這些手段包括但不僅限于編寫單元測試芋浮、集成測試抱环,搭建自動化測試流程,設(shè)計性能測試等纸巷≌虿荩可以說,QE身上兼具了QA的質(zhì)量意識和開發(fā)的工程能力瘤旨。我會從開發(fā)的角度分三期聊聊QE這個亦測試亦開發(fā)的角色所需的基本技能梯啤。

前情概要:

1 QE的成人禮:從功能測試到自動化測試

作為QE三部曲的最后一篇,這篇我們聊一下Web自動化測試存哲。相比于前兩篇Mock技術(shù)和性能測試条辟,自動化測試可以說是最接近傳統(tǒng)功能測試(也即手工測試)的一種測試技術(shù),也可以說是區(qū)分QE和QA的分水嶺宏胯。而Web自動化測試作為最常見的一類自動化測試,相關(guān)的資料和工具也是最豐富的本姥。

2 自動化測試的利弊

在介紹具體的Web自動化測試技術(shù)之前肩袍,首先看一下自動化測試和功能測試的區(qū)別。在我看來婚惫,兩者最大的區(qū)別在于測試人員身份的不同氛赐。在功能測試中,測試人員既要設(shè)計測試用例先舷,又要運行手工測試艰管,既是導(dǎo)演又是演員,既是教練又是球員蒋川。而在自動化測試中牲芋,演員和球員的角色都被機器所取代,測試人員只負(fù)責(zé)設(shè)計測試用例和編寫自動化測試腳本捺球。除此之外缸浦,相對于功能測試,自動化測試的不同還包括:

2.1 自動化測試的優(yōu)勢

  • 更快的測試速度氮兵,帶來更高的測試效率裂逐。一般而言,運行一遍功能測試都要以小時為單位泣栈,有的甚至以天為單位卜高。而自動化測試則一般都在分鐘級別弥姻,如果運行在分布式環(huán)境下,甚至可以降到秒級掺涛。由此可見庭敦,通過自動化測試,測試人員可以省去大量的手工測試時間鸽照,從而有更多時間去熟悉業(yè)務(wù)和完善測試用例螺捐,在提高自身測試效率的同時,也有助于提升整體的軟件質(zhì)量矮燎。
  • 提高測試覆蓋率定血。要理解這一點,首先要從正交測試法說起诞外。假設(shè)一個測試場景涉及3個測試因素澜沟,每個測試因素有3種可能的取值(水平),那么根據(jù)正交測試法峡谊,總共需要設(shè)計8個(因素數(shù)*(最大水平數(shù)-1)+1)測試用例茫虽。測試場景越復(fù)雜,所需的測試用例越多既们。當(dāng)測試場景的復(fù)雜度超過一定程度后濒析,純手工的功能測試顯然就無力覆蓋所有的測試用例了,并且隨著復(fù)雜度的升高啥纸,測試覆蓋率會越來越低号杏。然而,借助自動化測試腳本斯棒,無論測試場景多復(fù)雜盾致,都能保證一定的測試覆蓋率。
  • 更好的穩(wěn)定性和可擴展性荣暮。功能測試靠人庭惜,自動化測試靠機器,因此穗酥,無論是運行測試的穩(wěn)定性护赊,還是測試能力的可擴展性(比如從測試1個應(yīng)用變?yōu)闇y試10個應(yīng)用),自動化測試都遠(yuǎn)超功能測試砾跃。

根據(jù)上面的描述百揭,你就不難推導(dǎo)出自動化測試適用的測試場景了:

  • 回歸測試。每一次應(yīng)用發(fā)布蜓席,都伴隨著一次回歸測試器一。對于重復(fù)性的工作,機器顯然更適合厨内。
  • 兼容性測試祈秕。不管是Web測試渺贤,還是App測試,兼容性測試都是必不可少的一環(huán)请毛。以Web測試為例志鞍,同樣的測試用例,需要在不同的瀏覽器上分別運行一遍方仿,這對測試人員而言不可謂不是一種折磨固棚。
  • 大規(guī)模測試。如果一次測試涉及的測試用例過多(比如100+)仙蚜,功能測試難免會有遺漏或者重復(fù)此洲,而自動化測試可以輕松確保一個不少,一個也不多委粉。

一圖以蔽之呜师,自動化測試的優(yōu)勢可概括為下圖:

2.2 自動化測試的局限

說了這么多自動化測試的好處,但自動化測試也不是萬能的贾节,再來看一下它的局限所在:

  • 不低的技術(shù)門檻汁汗。不論是使用哪種自動化測試框架,對于測試人員而言栗涂,都存在一定的技術(shù)門檻知牌,一般至少需要學(xué)習(xí)并掌握一門編程語言。
  • 可觀的開發(fā)成本和維護成本斤程。跟任何程序一樣送爸,無論是編寫自動化測試腳本,還是在需求變化時修改腳本暖释,都需要花費大量的時間。
  • 需求要穩(wěn)定墨吓。自動化測試的前提是測試用例要穩(wěn)定球匕,而測試用例穩(wěn)定的前提是需求要穩(wěn)定。對于臨時的或者說一次性的需求帖烘,自動化測試往往是得不償失的亮曹。
  • 應(yīng)用周期長。應(yīng)用的生命周期越長秘症,自動化測試節(jié)省的時間越多照卦,帶來的價值也越大。

應(yīng)該說乡摹,功能測試是自動化測試的基礎(chǔ)役耕,自動化測試是功能測試的補充,兩者相互依賴聪廉,又相互促進瞬痘。測試人員兩手都要抓故慈,兩手都要硬。

3 如何進行Web自動化測試框全?

接下來我以Selenium為例察绷,介紹一下如何進行Web自動化測試。

3.1 Selenium簡介

Selenium是目前最流行的Web自動化測試框架之一津辩,支持主流的瀏覽器和操作系統(tǒng)拆撼,同時支持多種編程語言接入。無論是測試喘沿,還是開發(fā)闸度,都可以輕松上手。最新的版本是3.4.0摹恨。

同類的Web自動化測試框架還有:

圖片出處:https://www.edureka.co/testing-with-selenium-webdriver

組成

  • Selenium IDE: 一款Firefox插件筋岛,以圖形化方式支持錄制腳本、自動生成腳本等功能晒哄。用于本地開發(fā)和調(diào)試TC(Test Case)睁宰。
  • Selenium WebDriver: 通過各瀏覽器廠商提供的原生Driver,指揮瀏覽器進行各類頁面操作寝凌。

圖片出處:Join the darkside: Selenium testing with Nightwatch.js

  • Selenium RC(已廢棄): 通過植入統(tǒng)一的JS腳本柒傻,指揮瀏覽器進行各類頁面操作。兼容性比較差较木,2.0以后已廢棄红符。
  • Selenium Grid: 適用于分布式環(huán)境下運行大量的TC,Hub根據(jù)TC的環(huán)境要求分發(fā)給各個符合條件的Node執(zhí)行伐债。

圖片出處:Join the darkside: Selenium testing with Nightwatch.js

特性

  • 多瀏覽器支持:除了三大瀏覽器Firefox, Chrome, IE之外预侯,還支持Android, iOS內(nèi)置的瀏覽器。
  • 多平臺支持:三大操作系統(tǒng)Linux, Mac, Windows上面都可以運行峰锁。
  • 多語言支持:可以用Python, Java, Node, Ruby等編寫TC萎馅。
  • 錄制腳本(僅限IDE):記錄Firefox上的各類頁面操作,自動生成HTML格式的TC虹蒋。
  • 自動生成腳本(僅限IDE):將錄制的HTML格式的TC轉(zhuǎn)化成任意其他語言的TC糜芳。
  • Headless:支持在命令行下,執(zhí)行各類TC腳本魄衅。
  • 分布式支持:通過Selenium Grid將TC分發(fā)到各個節(jié)點執(zhí)行峭竣。

3.2 入門:Selenium IDE

首先安裝Firefox,然后下載Selenium IDE插件晃虫。通過Firefox的Tools->Selenium IDE菜單項可以啟動Selenium IDE皆撩,操作界面如下:

使用Selenium IDE生成自動化測試腳本的一般步驟是:

  1. 選擇Action->Record菜單項或者點擊右上角的小紅點錄制原始測試腳本
  2. 以調(diào)試模式運行腳本-查看日志-修改腳本直至腳本可以穩(wěn)定的運行
  3. 保存測試腳本(僅限IDE運行)或者通過File->Export Test Suites As...菜單項導(dǎo)出其他語言的測試腳本(可在命令行下運行)

進一步信息可以參考官方文檔

3.3 進階:Selenium WebDriver

以Python3 + Firefox為例哲银,

  1. 命令行下運行pip install selenium==3.3.0安裝selenium
  • 由于最新版的Selenium Python package不支持Grid毅访,只能降級安裝3.3.0版本
  1. 下載Mozilla GeckoDriver沮榜,解壓然后添加到系統(tǒng)Path

準(zhǔn)備就緒后,打開命令行喻粹,試著運行之前從Selenium IDE導(dǎo)出的Python測試腳本蟆融,也可以直接手寫腳本。

示例腳本:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')
assert '百度一下守呜,你就知道' == browser.title
kw = browser.find_element_by_id("kw");
kw.send_keys('selenium')
kw.send_keys(Keys.RETURN)

WebDriverWait(browser, 10).until(EC.title_contains('selenium_百度搜索'))
assert browser.find_element_by_css_selector("div.nums").is_displayed()
print("Test pass!")
browser.quit()

進一步信息可以參考官方文檔Selenium Python API型酥。

3.4 高階:Selenium Grid

前面提到,使用Selenium Grid可以輕松搭建一個分布式的自動化測試環(huán)境查乒,特別適合運行大規(guī)模的測試用例和兼容性測試(各個節(jié)點運行不同的WebDriver)弥喉。

利用官方提供的Docker鏡像,可以在本地啟動多個容器來搭建一個Selenium Grid環(huán)境玛迄,以2個運行phantomjs WebDriver的節(jié)點的Grid為例:

  1. 啟動Hub: docker run -d -p 4444:4444 --name hub selenium/hub
  2. 啟動Node-1: docker run -d --link hub:hub --name pnode1 selenium/node-phantomjs
  3. 啟動Node-2: docker run -d --link hub:hub --name pnode2 selenium/node-phantomjs

等所有容器成功啟動之后由境,打開瀏覽器訪問http://<ip-of-local-docker-machine:4444>,就可以看到Selenium Grid的控制臺了蓖议。

然后修改測試腳本指向本地Selenium Grid的服務(wù)地址虏杰,就可以通過Selenium Grid運行測試了。

browser = webdriver.Remote(
    command_executor="http://192.168.99.100:4444/wd/hub", 
    desired_capabilities={'browserName': 'phantomjs'})
browser.implicitly_wait(30)

進一步信息信息參考官方文檔Wiki勒虾。

4 小結(jié)

以上就是我對自動化測試的一些見解纺阔,歡迎你到我的留言板分享,和大家一起過過招修然。

至此笛钝,有關(guān)QE所需掌握的3個基本測試技術(shù)的介紹就告一段落。無論是Mock愕宋,還是性能測試玻靡,自動化測試,本質(zhì)上都只有一個目的中贝,解放測試人員的生產(chǎn)力囤捻,讓測試人員回歸軟件質(zhì)量(Quality)本身。如果你想了解更多測試相關(guān)的技術(shù)雄妥,也歡迎到我的留言板留言,以后有機會我會再聊一些這方面的話題依溯。感謝大家的關(guān)注老厌。

5 參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市黎炉,隨后出現(xiàn)的幾起案子枝秤,更是在濱河造成了極大的恐慌,老刑警劉巖慷嗜,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淀弹,死亡現(xiàn)場離奇詭異丹壕,居然都是意外死亡,警方通過查閱死者的電腦和手機薇溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門菌赖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沐序,你說我怎么就攤上這事琉用。” “怎么了策幼?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵邑时,是天一觀的道長。 經(jīng)常有香客問我特姐,道長晶丘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任唐含,我火速辦了婚禮浅浮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘觉壶。我一直安慰自己脑题,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布铜靶。 她就那樣靜靜地躺著叔遂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪争剿。 梳的紋絲不亂的頭發(fā)上已艰,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音蚕苇,去河邊找鬼哩掺。 笑死,一個胖子當(dāng)著我的面吹牛涩笤,可吹牛的內(nèi)容都是我干的嚼吞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蹬碧,長吁一口氣:“原來是場噩夢啊……” “哼舱禽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恩沽,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤誊稚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體里伯,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡城瞎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疾瓮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脖镀。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖爷贫,靈堂內(nèi)的尸體忽然破棺而出认然,到底是詐尸還是另有隱情,我是刑警寧澤漫萄,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布卷员,位于F島的核電站,受9級特大地震影響腾务,放射性物質(zhì)發(fā)生泄漏毕骡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一岩瘦、第九天 我趴在偏房一處隱蔽的房頂上張望未巫。 院中可真熱鬧,春花似錦启昧、人聲如沸叙凡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽握爷。三九已至,卻和暖如春严里,著一層夾襖步出監(jiān)牢的瞬間新啼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工刹碾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留燥撞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓迷帜,卻偏偏與公主長得像物舒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子戏锹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容