1. 背景先理一下自動化測試的概念,從廣義上來說,一切通過工具(程序)的方式來代替或者輔助手工測試的行為都可以成為自動化。從狹義上來說,通過編寫腳本的方式,模擬手工測試的過程,從而替代人工對系統(tǒng)的功能進行驗證。 有贊是一家互聯(lián)網(wǎng)行業(yè)的創(chuàng)業(yè)公司,測試起步較晚,發(fā)布非常頻繁,就算每次只回歸核心功能,對人數(shù)極少的幾個測試人員來說工作量巨大,且基本是重復勞動,極其枯燥,持續(xù)時間長了也容易出錯。 所以初期我們測試自動化切入的思路非常簡單:從實際用戶的角度出發(fā),模擬真實的操作,替代現(xiàn)有的手工測試用例的執(zhí)行。這樣一來,每次重復的工作就可以用自動化來替代,測試人員只需要關注每次發(fā)布的增量需求即可。 隨著腳本數(shù)量的增加,這種自動化覆蓋的方式的弊端也逐漸暴露:
雖然我們在測試框架和工具層面通過結(jié)合selenium-grid實現(xiàn)了腳本并發(fā)執(zhí)行和失敗用例重試機制以提高執(zhí)行效率和降低誤報率,但是這種方式只能緩解問題,并不能從根本解決覆蓋不全的問題。 正好趕上公司的SOA服務化進程,測試這邊也開始配合的做自動化方面的轉(zhuǎn)變,從原來的黑盒系統(tǒng)級自動化測試向分層自動化測試轉(zhuǎn)變。 2. 分層自動化測試在談分層測試之前,先回顧幾個概念:
接下來我們談談有贊是如何隨著系統(tǒng)拆分SOA服務化推進分層自動化測試的。先來看看經(jīng)典的測試金字塔: 其中Unit代表單元測試,Service代表服務集成測試,UI代表頁面級的系統(tǒng)測試。分層的自動化測試倡導產(chǎn)品的不同層次都需要自動化測試,這個金字塔也正表示不同層次需要投入的精力和工作量。下面我會逐層介紹有贊的分層自動化實踐。 2.1 Unit-單元測試在系統(tǒng)拆分之前,有贊只有一個龐大的巨無霸系統(tǒng),單元測試極度缺失。在系統(tǒng)逐漸SOA服務化的過程中,我們逐漸提出了對單元測試覆蓋率的要求。 我們的單元測試會分別做DAO層和服務層的測試。DAO層的單元測試主要保障SQL腳本的正確性,在做服務層的單元測試時就可以以DAO層是正確的前提進行用例編寫了。 為了做細粒度的測試,需要解決單元測試的外部依賴。系統(tǒng)和模塊之間的依賴可以通過Mock框架(Mockito/EasyMock)解耦,同時可以結(jié)合h2database解決對數(shù)據(jù)庫的依賴,使得測試用例盡可能做到可以隨時隨地運行。 這一層發(fā)現(xiàn)并解決問題付出的成本相對來說最低,自動化用例的維護成本也不高,總的來說自動化測試的投入產(chǎn)出比最高。 單元測試的責任主體一般來說是開發(fā)人員,寫單元測試也是開發(fā)人員對自己的代碼進行檢查的一個過程。 2.2 Service-服務集成測試我們在服務層的測試首要考慮的是各系統(tǒng)(子系統(tǒng))的集成測試。因為在經(jīng)過單元測試這一層的保障之后,在服務層我們更關注的是某個系統(tǒng)的輸入輸出功能是否正確,以及若干個系統(tǒng)間的交互是否和業(yè)務場景的要求一致。 先來看看我們系統(tǒng)拆分之后的SOA系統(tǒng)應用架構(gòu)圖:
這一層的被測對象是抽離了展現(xiàn)層的代碼(前端以及部分后端展現(xiàn)層邏輯)。 鑒于有贊的測試起步較晚(應該很多創(chuàng)業(yè)公司都有類似情況),測試資源緊缺,代碼覆蓋率低得可憐。所以我們的初期自動化用例覆蓋策略是這樣的:
再介紹一下這一層的初期我們用例的基本形態(tài):
我們在這一層的測試框架選擇是基于公司通用的服務框架(Nova)基礎之上搭建的,架構(gòu)圖如下:
這一層的測試覆蓋主要是由測試人員進行,是測試人員大展身手的地方。 我們不需要非常詳細的了解代碼的實現(xiàn),但是我們的用例里充分體現(xiàn)了我們對系統(tǒng)的結(jié)構(gòu),模塊之間關系等的充分的理解。 后續(xù)我們對于Service層自動化測試的推進策略是:
2.3 UI-展現(xiàn)測試先提一個問題,既然在文章開篇提到了UI自動化測試有這么多弊端,這么勞民傷財,那么是否還有必要進行UI層的自動化呢?答案是肯定的,因為UI層是我們的產(chǎn)品最終呈現(xiàn)給用戶的東西。所以在做好上面兩層的測試覆蓋之后,測試人員可以投入更多的精力到UI層的測試上。正是因為測試人員會在UI層投入較大精力,我們還是有必要通過自動化來幫助我們解放部分重復勞動力。 根據(jù)我們的UI層自動化實踐,提一下我們的UI層自動化覆蓋的原則:
我們提高UI腳本可維護性的方法是遵循Page Object設計模式。 Page ObjectPage Object模式是為了避免在測試代碼中直接操作HTML元素,對Web頁面的抽象。好處有:
一個簡單的例子以有贊首頁的登錄操作為例(Ruby): class LoginPage
下面我們來看看測試用例:
這樣最終的測試腳本呈現(xiàn)的就是單純的頁面操作邏輯,更貼近文本測試用例。 下面來看一下我們的測試框架:
隨著服務層自動化覆蓋率越來越高,UI層的自動化覆蓋會逐漸轉(zhuǎn)變?yōu)轫撁嬲故具壿嫾敖缑媲岸伺c服務的展現(xiàn)層交互的集成驗證。我們后續(xù)對于UI層自動化的演進規(guī)劃是這樣的:
UI層的自動化測試也是由測試人員負責,在覆蓋了核心業(yè)務核心場景之后,不應該在這層的自動化覆蓋上投入太多的精力和資源。就算我們在一定程度上提高了腳本的可維護性,可是畢竟自動化測試最怕的就是變化,而UI界面是變化頻率最高的一層,所以還是得投入一定的精力維護,不是么? 3. 持續(xù)集成有了上述各層的自動化測試腳本,下面我們需要建立起持續(xù)集成體系。持續(xù)集成的目的:
我們的持續(xù)集成是基于Jenkins搭建的,主要的動作如下:
持續(xù)集成所需的支撐有:
對于持續(xù)集成我們后續(xù)的演進規(guī)劃是朝著持續(xù)交付和持續(xù)部署的方向努力,在持續(xù)集成的基礎之上,自動將代碼部署到測試環(huán)境上方便測試人員進行手工測試。 4. 總結(jié)本文主要從整體上介紹了在有贊SOA化的進程中,測試推行的分層自動化實踐,以及后續(xù)的發(fā)展方向,同時簡單介紹了相關的測試框架結(jié)構(gòu)。下面再從整體回顧一下我們的分層自動化的要點:
至于各層投入的具體比重,還是需要根據(jù)項目的需求來實際規(guī)劃。在《google 測試之道》一書,對于google產(chǎn)品,70%的投入為單元測試,20%為集成、接口測試,10% 為UI層的自動化測試。 最后再提一些觀點吧:
本文來源:https://tech.youzan.com/layers_test_automation_practice/ |
|
來自: 西北望msm66g9f > 《編程》