前言
蛇油還是銀彈?
Snake oil 在英諺中指“騙人的萬靈油”,用來指那些宣稱萬靈卻實際沒什么用處的騙人把戲。
silver bullet則指能解決難題的特殊的有效手段。來源于銀彈可殺死吸血鬼的傳說。
而在軟件研發領域,針對自動化測試,也常常能聽到類似這兩種說法的不同觀點:
一種認為自動化測試是測試領域的銀彈,是加快測試進度和壓縮測試成本的必行手段,是測試領域的必然發展趨勢,測試人員甚至會因為自動化測試的發展而失業。
另一種觀點則完全相反,認為自動化測試不過是為了KPI而編造出來的額外負擔,實際上根本無法承擔大部分的測試功能,反而引入了更多工作和投入。
筆者作為在軟件測試領域十五年的老兵,且專職從事自動化測試相關工作超過10年,借本文來談談自動化測試到底是什么?自動化測試應該做什么?
何為自動化測試
自動化測試與測試自動化
這里我們必須要厘清兩個概念,自動化測試(automated testing)和測試自動化(test automation),它們其實是兩個含義差別比較大的概念。
自動化測試(automated testing),這里的測試是動名詞,更多指測試的完整流程,覆蓋測試的各方面。而自動化測試是測試全流程中各個環節自動化的程度。
測試自動化(test automation),這里的測試是名詞,是測試這個具體的行為,更像是Testing的實例。測試自動化把測試這個行為進行了自動化。
通過以上兩個概念的解釋,我們可以看到,自動化測試比測試自動化涵蓋的范圍要更加廣泛。國內軟件測試行業一般不太提測試自動化這個說法,所以我們簡單把自動化測試分為廣義和狹義來對應automated testing和test automation。
實際上大家在說到自動化測試時往往更多指的其實是test automation。本文提到自動化測試時一般也理解為狹義的自動化測試即test automation。
定義
百度百科對自動化測試的定義
自動化測試是把以人為驅動的測試行為轉化為機器執行的一種過程。通常,在設計了測試用例并通過評審之后,由測試人員根據測試用例中描述的規程一步步執行測試,得到實際結果與期望結果的比較。在此過程中,為了節省人力、時間或硬件資源,提高測試效率,便引入了自動化測試的概念。
Wikipedia對Test Automation的定義
測試自動化是使用特殊的軟件(區別于被測軟件)來控制測試執行并且對實際輸出及預期結果進行比對的行為。測試自動化能將正式測試流程中一些必要但重復的任務自動化,或提供更多人力很難完成的測試工作。測試自動化對持續發布和持續測試至關重要。
(test automation is the use of special software(separate from the software being tested) to control the execution of tests and the comparison of actual outcomes with predicted outcomes.[1]Test automation can automate some repetitive but necessary tasks in a formalized testing process already in place, or perform additional testing that would be difficult to do manually. Test automation is critical for continuous deliveryand continuous testing.)
從以上定義,我們可以認為自動化測試(狹義)就是把測試執行中一些工作自動化的過程。
自動化測試的優缺點
自動化測試目前在測試行業,其實是整個軟件行業可以說是如日中天,大有無自動不研發之勢。但是我們還是要理性地看待自動化測試,下面簡單談談自動化測試的優缺點
缺點
軟件行業發展到現階段,特別是人工智能、機器學習的發展,可以看到機器智能化的趨勢已成。而自動化測試的發展,在軟件測試行業似乎也成了這一趨勢的最佳注腳。但自動化測試真的能代替人力測試么?至少現階段及可預見的未來多年還不現實。
軟件測試是一系列創造性活動的集成,包括探索、挖掘、分析、溝通等一系列依賴人類創造性的技能。而自動化測試,從上文定義中我們也可看到,目前還只能更多在測試執行這個層面幫助完成一些重復性的任務。在實踐中,我們也知道,自動化測試在軟件測試的核心能力-缺陷發現能力上表現并不好。
所以可以說,至少現階段,自動化測試存在一個最大的缺點:缺乏創造性,難以承擔軟件測試中的核心任務-發現缺陷。
除此之外,自動化測試當然還有些其他的缺點如:
• 建設成本較高,包括啟動成本和維護成本
• 被測對象對自動化測試影響較大,而成功實施自動化測試往往需要被測對象提供額外支撐
• 工具、環境依賴大
優點
自動化測試雖然有重大缺點,但是卻在軟件研發中變得越來越重要,自然有它不可替代的獨到之處。
和歷史上所有的進化類似,無論是從刀耕火種到鐵犁牛耕,從珍妮機到蒸汽機,還是從生產作坊到流水線,無不伴隨生產效率的巨大進步。
自動化測試的最大優點就是兩個字:效率
自動化測試在執行效率上的巨大優勢是其得以壯大的立身之本。通過自動化測試,可以快速完成已有功能的快速驗證并給出反饋,這在現代快速研發時代至關重要。后文我們還會展開來談。
除此之外,自動化測試還有如下一些不可忽視的優點:
• 精確,可靠。自動化測試不會因為不同時間、不同設備上執行產生不同的行為路徑。
• 不需要休息,24小時干活不嫌累。
• 高復用性、繼承性。知識沉淀是自帶屬性
黃金圈法則看自動化測試
黃金圈法則是西蒙·斯涅克發現的一個著名行事準則。在其暢銷書《從為什么開始:喬布斯讓Apple紅遍世界的黃金圈法則》中提出。
即一般人做事往往先從外向內思維,先看要做啥,再想怎么做,最后才會想為什么去做。而很多成功的領袖人物會先從內圈向外圈進行思考:
• WHY:我的目標是什么?先搞清楚愿景、要達到的目的
• HOW:如何實現我的目標?解決怎么做的問題,確定方法、策略
• WHAT:要做什么?這就是執行層面上怎么去具體地實施。
具體到自動化測試上,我們也參照此法則來梳理一下自動化測試的思路
為何實施自動化測試?(WHY)
上篇分析自動化測試的優缺點已經談到,自動化測試有其重大缺點,也有顯著優點。那為什么我們要推行自動化測試呢?
首先我們要確認一個事實:那就是在軟件研發中,開發和測試工作是相輔相成的,但卻并不對等。產品發布時開發的工作是增量的,但測試卻不是增量。產品每個版本發布,功能在原有基礎上是增量的,但是測試工作是對完整的產品質量進行檢驗,所以歷史版本的功能在每次發布時也會包含在測試范圍內,這個意義上來說,測試工作任務量更多。
另外我們再看目前軟件業界的產品現狀和測試目標。隨著互聯網、移動互聯網、物聯網的發展,現在的產品研發強調快速迭代,傳統軟件動輒幾個月的發布周期被壓縮到每周發布甚至每天發布。那產品質量如何保證?怎么最大程度保證產品更新不出問題?
正因如此,自動化測試盡管在測試工作的核心功能-缺陷發現能力上表現不佳,但是因其高效執行、快速反饋結果的特點成為現代軟件研發體系如敏捷研發、持續集成中的不二之選。非吾愿往,實不得不往矣。
那么WHY就很清楚了:實施自動化測試,目標是要提升軟件研發中測試的執行效率,快速反饋結果,提供對變更對歷史功能影響的質量信心(擴大覆蓋率)。
如何實施自動化測試?(HOW)
確定自動化測試的目標了,下一步我們來看如何開展自動化測試呢?
要分析這個問題,我們需要先看看軟件測試需要做些什么,軟件測試按階段一般分成單元測試、集成測試、系統測試、驗收測試。按類型又可分為功能測試、性能測試、兼容性測試、部署安裝測試、易用性測試、安全測試、本地化測試、文檔測試、可靠性測試、無障礙測試等(以上測試概念可以參看我的免費公開課《軟件測試基礎-概念篇》,此處不展開了)。結合測試階段、測試類型其實可以確定我們實施自動化測試的時機和范圍。
再回到目標:提升執行效率,擴大覆蓋率。所以HOW需要圍繞這個目標,不能因為自動化的實施影響效率或者對效率提升微小,另外需要盡可能優先實施覆蓋率高的部分。
這里我們再來看看著名的自動化測試金字塔:
測試金字塔基于這樣的觀點:測試是分層的,從上到下對應測試對象的不同層級,分別是上層的UI界面測試,中層的服務測試和底層的單元測試。而實施自動化測試的效果是由上到下越來越好,即越接近底層的自動化測試收益越高。
這也很容易理解,越接近底層的自動化,越為穩定,受到的干擾越少,所以其效率越高,成本越少。
那么再結合WHY的幾個關鍵詞:效率、結果、信心, HOW的結論可以如下:
自動化測試優先針對穩定的,少干擾的部分實施,通過各種手段提升效率為主,平衡測試覆蓋率和實施成本,并清晰快速地給出執行結果
自動化測試做些什么?(WHAT)
進入實施層面,那就是針對自動化測試策略(HOW)來確定我們具體使用的自動化工具,然后借助自動化測試框架或平臺來保證實施效率、執行效率和結果輸出。
這里有如下一些重要工作:
雖然測試金字塔顯示了自動化測試的選擇原則,但是并是不說我們只需要關注Unit自動化測試即可,不同層面的測試對象對最終質量信心的建立都有重大影響,所以自動化測試在每層上都有實施必要,只是側重點可以有所區別。
然后就是針對測試對象來確定對應的工具。不同測試對象會有大量不同的工具可以選型。一般提到自動化測試主要是針對功能測試,因為功能測試是軟件測試的絕對主要范圍。所以工具的選型就很重要。
Unit功能測試更多會借助不同編程語言的Xunit來實施。
API層面會有不同的接口測試工具如各種工具庫以及postman、fiddler、soapui等工具
UI層面的功能測試工具就更多了,
web應用有
Selenium,QTP,移動應用自動化測試有UiAutomator、Robotium、Appium,桌面應用有QTP,Autoit,sikuli等等。
而除了功能測試外,還有如
性能測試、穩定性測試、安全測試這樣必須要借助工具完成的測試類型。
性能測試可選工具有LoadRunner、Jmter、Tsung、Locust等,安全測試有appscan、webinspect、fotify、webscarab等。
不同自動化測試工具的使用是自動化測試中的一個重要方面,但不是本文介紹重點,大家可以根據需要選擇對應測試類型的工具重點學習。
構建自動化測試框架或平臺
確定實施自動化的工具后,為了進一步提高自動化測試的效率,我們還需要通過自動化測試框架或者更高一層的自動化測試平臺來對自動化測試的開發、實施過程進行管理、整合。當然上面提到的很多自動化測試工具也提供了一些框架層面的功能,但是真正重心在框架層面的還是如STAF/X、RobotFramework、Cucumber這樣的框架工具。當然很多框架本身也會內建許多工具層面的功能。
通過測試框架的使用,能大幅提高復雜業務測試場景的組織和管理,減少自動化測試的啟動成本和維護成本。
測試框架一般通過不同的分層來完成自動化測試的組織。
-
適配層:適配不同類型的測試對象,如GUI界面、API接口、web service、database、通信協議等
-
執行層:完成測試任務的調度執行,log記錄、結果報告
-
測試設計層: 包括設計測試用例(腳本)、測試環境配置、初始化配置、測試數據、測試庫等
-
測試輸入層:對接外部輸入如測試場景定義、測試模板
通過測試框架或平臺,自動化測試還可以和外部系統如
項目管理、配置管理、測試管理系統實現良好的交互和集成。
自動化測試實施
工具、框架層面確定并完成構建后,則需要針對具體的業務場景來進行實施。包括測試腳本的開發,調試,測試環境的部署、測試結果的輸出、報告。這部分工作也是我們自動化測試的主體部分。
在自動測試實施中,通過本人對大量項目實施情況的觀察,有以下幾點推薦關注的關鍵:
-
自動化測試不能脫離業務,需要比較緊密地和需求、測試點進行關聯或通過內建文檔形式體現。此處推薦 《實例化需求》一書,其主導思想對于自動化測試在研發流程中發揮價值有很強的實踐意義。
-
自動化測試必定是和測試環境緊密相關的。所以針對環境、初始數據等的處理在自動化測試中應該作為一個非常重要的部分。自動化腳本受環境影響越小,執行越穩定,則價值越高。
-
按測試金字塔原則來確定實施優先級。API層面的自動化測試可以作為實施重點。兼顧業務邏輯和ROI。作為最終表現層面的case,GUI層面的自動化也不可或缺,只是覆蓋面盡可能覆蓋smoke test即可。單元測試是代碼層面的基礎,覆蓋率越高越好,但是需要有ROI的平衡考量。
-
自動化測試本身也體現到代碼上,所以和代碼管理相關的實踐和要求,對自動化測試同樣適用。包括版本管理、配置管理,忽略這部分對自動化測試代碼的長期維護是非常不利的。
-
自動化測試不應是某些專職自動化測試人員的工作,應該是所有項目成員工作的一部分。它只是測試工作的一個實現手段,不應該單獨獨立出來脫離實際測試人員的思路來單獨實施。
良好的自動化實施是自動化測試是否成功的關鍵
接入研發流程工具鏈
自動化測試不可能脫離研發整體流程,需要為整理流程服務。軟件研發流程在推進持續集成中必然會引入相關的工具鏈。自動化測試接入工具鏈是發揮自動化測試價值和提升研發效率的重要措施。
持續集成工具不管是Jenkins、teamcity還是bamboo、codeship其實作用基本類似,對于自動測試接入來說。重點做好以下幾點:
-
方便地調度控制。盡可能通過shell或cmd腳本來觸發調用,復雜些的調度控制如分布式測試可以通過一個專門的調度代理來完成
-
可視化的測試報告反饋和通知機制。測試結果在運行后及時反饋到CI工具并通過郵件、短信等通知機制告知干系人。
-
異常定位、分析手段。包括日志、監控、異常狀態應對清單等對于出現問題時的快速解決意義重大
結語
自動化測試是現代軟件研發流程中不得不為地必要組成部分,但是其不是萬能藥,把自動化測試用好,重點是聚焦在其能發揮最大價值的所在。通過合理地規劃和框架設計,有效地實施和流程控制,為團隊共贏提供助力。
展望未來,借助人工智能的發展,自動化測試或許會向更聰明,覆蓋范圍更廣泛的方向發展,但一切都需要我們立足當下,逐步探索,最終實現生產力地充分解放