自動化測試-蛇油還是銀彈?

前言

蛇油還是銀彈?

Snake oil 在英諺中指“騙人的萬靈油”,用來指那些宣稱萬靈卻實際沒什么用處的騙人把戲。

silver bullet則指能解決難題的特殊的有效手段。來源于銀彈可殺死吸血鬼的傳說。

而在軟件研發(fā)領(lǐng)域,針對自動化測試,也常常能聽到類似這兩種說法的不同觀點:

一種認(rèn)為自動化測試是測試領(lǐng)域的銀彈,是加快測試進(jìn)度和壓縮測試成本的必行手段,是測試領(lǐng)域的必然發(fā)展趨勢,測試人員甚至?xí)驗樽詣踊瘻y試的發(fā)展而失業(yè)。

另一種觀點則完全相反,認(rèn)為自動化測試不過是為了KPI而編造出來的額外負(fù)擔(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的實例。測試自動化把測試這個行為進(jìn)行了自動化。

通過以上兩個概念的解釋,我們可以看到,自動化測試比測試自動化涵蓋的范圍要更加廣泛。國內(nèi)軟件測試行業(yè)一般不太提測試自動化這個說法,所以我們簡單把自動化測試分為廣義和狹義來對應(yīng)automated testing和test automation。

實際上大家在說到自動化測試時往往更多指的其實是test automation。本文提到自動化測試時一般也理解為狹義的自動化測試即test automation。

定義

百度百科對自動化測試的定義

自動化測試是把以人為驅(qū)動的測試行為轉(zhuǎn)化為機(jī)器執(zhí)行的一種過程。通常,在設(shè)計了測試用例并通過評審之后,由測試人員根據(jù)測試用例中描述的規(guī)程一步步執(zhí)行測試,得到實際結(jié)果與期望結(jié)果的比較。在此過程中,為了節(jié)省人力、時間或硬件資源,提高測試效率,便引入了自動化測試的概念。

Wikipedia對Test Automation的定義

測試自動化是使用特殊的軟件(區(qū)別于被測軟件)來控制測試執(zhí)行并且對實際輸出及預(yù)期結(jié)果進(jìn)行比對的行為。測試自動化能將正式測試流程中一些必要但重復(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.)

從以上定義,我們可以認(rèn)為自動化測試(狹義)就是把測試執(zhí)行中一些工作自動化的過程。

自動化測試的優(yōu)缺點

自動化測試目前在測試行業(yè),其實是整個軟件行業(yè)可以說是如日中天,大有無自動不研發(fā)之勢。但是我們還是要理性地看待自動化測試,下面簡單談?wù)勛詣踊瘻y試的優(yōu)缺點

缺點

軟件行業(yè)發(fā)展到現(xiàn)階段,特別是人工智能、機(jī)器學(xué)習(xí)的發(fā)展,可以看到機(jī)器智能化的趨勢已成。而自動化測試的發(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è)成本較高,包括啟動成本和維護(hù)成本

? 被測對象對自動化測試影響較大,而成功實施自動化測試往往需要被測對象提供額外支撐

? 工具、環(huán)境依賴大

優(yōu)點

自動化測試雖然有重大缺點,但是卻在軟件研發(fā)中變得越來越重要,自然有它不可替代的獨到之處。

