所在位置:首頁 -- 質量管理 -- 正文

一個遺留系統自動化測試的七年之癢


發布時間:2017-4-1  來源:admin

 項目從2009年開始啟動,采用的是TDD的開發方式。在這之后的過程中,團隊做過各種嘗試去調整自動化測試的策略去更好的適應不同階段項目的特征,比如調整不同類型測試的比例,引入新的測試類型等。

七年之癢 - 痛點

隨著項目走到了第七個年頭,一系列的變化在不斷發生,比如技術上引入了微服務、EventStore等,業務變得越來越復雜,子系統變得更多,更多的人員加入,開始實施按月發布等,這些因素交織在一起凸顯出自動化測試的滯后。首先是從團隊成員感知到的一些痛點開始的:

1.質量下降 - 這個體現在部署到測試環境的代碼質量較差,常常就是新版本部署上去之后某個核心功能被破壞,要么是新功能破壞了老功能,要么是bug的修復把其他功能破壞。

2.測試不穩定 - QA有很長的時間在等待修復或新功能提交出包,而這個等待可能是幾個小時也有可能是幾天。除去網絡問題、部署流水線的復雜性等因素,自動化測試的不穩定性也導致出包的速度也受到了影響。大家往往更關注于怎么能把測試通過了能夠出一個包,而卻忽略了我們該怎么去處理一個不穩定的測試。下圖的run2, run3正是大家在不斷的嘗試去rerun掛掉的測試。

團隊越來越忙,開始陷入惡性循環 - 隨著功能的逐漸增多,每個月上線的回歸測試列表越來越長,QA需要花更多的時間去做重復的回歸測試,新功能的測試和回歸測試的壓力都很大,甚至有的時候根本都沒有時間去review下一個階段的需求,更別提其他一些更有價值的事情。往往回歸測試做不完就不得不往下一個階段推,這種不斷往復導致大家對發布的產品信心嚴重不足。

在這種情況下,自動化測試的有效性和完備性都受到了質疑。本來期望自動化測試能夠幫助我們構建一張安全的防護網,保證主干業務不被破壞;隨著pipeline頻繁的去執行,及時反饋問題,不要等到測試環境才暴露出來;同時能夠把QA重復的手工測試時間釋放出來,去做一些更有價值的事。可是根據團隊所感受到的痛點,我們覺得自動化測試已經不僅沒有幫助我們,反而卻在一定程度上給團隊帶來了干擾。

問題分析

自動化測試到底出了什么問題?我們從現有UI測試入手開始分析,發現了以下典型現象:

最有價值的場景沒有被覆蓋

雖然有較多的測試場景,但是體現出核心業務價值的場景卻稀少。我們都知道80/20原則,用戶80%的時間在使用系統中20%的功能,如果大部分的UI測試是在測另外那80%的功能,這樣一個覆蓋給團隊帶來的安全指數是很低的。

失效的場景

功能已經發生了變化,可是對應的UI測試并沒有變,至于它為什么沒有掛掉,可能有一些僥幸的因素。比如現在點了確認按鈕之后新增了彈窗,而測試并沒有關掉彈窗,而是通過URL跳轉到了別的頁面,也沒有驗證彈窗的新功能是否工作,既有的實現方式確實會使得測試一直通過,但是沒有真的驗證到正確的點。

重復的測試

同樣的測試在UI層跟API層的重合度較高,有的甚至是100%。比如搜索用戶的功能,分別去按照姓、名、姓的一部分、名的一部分、姓?名等等各種組合去驗證。我們不太清楚在當時是基于怎樣的考慮留下了這么多跟UT/API測試重復的用例,但是在現階段分析之后我們覺得這是一種沒必要的浪費。

另外,不同的測試數據準備都是UI測試執行出來的,很多場景都用到了相同的步驟,我們覺得這也是一種重復,可以通過其他方式來實現。

解決問題

這些問題從某種角度上都暴露出了UI測試年久失修,沒有得到好的維護,而新功能的自動化測試又在不斷重蹈覆轍,問題積攢到一起暴發出來使得大家開始重視自動化測試。

有痛點并且找到問題了,下一步就是解決問題。我們分了兩步來走,第一個就是對已有UI測試的優化,第二個是對新功能的自動化測試策略的調整。

已有UI測試的優化

針對已有的自動化測試,再回過頭逐個去審查UT/API/UI測試代價太高,我們只能是從UI測試優化入手。針對前面提到的3個問題我們逐一去攻克:

1.識別系統關鍵業務場景

