最近我司事業(yè)部的業(yè)務(wù)中臺開發(fā)完畢,由于中臺業(yè)務(wù)的特殊性,并沒有對應(yīng)的頁面操作等,所以我們需要做
一個線上的可自動化部署的接口自動化測試平臺,但是搜遍了全網(wǎng)的博客資料等,發(fā)現(xiàn)居然沒有完整的自動
化的系列文章,找到的幾十篇博客更是把如今的博客生態(tài)圈的抄襲展現(xiàn)的淋漓盡致,很多文章的內(nèi)容是完全
一樣的,而且最讓人氣憤的是,很多搭建的細(xì)節(jié)都沒有描述,或者描述的并不是正確的,居然沒有人進(jìn)行驗
證后在發(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ù)全部進(jìn)行單元測試覆蓋,并且完整測試通過,第二類子流程閉環(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)是接口全覆蓋,代碼覆蓋率達(dá)到90%,并且測試目標(biāo)為可持續(xù)多次運(yùn)行,且測試通過,第二類測試要求可以循環(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是必不可少的,而項目工程可能會需要獨立運(yùn)行的能力,而SpringBoot也是不錯的選擇,(至于Http接口,這里可以默認(rèn)選擇使用HttpClient框架進(jìn)行請求工具類封裝,也可以選擇使用OkHttp3+Retfit2進(jìn)行快速簡單的Http請求操作)。而我們需要測試一般可選的市場主流的測試框架并不多,常見的如Junit、Nunit、TestNg、Mock等,而Mock用于模擬用戶操作,并不觸發(fā)真實操作,一般情況下用于接口開發(fā)的單元測試使用,可以有效的查找問題,而我們當(dāng)前測試需要依賴真實的遠(yuǎn)程服務(wù),進(jìn)行請求操作,與Mock背道而馳,且我司在項目開發(fā)的過程中,已經(jīng)使用Mock進(jìn)行了單元測試,所以Mock被排除在外,Junit和Nunit屬于類似的測試框架產(chǎn)物,由于是最早提出的測試剝離的框架,并且也是第一個進(jì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還有擴(kuò)展機(jī)制,可以支持企業(yè)級復(fù)雜測試需求的定制化,由此可見,TestNg相比較于其他幾個框架來說會更加合適一些,思考完這些,我們可以著手考慮開始快速搭建工程了
項目搭建
首先打開IDEA,使用Spring插件--Spring Assistant快速創(chuàng)建一個Springboot工程,這里我們默認(rèn)選擇SpringBoot2.1.9版本,下面需要選擇的start啟動類,我們默認(rèn)勾選web啟動類即可(其實這里我們不需要任何啟動類,因為工程并不需要啟動,也不需要成為web工程),然后等待工程創(chuàng)建完畢即可



選擇完畢以后,等待工程創(chuàng)建完畢,這里我們將這三個文件進(jìn)行刪除:

這個時候,我們打開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下生效,并且我們將版本號進(jìn)行統(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í)之旅吧