前言
蛇油還是銀彈叫搁?
Snake oil 在英諺中指“騙人的萬靈油”甩鳄,用來指那些宣稱萬靈卻實際沒什么用處的騙人把戲逞度。
silver bullet則指能解決難題的特殊的有效手段。來源于銀彈可殺死吸血鬼的傳說妙啃。
而在軟件研發(fā)領(lǐng)域档泽,針對自動化測試,也常常能聽到類似這兩種說法的不同觀點:
一種認為自動化測試是測試領(lǐng)域的銀彈彬祖,是加快測試進度和壓縮測試成本的必行手段茁瘦,是測試領(lǐng)域的必然發(fā)展趨勢品抽,測試人員甚至?xí)驗樽詣踊瘻y試的發(fā)展而失業(yè)储笑。
另一種觀點則完全相反,認為自動化測試不過是為了KPI而編造出來的額外負擔(dān)圆恤,實際上根本無法承擔(dān)大部分的測試功能突倍,反而引入了更多工作和投入。
筆者作為在軟件測試領(lǐng)域十五年的老兵盆昙,且專職從事自動化測試相關(guān)工作超過10年羽历,借本文來談?wù)勛詣踊瘻y試到底是什么?自動化測試應(yīng)該做什么淡喜?
何為自動化測試
自動化測試與測試自動化
這里我們必須要厘清兩個概念秕磷,自動化測試(automated testing)和測試自動化(test automation),它們其實是兩個含義差別比較大的概念炼团。
自動化測試(automated testing)澎嚣,這里的測試是動名詞,更多指測試的完整流程,覆蓋測試的各方面俱笛。而自動化測試是測試全流程中各個環(huán)節(jié)自動化的程度朵纷。
測試自動化(test automation),這里的測試是名詞晤郑,是測試這個具體的行為敌呈,更像是Testing的實例。測試自動化把測試這個行為進行了自動化造寝。
通過以上兩個概念的解釋磕洪,我們可以看到,自動化測試比測試自動化涵蓋的范圍要更加廣泛诫龙。國內(nèi)軟件測試行業(yè)一般不太提測試自動化這個說法褐鸥,所以我們簡單把自動化測試分為廣義和狹義來對應(yīng)automated testing和test automation。
實際上大家在說到自動化測試時往往更多指的其實是test automation赐稽。本文提到自動化測試時一般也理解為狹義的自動化測試即test automation叫榕。
定義
百度百科對自動化測試的定義
自動化測試是把以人為驅(qū)動的測試行為轉(zhuǎn)化為機器執(zhí)行的一種過程。通常姊舵,在設(shè)計了測試用例并通過評審之后晰绎,由測試人員根據(jù)測試用例中描述的規(guī)程一步步執(zhí)行測試,得到實際結(jié)果與期望結(jié)果的比較括丁。在此過程中荞下,為了節(jié)省人力、時間或硬件資源史飞,提高測試效率尖昏,便引入了自動化測試的概念。
Wikipedia對Test Automation的定義
測試自動化是使用特殊的軟件(區(qū)別于被測軟件)來控制測試執(zhí)行并且對實際輸出及預(yù)期結(jié)果進行比對的行為构资。測試自動化能將正式測試流程中一些必要但重復(fù)的任務(wù)自動化抽诉,或提供更多人力很難完成的測試工作。測試自動化對持續(xù)發(fā)布和持續(xù)測試至關(guān)重要吐绵。
(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.)
從以上定義迹淌,我們可以認為自動化測試(狹義)就是把測試執(zhí)行中一些工作自動化的過程。
自動化測試的優(yōu)缺點
自動化測試目前在測試行業(yè)己单,其實是整個軟件行業(yè)可以說是如日中天唉窃,大有無自動不研發(fā)之勢。但是我們還是要理性地看待自動化測試纹笼,下面簡單談?wù)勛詣踊瘻y試的優(yōu)缺點
缺點
軟件行業(yè)發(fā)展到現(xiàn)階段纹份,特別是人工智能、機器學(xué)習(xí)的發(fā)展廷痘,可以看到機器智能化的趨勢已成蔓涧。而自動化測試的發(fā)展削咆,在軟件測試行業(yè)似乎也成了這一趨勢的最佳注腳。但自動化測試真的能代替人力測試么蠢笋?至少現(xiàn)階段及可預(yù)見的未來多年還不現(xiàn)實拨齐。
軟件測試是一系列創(chuàng)造性活動的集成,包括探索昨寞、挖掘瞻惋、分析、溝通等一系列依賴人類創(chuàng)造性的技能援岩。而自動化測試歼狼,從上文定義中我們也可看到,目前還只能更多在測試執(zhí)行這個層面幫助完成一些重復(fù)性的任務(wù)享怀。在實踐中羽峰,我們也知道,自動化測試在軟件測試的核心能力-缺陷發(fā)現(xiàn)能力上表現(xiàn)并不好添瓷。
所以可以說梅屉,至少現(xiàn)階段,自動化測試存在一個最大的缺點:缺乏創(chuàng)造性鳞贷,難以承擔(dān)軟件測試中的核心任務(wù)-發(fā)現(xiàn)缺陷坯汤。
除此之外,自動化測試當(dāng)然還有些其他的缺點如:
? 建設(shè)成本較高搀愧,包括啟動成本和維護成本
? 被測對象對自動化測試影響較大惰聂,而成功實施自動化測試往往需要被測對象提供額外支撐
? 工具、環(huán)境依賴大
優(yōu)點
自動化測試雖然有重大缺點咱筛,但是卻在軟件研發(fā)中變得越來越重要搓幌,自然有它不可替代的獨到之處。
和歷史上所有的進化類似迅箩,無論是從刀耕火種到鐵犁牛耕溉愁,從珍妮機到蒸汽機,還是從生產(chǎn)作坊到流水線沙热,無不伴隨生產(chǎn)效率的巨大進步叉钥。
自動化測試的最大優(yōu)點就是兩個字:效率
自動化測試在執(zhí)行效率上的巨大優(yōu)勢是其得以壯大的立身之本。通過自動化測試篙贸,可以快速完成已有功能的快速驗證并給出反饋,這在現(xiàn)代快速研發(fā)時代至關(guān)重要枫疆。后文我們還會展開來談爵川。
除此之外,自動化測試還有如下一些不可忽視的優(yōu)點:
? 精確息楔,可靠寝贡。自動化測試不會因為不同時間扒披、不同設(shè)備上執(zhí)行產(chǎn)生不同的行為路徑。
? 不需要休息圃泡,24小時干活不嫌累碟案。
? 高復(fù)用性、繼承性颇蜡。知識沉淀是自帶屬性
黃金圈法則看自動化測試
黃金圈法則是西蒙·斯涅克發(fā)現(xiàn)的一個著名行事準(zhǔn)則价说。在其暢銷書《從為什么開始:喬布斯讓Apple紅遍世界的黃金圈法則》中提出。
即一般人做事往往先從外向內(nèi)思維风秤,先看要做啥鳖目,再想怎么做,最后才會想為什么去做缤弦。而很多成功的領(lǐng)袖人物會先從內(nèi)圈向外圈進行思考:
? WHY:我的目標(biāo)是什么领迈?先搞清楚愿景、要達到的目的
? HOW:如何實現(xiàn)我的目標(biāo)碍沐?解決怎么做的問題狸捅,確定方法、策略
? WHAT:要做什么累提?這就是執(zhí)行層面上怎么去具體地實施薪贫。
具體到自動化測試上,我們也參照此法則來梳理一下自動化測試的思路
為何實施自動化測試刻恭?(WHY)
上篇分析自動化測試的優(yōu)缺點已經(jīng)談到瞧省,自動化測試有其重大缺點,也有顯著優(yōu)點鳍贾。那為什么我們要推行自動化測試呢鞍匾?
首先我們要確認一個事實:那就是在軟件研發(fā)中,開發(fā)和測試工作是相輔相成的骑科,但卻并不對等橡淑。產(chǎn)品發(fā)布時開發(fā)的工作是增量的,但測試卻不是增量咆爽。產(chǎn)品每個版本發(fā)布梁棠,功能在原有基礎(chǔ)上是增量的,但是測試工作是對完整的產(chǎn)品質(zhì)量進行檢驗斗埂,所以歷史版本的功能在每次發(fā)布時也會包含在測試范圍內(nèi)符糊,這個意義上來說,測試工作任務(wù)量更多呛凶。
另外我們再看目前軟件業(yè)界的產(chǎn)品現(xiàn)狀和測試目標(biāo)男娄。隨著互聯(lián)網(wǎng)、移動互聯(lián)網(wǎng)、物聯(lián)網(wǎng)的發(fā)展模闲,現(xiàn)在的產(chǎn)品研發(fā)強調(diào)快速迭代建瘫,傳統(tǒng)軟件動輒幾個月的發(fā)布周期被壓縮到每周發(fā)布甚至每天發(fā)布。那產(chǎn)品質(zhì)量如何保證尸折?怎么最大程度保證產(chǎn)品更新不出問題啰脚?
正因如此,自動化測試盡管在測試工作的核心功能-缺陷發(fā)現(xiàn)能力上表現(xiàn)不佳实夹,但是因其高效執(zhí)行橄浓、快速反饋結(jié)果的特點成為現(xiàn)代軟件研發(fā)體系如敏捷研發(fā)、持續(xù)集成中的不二之選收擦。非吾愿往贮配,實不得不往矣。
那么WHY就很清楚了:實施自動化測試塞赂,目標(biāo)是要提升軟件研發(fā)中測試的執(zhí)行效率泪勒,快速反饋結(jié)果,提供對變更對歷史功能影響的質(zhì)量信心(擴大覆蓋率)宴猾。
如何實施自動化測試圆存?(HOW)
確定自動化測試的目標(biāo)了,下一步我們來看如何開展自動化測試呢仇哆?
要分析這個問題沦辙,我們需要先看看軟件測試需要做些什么,軟件測試按階段一般分成單元測試讹剔、集成測試油讯、系統(tǒng)測試、驗收測試延欠。按類型又可分為功能測試陌兑、性能測試、兼容性測試由捎、部署安裝測試兔综、易用性測試、安全測試狞玛、本地化測試软驰、文檔測試、可靠性測試心肪、無障礙測試等(以上測試概念可以參看我的免費公開課《軟件測試基礎(chǔ)-概念篇》锭亏,此處不展開了)。結(jié)合測試階段蒙畴、測試類型其實可以確定我們實施自動化測試的時機和范圍贰镣。
再回到目標(biāo):提升執(zhí)行效率呜象,擴大覆蓋率膳凝。所以HOW需要圍繞這個目標(biāo)碑隆,不能因為自動化的實施影響效率或者對效率提升微小,另外需要盡可能優(yōu)先實施覆蓋率高的部分蹬音。
這里我們再來看看著名的自動化測試金字塔:
測試金字塔基于這樣的觀點:測試是分層的上煤,從上到下對應(yīng)測試對象的不同層級,分別是上層的UI界面測試著淆,中層的服務(wù)測試和底層的單元測試劫狠。而實施自動化測試的效果是由上到下越來越好,即越接近底層的自動化測試收益越高永部。
這也很容易理解独泞,越接近底層的自動化,越為穩(wěn)定苔埋,受到的干擾越少懦砂,所以其效率越高,成本越少组橄。
那么再結(jié)合WHY的幾個關(guān)鍵詞:效率荞膘、結(jié)果、信心玉工, HOW的結(jié)論可以如下:
自動化測試優(yōu)先針對穩(wěn)定的羽资,少干擾的部分實施,通過各種手段提升效率為主遵班,平衡測試覆蓋率和實施成本屠升,并清晰快速地給出執(zhí)行結(jié)果
自動化測試做些什么?(WHAT)
進入實施層面狭郑,那就是針對自動化測試策略(HOW)來確定我們具體使用的自動化工具腹暖,然后借助自動化測試框架或平臺來保證實施效率、執(zhí)行效率和結(jié)果輸出愿阐。
這里有如下一些重要工作:
確定自動化測試工具
雖然測試金字塔顯示了自動化測試的選擇原則微服,但是并是不說我們只需要關(guān)注Unit自動化測試即可,不同層面的測試對象對最終質(zhì)量信心的建立都有重大影響缨历,所以自動化測試在每層上都有實施必要以蕴,只是側(cè)重點可以有所區(qū)別。
然后就是針對測試對象來確定對應(yīng)的工具辛孵。不同測試對象會有大量不同的工具可以選型丛肮。一般提到自動化測試主要是針對功能測試,因為功能測試是軟件測試的絕對主要范圍魄缚。所以工具的選型就很重要宝与。
Unit功能測試更多會借助不同編程語言的Xunit來實施焚廊。
API層面會有不同的接口測試工具如各種工具庫以及postman、fiddler习劫、soapui等工具
UI層面的功能測試工具就更多了咆瘟,web應(yīng)用有Selenium,QTP诽里,移動應(yīng)用自動化測試有UiAutomator袒餐、Robotium、Appium谤狡,桌面應(yīng)用有QTP灸眼,Autoit,sikuli等等墓懂。
而除了功能測試外焰宣,還有如性能測試、穩(wěn)定性測試捕仔、安全測試這樣必須要借助工具完成的測試類型匕积。性能測試可選工具有LoadRunner、Jmter逻澳、Tsung闸天、Locust等,安全測試有appscan斜做、webinspect苞氮、fotify、webscarab等瓤逼。
不同自動化測試工具的使用是自動化測試中的一個重要方面笼吟,但不是本文介紹重點,大家可以根據(jù)需要選擇對應(yīng)測試類型的工具重點學(xué)習(xí)霸旗。
構(gòu)建自動化測試框架或平臺
確定實施自動化的工具后贷帮,為了進一步提高自動化測試的效率,我們還需要通過自動化測試框架或者更高一層的自動化測試平臺來對自動化測試的開發(fā)诱告、實施過程進行管理撵枢、整合。當(dāng)然上面提到的很多自動化測試工具也提供了一些框架層面的功能精居,但是真正重心在框架層面的還是如STAF/X锄禽、RobotFramework、Cucumber這樣的框架工具靴姿。當(dāng)然很多框架本身也會內(nèi)建許多工具層面的功能沃但。
通過測試框架的使用,能大幅提高復(fù)雜業(yè)務(wù)測試場景的組織和管理佛吓,減少自動化測試的啟動成本和維護成本宵晚。
測試框架一般通過不同的分層來完成自動化測試的組織垂攘。
適配層:適配不同類型的測試對象,如GUI界面淤刃、API接口晒他、web service、database钝凶、通信協(xié)議等
執(zhí)行層:完成測試任務(wù)的調(diào)度執(zhí)行仪芒,log記錄唁影、結(jié)果報告
測試設(shè)計層: 包括設(shè)計測試用例(腳本)耕陷、測試環(huán)境配置、初始化配置据沈、測試數(shù)據(jù)哟沫、測試庫等
測試輸入層:對接外部輸入如測試場景定義、測試模板
通過測試框架或平臺锌介,自動化測試還可以和外部系統(tǒng)如項目管理嗜诀、配置管理、測試管理系統(tǒng)實現(xiàn)良好的交互和集成孔祸。
自動化測試實施
工具隆敢、框架層面確定并完成構(gòu)建后,則需要針對具體的業(yè)務(wù)場景來進行實施崔慧。包括測試腳本的開發(fā)拂蝎,調(diào)試,測試環(huán)境的部署惶室、測試結(jié)果的輸出温自、報告。這部分工作也是我們自動化測試的主體部分皇钞。
在自動測試實施中悼泌,通過本人對大量項目實施情況的觀察,有以下幾點推薦關(guān)注的關(guān)鍵:
自動化測試不能脫離業(yè)務(wù)夹界,需要比較緊密地和需求馆里、測試點進行關(guān)聯(lián)或通過內(nèi)建文檔形式體現(xiàn)。此處推薦 《實例化需求》一書可柿,其主導(dǎo)思想對于自動化測試在研發(fā)流程中發(fā)揮價值有很強的實踐意義鸠踪。
自動化測試必定是和測試環(huán)境緊密相關(guān)的。所以針對環(huán)境趾痘、初始數(shù)據(jù)等的處理在自動化測試中應(yīng)該作為一個非常重要的部分慢哈。自動化腳本受環(huán)境影響越小,執(zhí)行越穩(wěn)定永票,則價值越高卵贱。
按測試金字塔原則來確定實施優(yōu)先級滥沫。API層面的自動化測試可以作為實施重點。兼顧業(yè)務(wù)邏輯和ROI键俱。作為最終表現(xiàn)層面的case兰绣,GUI層面的自動化也不可或缺,只是覆蓋面盡可能覆蓋smoke test即可编振。單元測試是代碼層面的基礎(chǔ)缀辩,覆蓋率越高越好,但是需要有ROI的平衡考量踪央。
自動化測試本身也體現(xiàn)到代碼上臀玄,所以和代碼管理相關(guān)的實踐和要求,對自動化測試同樣適用畅蹂。包括版本管理健无、配置管理,忽略這部分對自動化測試代碼的長期維護是非常不利的液斜。
自動化測試不應(yīng)是某些專職自動化測試人員的工作累贤,應(yīng)該是所有項目成員工作的一部分。它只是測試工作的一個實現(xiàn)手段少漆,不應(yīng)該單獨獨立出來脫離實際測試人員的思路來單獨實施臼膏。
良好的自動化實施是自動化測試是否成功的關(guān)鍵
接入研發(fā)流程工具鏈
自動化測試不可能脫離研發(fā)整體流程,需要為整理流程服務(wù)示损。軟件研發(fā)流程在推進持續(xù)集成中必然會引入相關(guān)的工具鏈渗磅。自動化測試接入工具鏈?zhǔn)前l(fā)揮自動化測試價值和提升研發(fā)效率的重要措施。
持續(xù)集成工具不管是Jenkins屎媳、teamcity還是bamboo夺溢、codeship其實作用基本類似,對于自動測試接入來說烛谊。重點做好以下幾點:
方便地調(diào)度控制风响。盡可能通過shell或cmd腳本來觸發(fā)調(diào)用,復(fù)雜些的調(diào)度控制如分布式測試可以通過一個專門的調(diào)度代理來完成
可視化的測試報告反饋和通知機制丹禀。測試結(jié)果在運行后及時反饋到CI工具并通過郵件状勤、短信等通知機制告知干系人。
異常定位双泪、分析手段持搜。包括日志、監(jiān)控焙矛、異常狀態(tài)應(yīng)對清單等對于出現(xiàn)問題時的快速解決意義重大
結(jié)語
自動化測試是現(xiàn)代軟件研發(fā)流程中不得不為地必要組成部分葫盼,但是其不是萬能藥,把自動化測試用好村斟,重點是聚焦在其能發(fā)揮最大價值的所在贫导。通過合理地規(guī)劃和框架設(shè)計抛猫,有效地實施和流程控制,為團隊共贏提供助力孩灯。
展望未來闺金,借助人工智能的發(fā)展,自動化測試或許會向更聰明峰档,覆蓋范圍更廣泛的方向發(fā)展败匹,但一切都需要我們立足當(dāng)下,逐步探索讥巡,最終實現(xiàn)生產(chǎn)力地充分解放