和歷史上所有的進(jìn)化類似,無論是從刀耕火種到鐵犁牛耕,從珍妮機(jī)到蒸汽機(jī),還是從生產(chǎn)作坊到流水線,無不伴隨生產(chǎn)效率的巨大進(jì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紅遍世界的黃金圈法則》中提出。

image

即一般人做事往往先從外向內(nèi)思維,先看要做啥,再想怎么做,最后才會想為什么去做。而很多成功的領(lǐng)袖人物會先從內(nèi)圈向外圈進(jìn)行思考:

? WHY:我的目標(biāo)是什么?先搞清楚愿景、要達(dá)到的目的

? HOW:如何實現(xiàn)我的目標(biāo)?解決怎么做的問題,確定方法、策略

? WHAT:要做什么?這就是執(zhí)行層面上怎么去具體地實施。

具體到自動化測試上,我們也參照此法則來梳理一下自動化測試的思路

為何實施自動化測試?(WHY)

上篇分析自動化測試的優(yōu)缺點已經(jīng)談到,自動化測試有其重大缺點,也有顯著優(yōu)點。那為什么我們要推行自動化測試呢?

首先我們要確認(rèn)一個事實:那就是在軟件研發(fā)中,開發(fā)和測試工作是相輔相成的,但卻并不對等。產(chǎn)品發(fā)布時開發(fā)的工作是增量的,但測試卻不是增量。產(chǎn)品每個版本發(fā)布,功能在原有基礎(chǔ)上是增量的,但是測試工作是對完整的產(chǎn)品質(zhì)量進(jìn)行檢驗,所以歷史版本的功能在每次發(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ā)強(qiáng)調(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ì)量信心(擴(kuò)大覆蓋率)。

如何實施自動化測試?(HOW)

確定自動化測試的目標(biāo)了,下一步我們來看如何開展自動化測試呢?

要分析這個問題,我們需要先看看軟件測試需要做些什么,軟件測試按階段一般分成單元測試、集成測試、系統(tǒng)測試、驗收測試。按類型又可分為功能測試、性能測試、兼容性測試、部署安裝測試、易用性測試、安全測試、本地化測試、文檔測試、可靠性測試、無障礙測試等(以上測試概念可以參看我的免費公開課《軟件測試基礎(chǔ)-概念篇》,此處不展開了)。結(jié)合測試階段、測試類型其實可以確定我們實施自動化測試的時機(jī)和范圍。

再回到目標(biāo):提升執(zhí)行效率,擴(kuò)大覆蓋率。所以HOW需要圍繞這個目標(biāo),不能因為自動化的實施影響效率或者對效率提升微小,另外需要盡可能優(yōu)先實施覆蓋率高的部分。

這里我們再來看看著名的自動化測試金字塔:

image

測試金字塔基于這樣的觀點:測試是分層的,從上到下對應(yīng)測試對象的不同層級,分別是上層的UI界面測試,中層的服務(wù)測試和底層的單元測試。而實施自動化測試的效果是由上到下越來越好,即越接近底層的自動化測試收益越高。

這也很容易理解,越接近底層的自動化,越為穩(wěn)定,受到的干擾越少,所以其效率越高,成本越少。

那么再結(jié)合WHY的幾個關(guān)鍵詞:效率、結(jié)果、信心, HOW的結(jié)論可以如下:

自動化測試優(yōu)先針對穩(wěn)定的,少干擾的部分實施,通過各種手段提升效率為主,平衡測試覆蓋率和實施成本,并清晰快速地給出執(zhí)行結(jié)果

自動化測試做些什么?(WHAT)

進(jìn)入實施層面,那就是針對自動化測試策略(HOW)來確定我們具體使用的自動化工具,然后借助自動化測試框架或平臺來保證實施效率、執(zhí)行效率和結(jié)果輸出。

這里有如下一些重要工作:

確定自動化測試工具

雖然測試金字塔顯示了自動化測試的選擇原則,但是并是不說我們只需要關(guān)注Unit自動化測試即可,不同層面的測試對象對最終質(zhì)量信心的建立都有重大影響,所以自動化測試在每層上都有實施必要,只是側(cè)重點可以有所區(qū)別。

然后就是針對測試對象來確定對應(yīng)的工具。不同測試對象會有大量不同的工具可以選型。一般提到自動化測試主要是針對功能測試,因為功能測試是軟件測試的絕對主要范圍。所以工具的選型就很重要。

Unit功能測試更多會借助不同編程語言的Xunit來實施。

image

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)建自動化測試框架或平臺

確定實施自動化的工具后,為了進(jìn)一步提高自動化測試的效率,我們還需要通過自動化測試框架或者更高一層的自動化測試平臺來對自動化測試的開發(fā)、實施過程進(jìn)行管理、整合。當(dāng)然上面提到的很多自動化測試工具也提供了一些框架層面的功能,但是真正重心在框架層面的還是如STAF/X、RobotFramework、Cucumber這樣的框架工具。當(dāng)然很多框架本身也會內(nèi)建許多工具層面的功能。