我們首先挖掘出系統中用戶要達到的各個業務目標,根據不同的業務目標梳理出不同的業務場景,然后將這些發給客戶去評審。客戶對我們總結出的這些場景很認可,只是把每個業務目標都賦予了一個優先級,為后續的編碼實現給予了參考。

2.重新設計測試場景

UI測試不是著重去測試某個功能是否工作,而更關注的是用戶在使用系統時能否順利實現某個業務目標,因此我們需要知道用戶是怎么使用系統的。同樣的目標,可能會有多個途徑來完成,通過跟客戶的訪談以及觀察產品環境下頁面的訪問頻度,我們重新規劃了測試場景,期待能更貼近用戶的真實行為,及時防御可能會導致用戶不能順利完成業務目標的問題。

3.優化測試數據準備,刪除重復的測試

對于UI層的過度測試,直接刪除和API/UT層重復的測試,保留一條主干路徑用來測試系統連通性。

對于不同的業務場景可能需要準備的數據,我們舍棄了之前通過UI執行測試這種成本高的方式,轉而以發API請求的方式來準備,這樣降低了測試執行的時間,也使得測試更加的穩定。

重新梳理的測試場景幫我們構建了一張較為全面的安全防護網,覆蓋了絕大部分的用戶使用場景,大家的信心顯著提高。如果核心業務受到破壞,立馬就可以通過UI測試反饋給相關的人。執行更加穩定的測試也減少了大家對UI測試是否能真的發現問題的質疑,因為隨機掛的頻率大大的降低,一旦掛可能就是真的有bug了。

新功能自動化測試策略的調整

我們一般會以測試金字塔作為自動化測試的指導策略,下圖是我們項目的測試金字塔。

為了避免新功能步舊功能的后塵,我們對自動化測試策略進行了調整。除去以不同層的數量分布來判定策略是否合理外,我們也更看重在這個數量下關鍵業務場景是否能被有效地覆蓋,主要通過下面兩種方式來保證:

1.QA及早介入自動化測試

質量是需要內建的,不是測出來的。QA從一開始就介入整個流程之中,在story啟動的時候會和DEV一起準備任務拆分。在后期驗收story的同時也會驗收單元測試,確保能在UT/API/Contract層實現的測試都在這些層面覆蓋,不僅保證了底層測試的數量要夠多,也確保了這么多測試覆蓋的點都是合理有效的。在這個過程中,QA把更多的測試思路傳遞給團隊成員,引發大家更多的從質量角度去思考。

2.QA與DEV結對寫UI測試

最后在整個功能做完的時候,QA也會和DEV結對實現UI測試,涉及到現有測試場景的維護與更新。基于前面對底層測試的review,大家對于整個功能的測試覆蓋都有了一定程度的了解,對于UI測試要測得點也會較快的達成一致。另外,QA在與DEV結對實現UI測試的時候,編碼能力也得到了提高。

在推動QA更多參與底層測試的過程中,我們更多的從測試角度去影響團隊,增加了團隊的質量意識。QA的時間被釋放出來了,去做了更多有價值的事,比如探索性測試,Log監控與分析,安全測試,產品環境下用戶行為分析等。這一些列活動的影響就是產品的質量順便得到了提升。

總結

等我們把已有功能UI測試優化完,新功能的自動化測試策略開始落實到全組,已經是半年以后的事了。我們慢慢的感受到一切都在回歸正軌,之前的痛點在逐步消去,團隊交付的節奏也越來越順暢,對發布產品的信心也更強了。

回顧這個遺留系統的自動化測試優化過程,我們有一些收獲:

1.大家說到UI測試往往更傾向于如何編碼實現,但我們希望開始UI測試的時候能多關注下測試用例的設計是否合理,是不是能夠體現出業務價值

2.UI測試的用例和代碼都是測試資產,需要跟產品代碼等同對待,不能寫出來就不管不顧,沒有維護是不可取的

3.自動化測試不僅僅是UI測試,需要和UT/API等其他底層測試一起分工合作,作為測試策略的一部分來為產品質量保駕護航

中国北京单场足球彩票 内蒙古时时历史开奖结果查询 江苏状元麻将 欢乐生肖时时彩走势图 捕鸟达人安卓版 股票涨跌是怎么定的 安徽麻将app下载 双色球怎样选号 极速快3走势图表 最终幻想如何赚钱 pk10最牛稳赚模式单双 推理大师麻将风云 赢红包游戏微信下分 北京pk赛车6码技巧 时时彩不倍投也能挣钱 上分麻将软件 分分时时彩票计划