最近我司事業(yè)部的業(yè)務(wù)中臺開發(fā)完畢,由于中臺業(yè)務(wù)的特殊性姥宝,并沒有對應(yīng)的頁面操作等础米,所以我們需要做
一個線上的可自動化部署的接口自動化測試平臺汗菜,但是搜遍了全網(wǎng)的博客資料等,發(fā)現(xiàn)居然沒有完整的自動
化的系列文章摧莽,找到的幾十篇博客更是把如今的博客生態(tài)圈的抄襲展現(xiàn)的淋漓盡致庙洼,很多文章的內(nèi)容是完全
一樣的,而且最讓人氣憤的是镊辕,很多搭建的細(xì)節(jié)都沒有描述油够,或者描述的并不是正確的,居然沒有人進行驗
證后在發(fā)征懈,后來基于認(rèn)識的某大廠的資深工程師給的經(jīng)驗和方案石咬,慢慢摸索,踩了無數(shù)坑終于完成了我司的
接口自動化測試平臺卖哎,現(xiàn)整理成系列給后來人使用
自動化測試的目標(biāo)
首先鬼悠,我們搭建之前必須要做的兩件事:分析自動化測試平臺需要完成的目標(biāo)或者能實現(xiàn)的功能删性,以及基于我司業(yè)務(wù)的自動化測試的技術(shù)選型和工具選型,我們先來看第一點焕窝,自動化測試平臺要完成的目標(biāo)蹬挺,決定這一點更重要的是根據(jù)我們需要測試的工程和項目是什么類別,業(yè)務(wù)方向它掂,如何測試巴帮,以及測試目標(biāo)等來決定
項目類型
我司項目類型為業(yè)務(wù)中臺,即開放的業(yè)務(wù)Api平臺虐秋,我司的中臺架構(gòu)采用CloudAlibaba系列重構(gòu)榕茧,內(nèi)部產(chǎn)品線使用RPC接口,Resful接口僅開放OpenApi使用熟妓,所以測試需要完全依賴于接口覆蓋測試
業(yè)務(wù)方向(業(yè)務(wù)架構(gòu))
我司主要業(yè)務(wù)方向為電商與數(shù)字商業(yè)化雪猪,所以業(yè)務(wù)中臺整體架構(gòu)為三層服務(wù),一級服務(wù)為各個基礎(chǔ)能力中心起愈,如注冊中心只恨,Redis開放能力中心,Mongo存儲能力中心抬虽,外部服務(wù)中心官觅,以及各個中間件、短信等基礎(chǔ)能力中心阐污,二級服務(wù)為依據(jù)我司數(shù)十個產(chǎn)品線業(yè)務(wù)功能模塊能力整合拆分出來的業(yè)務(wù)中心休涤,每個中心僅完成獨立能力,如店鋪相關(guān)能力中心笛辟,價格控制能力中心等功氨,三級服務(wù)為完整的部分業(yè)務(wù)能力,按照完整的功能流程獨立拆分手幢,例如活動捷凄、促銷、秒殺等相關(guān)的促銷域围来,短信跺涤、EMAIL、商城客服聊天IM等相關(guān)的消息域等(僅對外開放三級業(yè)務(wù)域服務(wù))
如何測試
由于我司項目的特殊性监透,所以在制定測試方式上桶错,分為三類測試,即分為接口覆蓋測試胀蛮、子流程閉環(huán)測試院刁、主分支業(yè)務(wù)流程覆蓋測試,首先我們看第一類接口覆蓋測試粪狼,此測試需要把我司對外的四百多個三級業(yè)務(wù)服務(wù)全部進行單元測試覆蓋黎比,并且完整測試通過超营,第二類子流程閉環(huán)測試,簡單理解為每個域獨立的業(yè)務(wù)串聯(lián)測試阅虫,例如市場域的完整閉環(huán)流程可能會有多個演闭,例如其中一個流程:申請開店-->審核開店(Y/N)-->設(shè)置店鋪風(fēng)格-->設(shè)置裝修模版-->申請商品(創(chuàng)建商品)-->設(shè)置價格-->設(shè)置快遞模版-->上架商品-->下架商品,至此一個簡單的部分流程閉環(huán)完成颓帝,為什么說是簡單的閉環(huán)流程呢米碰?我想細(xì)心的可能發(fā)現(xiàn),此流程都是涉及市場域相關(guān)的接口购城,并且按照流程順序執(zhí)行的吕座,但是很多與之相關(guān)的操作并不存在,例如瘪板,用戶注冊吴趴、登錄、實名認(rèn)證侮攀、賬戶設(shè)置等前置流程沒有涉及锣枝,且中間流程還有設(shè)置促銷活動、訂單兰英、支付撇叁、配送、倉儲畦贸、物流陨闹、結(jié)算等諸多流程沒有涉及,所以僅為簡單閉環(huán)流程--即本域業(yè)務(wù)范圍內(nèi)從無到有再到無的過程薄坏,而第三類測試即屬于按照公司業(yè)務(wù)線發(fā)展趋厉,將中間所有的主流程全部涉及,覆蓋面更廣胶坠,數(shù)據(jù)要求更嚴(yán)格
測試目標(biāo)
第一類接口測試我們的目標(biāo)是接口全覆蓋君账,代碼覆蓋率達到90%,并且測試目標(biāo)為可持續(xù)多次運行涵但,且測試通過,第二類測試要求可以循環(huán)測試多輪帖蔓,且測試通過矮瘟,第三類測試要求可動態(tài)循環(huán)測試,并且要求每一個流程的數(shù)據(jù)與理想數(shù)據(jù)相符塑娇,且測試通過
技術(shù)選型與測試相關(guān)工具
有了前面的條件后澈侠,我們就可以考慮技術(shù)選型和工具相關(guān)的準(zhǔn)備工作了,畢竟工欲善其事埋酬,必先利其器嘛哨啃,我們先把能想到的準(zhǔn)備好了烧栋,才能防止未知的問題,首先我們來看看技術(shù)選型拳球,測試工程肯定是需要遠(yuǎn)程調(diào)用接口服務(wù)的审姓,而常見的接口一般是Http和RPC兩種,我們產(chǎn)品線內(nèi)部使用則是直接選擇RPC調(diào)度祝峻,所以Dubbo是必不可少的魔吐,而項目工程可能會需要獨立運行的能力,而SpringBoot也是不錯的選擇莱找,(至于Http接口酬姆,這里可以默認(rèn)選擇使用HttpClient框架進行請求工具類封裝,也可以選擇使用OkHttp3+Retfit2進行快速簡單的Http請求操作)奥溺。而我們需要測試一般可選的市場主流的測試框架并不多辞色,常見的如Junit、Nunit浮定、TestNg相满、Mock等,而Mock用于模擬用戶操作壶唤,并不觸發(fā)真實操作雳灵,一般情況下用于接口開發(fā)的單元測試使用,可以有效的查找問題闸盔,而我們當(dāng)前測試需要依賴真實的遠(yuǎn)程服務(wù)悯辙,進行請求操作,與Mock背道而馳迎吵,且我司在項目開發(fā)的過程中躲撰,已經(jīng)使用Mock進行了單元測試睬塌,所以Mock被排除在外铣焊,Junit和Nunit屬于類似的測試框架產(chǎn)物,由于是最早提出的測試剝離的框架搔预,并且也是第一個進行完善測試的框架蔫巩,所以一直到現(xiàn)在也是最常用的測試框架之一谆棱,但是JUnit有以下幾個約束至今依然存在:
- 它們的名稱必須以 test 開始,如果不是test開頭將會啟動異常
- 它們不返回任何值,junit測試過程中所有的測試方法必須是void,否則測試啟動異常
- 它們不能帶任何參數(shù),junit直到最新的版本中依然不支持動態(tài)測試傳遞參數(shù)圆仔,即方法必須無參垃瞧,雖然發(fā)展到現(xiàn)在有各種設(shè)計模式和編程技巧可以讓我們盡量避免這個約束的問題,比如使用全局變量坪郭,并且在測試啟動的時候注入有參構(gòu)造个从,解決傳遞參數(shù)的問題等,但是靈活度和實用性很差,測試工作也會變得局限性很大嗦锐,且復(fù)雜度會很高
而TestNg比起Junit更年輕嫌松,且直到現(xiàn)在依然在保持著更新狀態(tài),TestNg從jdk1.5開始奕污,就開始改變測試的方式和細(xì)節(jié)萎羔,完全擁抱java的新特性,如靜態(tài)菊值、注解等外驱,TestNg提供了更多的生命周期和一堆默認(rèn)組件,甚至于提供了大量的注解腻窒,可以滿足常見的主流測試昵宇,主流IDE來說,TestNg也有對應(yīng)的插件可以輔助測試儿子,并且TestNg還有擴展機制瓦哎,可以支持企業(yè)級復(fù)雜測試需求的定制化,由此可見柔逼,TestNg相比較于其他幾個框架來說會更加合適一些蒋譬,思考完這些,我們可以著手考慮開始快速搭建工程了
項目搭建
首先打開IDEA愉适,使用Spring插件--Spring Assistant快速創(chuàng)建一個Springboot工程犯助,這里我們默認(rèn)選擇SpringBoot2.1.9版本,下面需要選擇的start啟動類维咸,我們默認(rèn)勾選web啟動類即可(其實這里我們不需要任何啟動類剂买,因為工程并不需要啟動,也不需要成為web工程)癌蓖,然后等待工程創(chuàng)建完畢即可
選擇完畢以后瞬哼,等待工程創(chuàng)建完畢,這里我們將這三個文件進行刪除:
這個時候租副,我們打開pom.xml文件可以看到坐慰,當(dāng)前工程中僅僅引入了spring-boot-web相關(guān)的jar以及test相關(guān)的jar,但是我們查看maven依賴可以看到用僧,test中使用的jar是junit系列结胀,所以我們需要重新添加testNg依賴,且為了簡化開發(fā)责循,我們這里也依賴lombok糟港,坐標(biāo)如下:
<!--引入testNg-->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.10</version>
<scope>test</scope>
</dependency>
<!--引入lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
<scope>provided</scope>
</dependency>
至此,testNg基本集成已經(jīng)完成沼死,我們開始第一個Test類的編寫吧着逐!由于我們的maven依賴作用域范圍為test崔赌,即jar生效范圍在src/test包下生效意蛀,但是由于我們當(dāng)前工程就是為了測試而搭建的工程耸别,這里建議刪除test包或者完全不編寫,而是修改范圍使其在src/main下生效,并且我們將版本號進行統(tǒng)一管理县钥,修改后的依賴如下:
<!-- 版本號管理 -->
<properties>
<java.version>1.8</java.version>
<testNg.version>6.10</testNg.version>
<lombok.version>1.16.10</lombok.version>
</properties>
.............
<!--引入testNg-->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testNg.version}</version>
</dependency>
<!--引入lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
現(xiàn)在我們開始編寫我們的第一個Test類秀姐,開啟我們的TestNg學(xué)習(xí)之旅吧