引子:自上世紀末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
圖片出處:www.edureka.co/testing-wit…
組成
- 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 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可以輕鬆搭建一個分散式的自動化測試環境,特別適合執行大規模的測試用例和相容性測試(各個節點執行不同的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)複製程式碼
4 小結
以上就是我對自動化測試的一些見解,歡迎你到我的留言板分享,和大家一起過過招。
至此,有關QE所需掌握的3個基本測試技術的介紹就告一段落。無論是Mock,還是效能測試,自動化測試,本質上都只有一個目的,解放測試人員的生產力,讓測試人員迴歸軟體質量(Quality)本身。如果你想了解更多測試相關的技術,也歡迎到我的留言板留言,以後有機會我會再聊一些這方面的話題。感謝大家的關注。