面向開發的測試技術(三):Web自動化測試
引子:自上世紀末Kent Beck提出TDD(Test-Driven Development)開發理念以來,開發和測試的邊界變的越來越模糊,從原本上下游的依賴關係,逐步演變成你中有我、我中有你的互賴關係,甚至很多公司設立了新的QE(Quality Engineer)職位。和傳統的QA(Quality Assurance)不同,QE的主要職責是通過工程化的手段保證項目質量,這些手段包括但不僅限於編寫單元測試、集成測試,搭建自動化測試流程,設計性能測試等。可以說,QE身上兼具了QA的質量意識和開發的工程能力。我會從開發的角度分三期聊聊QE這個亦測試亦開發的角色所需的基本技能。
1 QE的成人禮:從功能測試到自動化測試
作為QE三部曲的最後一篇,這篇我們聊一下Web自動化測試。相比於前兩篇Mock技術和性能測試,自動化測試可以說是最接近傳統功能測試(也即手工測試)的一種測試技術,也可以說是區分QE和QA的分水嶺。而Web自動化測試作為最常見的一類自動化測試,相關的資料和工具也是最豐富的。
2 自動化測試的利弊
在介紹具體的Web自動化測試技術之前,首先看一下自動化測試和功能測試的區別。在我看來,兩者最大的區別在於測試人員身份的不同。在功能測試中,測試人員既要設計測試用例,又要運行手工測試,既是導演又是演員,既是教練又是球員。而在自動化測試中,演員和球員的角色都被機器所取代,測試人員只負責設計測試用例和編寫自動化測試腳本。除此之外,相對於功能測試,自動化測試的不同還包括:
2.1 自動化測試的優勢
更快的測試速度,帶來更高的測試效率。一般而言,運行一遍功能測試都要以小時為單位,有的甚至以天為單位。而自動化測試則一般都在分鐘級別,如果運行在分散式環境下,甚至可以降到秒級。由此可見,通過自動化測試,測試人員可以省去大量的手工測試時間,從而有更多時間去熟悉業務和完善測試用例,在提高自身測試效率的同時,也有助於提升整體的軟體質量。
提高測試覆蓋率。要理解這一點,首先要從正交測試法說起。假設一個測試場景涉及3個測試因素,每個測試因素有3種可能的取值(水平),那麼根據正交測試法,總共需要設計8個(因素數*(最大水平數-1)+1)測試用例。測試場景越複雜,所需的測試用例越多。當測試場景的複雜度超過一定程度後,純手工的功能測試顯然就無力覆蓋所有的測試用例了,並且隨著複雜度的升高,測試覆蓋率會越來越低。然而,藉助自動化測試腳本,無論測試場景多複雜,都能保證一定的測試覆蓋率。
更好的穩定性和可擴展性。功能測試靠人,自動化測試靠機器,因此,無論是運行測試的穩定性,還是測試能力的可擴展性(比如從測試1個應用變為測試10個應用),自動化測試都遠超功能測試。
根據上面的描述,你就不難推導出自動化測試適用的測試場景了:
回歸測試。每一次應用發布,都伴隨著一次回歸測試。對於重複性的工作,機器顯然更適合。
兼容性測試。不管是Web測試,還是App測試,兼容性測試都是必不可少的一環。以Web測試為例,同樣的測試用例,需要在不同的瀏覽器上分別運行一遍,這對測試人員而言不可謂不是一種折磨。
大規模測試。如果一次測試涉及的測試用例過多(比如100+),功能測試難免會有遺漏或者重複,而自動化測試可以輕鬆確保一個不少,一個也不多。
一圖以蔽之,自動化測試的優勢可概括為下圖:
2.2 自動化測試的局限
說了這麼多自動化測試的好處,但自動化測試也不是萬能的,再來看一下它的局限所在:
- 不低的技術門檻。不論是使用哪種自動化測試框架,對於測試人員而言,都存在一定的技術門檻,一般至少需要學習並掌握一門編程語言。
- 可觀的開發成本和維護成本。跟任何程序一樣,無論是編寫自動化測試腳本,還是在需求變化時修改腳本,都需要花費大量的時間。
- 需求要穩定。自動化測試的前提是測試用例要穩定,而測試用例穩定的前提是需求要穩定。對於臨時的或者說一次性的需求,自動化測試往往是得不償失的。
- 應用周期長。應用的生命周期越長,自動化測試節省的時間越多,帶來的價值也越大。
應該說,功能測試是自動化測試的基礎,自動化測試是功能測試的補充,兩者相互依賴,又相互促進。測試人員兩手都要抓,兩手都要硬。
3 如何進行Web自動化測試?
接下來我以Selenium為例,介紹一下如何進行Web自動化測試。
3.1 Selenium簡介
Selenium是目前最流行的Web自動化測試框架之一,支持主流的瀏覽器和操作系統,同時支持多種編程語言接入。無論是測試,還是開發,都可以輕鬆上手。最新的版本是3.4.0。
同類的Web自動化測試框架還有:
- 開源:Watir, Sikuli, FitNess
- 商業:HP UFT(QTP), IBM RFT
圖片出處:https://www.edureka.co /testing-with-selenium-webdriver
組成
- Selenium IDE: 一款Firefox插件,以圖形化方式支持錄製腳本、自動生成腳本等功能。用於本地開發和調試TC(Test Case)。
- Selenium WebDriver: 通過各瀏覽器廠商提供的原生Driver,指揮瀏覽器進行各類頁面操作。
圖片出處:Join the darkside: Selenium testing with Nightwatch.js
- Selenium RC(已廢棄): 通過植入統一的JS腳本,指揮瀏覽器進行各類頁面操作。兼容性比較差,2.0以後已廢棄。
- Selenium Grid: 適用於分散式環境下運行大量的TC,Hub根據TC的環境要求分發給各個符合條件的Node執行。
圖片出處:Join the darkside: Selenium testing with Nightwatch.js
特性
- 多瀏覽器支持:除了三大瀏覽器Firefox, Chrome, IE之外,還支持Android, iOS內置的瀏覽器。
- 多平台支持:三大操作系統Linux, Mac, Windows上面都可以運行。
- 多語言支持:可以用Python, Java, Node, Ruby等編寫TC。
- 錄製腳本(僅限IDE):記錄Firefox上的各類頁面操作,自動生成HTML格式的TC。
- 自動生成腳本(僅限IDE):將錄製的HTML格式的TC轉化成任意其他語言的TC。
- Headless:支持在命令行下,執行各類TC腳本。
- 分散式支持:通過Selenium Grid將TC分發到各個節點執行。
3.2 入門:Selenium IDE
首先安裝Firefox,然後下載Selenium IDE插件。通過Firefox的Tools->Selenium IDE菜單項可以啟動Selenium IDE,操作界面如下:
使用Selenium IDE生成自動化測試腳本的一般步驟是:
- 選擇Action->Record菜單項或者點擊右上角的小紅點錄製原始測試腳本
- 以調試模式運行腳本-查看日誌-修改腳本直至腳本可以穩定的運行
- 保存測試腳本(僅限IDE運行)或者通過File->Export Test Suites As…菜單項導出其他語言的測試腳本(可在命令行下運行)進一步信息可以參考官方文檔。
3.3 進階:Selenium WebDriver
以Python3 + Firefox為例,
1) 命令行下運行pip install selenium==3.3.0安裝selenium
- 由於最新版的Selenium Python package不支持Grid,只能降級安裝3.3.0版本
2) 下載Mozilla GeckoDriver,解壓然後添加到系統Path
準備就緒後,打開命令行,試著運行之前從Selenium IDE導出的Python測試腳本,也可以直接手寫腳本。
示例腳本:
from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECbrowser = webdriver.Firefox()browser.get(http://www.baidu.com/)assert 百度一下,你就知道 == browser.titlekw = 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可以輕鬆搭建一個分散式的自動化測試環境,特別適合運行大規模的測試用例和兼容性測試(各個節點運行不同的WebDriver)。
利用官方提供的Docker鏡像,可以在本地啟動多個容器來搭建一個Selenium Grid環境,以2個運行phantomjs WebDriver的節點的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的服務地址,就可以通過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 小結
以上就是我對自動化測試的一些見解,歡迎你到我的留言板分享,和大家一起過過招。
至此,有關QE所需掌握的3個基本測試技術的介紹就告一段落。無論是Mock,還是性能測試,自動化測試,本質上都只有一個目的,解放測試人員的生產力,讓測試人員回歸軟體質量(Quality)本身。如果你想了解更多測試相關的技術,也歡迎到我的留言板留言,以後有機會我會再聊一些這方面的話題。感謝大家的關注。
推薦閱讀:
※遇到這樣的HR,我們必須要懟他!
※一次壯烈犧牲的阿里巴巴面試
※中國成長好應用12月20日報,「智動校園」體驗不同
※搭建Robotframwork+Python+Selenium自動化測試環境(包括Jython)
※學習軟體測試從哪幾個方面學習呢?