通過測試框架的使用,能大幅提高復(fù)雜業(yè)務(wù)測試場景的組織和管理,減少自動化測試的啟動成本和維護(hù)成本。

測試框架一般通過不同的分層來完成自動化測試的組織。

  • 適配層:適配不同類型的測試對象,如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ù)場景來進(jìn)行實施。包括測試腳本的開發(fā),調(diào)試,測試環(huán)境的部署、測試結(jié)果的輸出、報告。這部分工作也是我們自動化測試的主體部分。

在自動測試實施中,通過本人對大量項目實施情況的觀察,有以下幾點推薦關(guān)注的關(guān)鍵:

  1. 自動化測試不能脫離業(yè)務(wù),需要比較緊密地和需求、測試點進(jìn)行關(guān)聯(lián)或通過內(nèi)建文檔形式體現(xiàn)。此處推薦 《實例化需求》一書,其主導(dǎo)思想對于自動化測試在研發(fā)流程中發(fā)揮價值有很強(qiáng)的實踐意義。

  2. 自動化測試必定是和測試環(huán)境緊密相關(guān)的。所以針對環(huán)境、初始數(shù)據(jù)等的處理在自動化測試中應(yīng)該作為一個非常重要的部分。自動化腳本受環(huán)境影響越小,執(zhí)行越穩(wěn)定,則價值越高。

  3. 按測試金字塔原則來確定實施優(yōu)先級。API層面的自動化測試可以作為實施重點。兼顧業(yè)務(wù)邏輯和ROI。作為最終表現(xiàn)層面的case,GUI層面的自動化也不可或缺,只是覆蓋面盡可能覆蓋smoke test即可。單元測試是代碼層面的基礎(chǔ),覆蓋率越高越好,但是需要有ROI的平衡考量。

  4. 自動化測試本身也體現(xiàn)到代碼上,所以和代碼管理相關(guān)的實踐和要求,對自動化測試同樣適用。包括版本管理、配置管理,忽略這部分對自動化測試代碼的長期維護(hù)是非常不利的。

  5. 自動化測試不應(yīng)是某些專職自動化測試人員的工作,應(yīng)該是所有項目成員工作的一部分。它只是測試工作的一個實現(xiàn)手段,不應(yīng)該單獨獨立出來脫離實際測試人員的思路來單獨實施。

良好的自動化實施是自動化測試是否成功的關(guān)鍵

接入研發(fā)流程工具鏈

自動化測試不可能脫離研發(fā)整體流程,需要為整理流程服務(wù)。軟件研發(fā)流程在推進(jìn)持續(xù)集成中必然會引入相關(guān)的工具鏈。自動化測試接入工具鏈?zhǔn)前l(fā)揮自動化測試價值和提升研發(fā)效率的重要措施。

持續(xù)集成工具不管是Jenkins、teamcity還是bamboo、codeship其實作用基本類似,對于自動測試接入來說。重點做好以下幾點:

  1. 方便地調(diào)度控制。盡可能通過shell或cmd腳本來觸發(fā)調(diào)用,復(fù)雜些的調(diào)度控制如分布式測試可以通過一個專門的調(diào)度代理來完成

  2. 可視化的測試報告反饋和通知機(jī)制。測試結(jié)果在運行后及時反饋到CI工具并通過郵件、短信等通知機(jī)制告知干系人。

  3. 異常定位、分析手段。包括日志、監(jiān)控、異常狀態(tài)應(yīng)對清單等對于出現(xiàn)問題時的快速解決意義重大

結(jié)語

自動化測試是現(xiàn)代軟件研發(fā)流程中不得不為地必要組成部分,但是其不是萬能藥,把自動化測試用好,重點是聚焦在其能發(fā)揮最大價值的所在。通過合理地規(guī)劃和框架設(shè)計,有效地實施和流程控制,為團(tuán)隊共贏提供助力。

展望未來,借助人工智能的發(fā)展,自動化測試或許會向更聰明,覆蓋范圍更廣泛的方向發(fā)展,但一切都需要我們立足當(dāng)下,逐步探索,最終實現(xiàn)生產(chǎn)力地充分解放

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容