引子:自上世紀(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自動化測試框架還有:
- 開源:Watir, Sikuli, FitNess
- 商業(yè):HP UFT(QTP), IBM RFT
圖片出處: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生成自動化測試腳本的一般步驟是:
- 選擇Action->Record菜單項或者點擊右上角的小紅點錄制原始測試腳本
- 以調(diào)試模式運行腳本-查看日志-修改腳本直至腳本可以穩(wěn)定的運行
- 保存測試腳本(僅限IDE運行)或者通過File->Export Test Suites As...菜單項導(dǎo)出其他語言的測試腳本(可在命令行下運行)
進一步信息可以參考官方文檔。
3.3 進階:Selenium WebDriver
以Python3 + Firefox為例哲银,
- 命令行下運行
pip install selenium==3.3.0
安裝selenium
- 由于最新版的Selenium Python package不支持Grid毅访,只能降級安裝3.3.0版本
- 下載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為例:
- 啟動Hub: docker run -d -p 4444:4444 --name hub selenium/hub
- 啟動Node-1: docker run -d --link hub:hub --name pnode1 selenium/node-phantomjs
- 啟動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)
4 小結(jié)
以上就是我對自動化測試的一些見解纺阔,歡迎你到我的留言板分享,和大家一起過過招修然。
至此笛钝,有關(guān)QE所需掌握的3個基本測試技術(shù)的介紹就告一段落。無論是Mock愕宋,還是性能測試玻靡,自動化測試,本質(zhì)上都只有一個目的中贝,解放測試人員的生產(chǎn)力囤捻,讓測試人員回歸軟件質(zhì)量(Quality)本身。如果你想了解更多測試相關(guān)的技術(shù)雄妥,也歡迎到我的留言板留言,以后有機會我會再聊一些這方面的話題依溯。感謝大家的關(guān)注老厌。