如何知道我們的E2E測(cè)試覆蓋率?

在單元測(cè)試中,很容易知道已經(jīng)覆蓋了哪些代碼區(qū)域。但是我們能及時(shí)知道API調(diào)用的動(dòng)態(tài)范圍嗎?我們一直在思考,既然已經(jīng)編寫了許多 E2E 測(cè)試用例,但是我們應(yīng)該繼續(xù)編寫多少剩余測(cè)試?

在單元測(cè)試中,很容易知道已經(jīng)覆蓋了哪些代碼區(qū)域。但是我們能及時(shí)知道API調(diào)用的動(dòng)態(tài)范圍嗎?我們一直在思考,既然已經(jīng)編寫了許多 E2E 測(cè)試用例,但是應(yīng)該繼續(xù)編寫多少剩余測(cè)試?永遠(yuǎn)不夠?或者我們可以止步于此?

我們需要一個(gè)可以告訴當(dāng)下在哪里的女巫,她就是 Java Agent。

什么是 Java Agent

什么是Java代理?

Java代理是為應(yīng)用程序提供檢測(cè)功能的軟件組件。在代理的上下文中 ,檢測(cè)提供了重新定義在運(yùn)行時(shí)加載的類內(nèi)容的功能。

幸運(yùn)的是,我們有 Jacoco 代理。Jacoco 代理是 Java 代理之一,它可以在 JVM 加載類文件時(shí)標(biāo)記類代碼,并在調(diào)用任何代碼后及時(shí)計(jì)算覆蓋范圍。我們可以轉(zhuǎn)儲(chǔ)覆蓋數(shù)據(jù)并上傳到SonarQube 以使其可視化。獲取最新的Jacoco代理

我們可以從其官方網(wǎng)站(https://www.eclemma.org/jacoco/) 獲得最新的 jacoco 代理。請(qǐng)隨時(shí)將最新的* .zip文件下載到本地計(jì)算機(jī)并解壓縮。只需要使用以下兩個(gè)文件:

  • lib / jacocoagent.jar –> Java代理用以標(biāo)記代碼

  • lib / jacococli.jar –> CLI轉(zhuǎn)儲(chǔ)覆蓋率數(shù)據(jù)并生成報(bào)告

宿主應(yīng)用程序啟動(dòng)參數(shù)設(shè)置

開始了!假設(shè)有一個(gè)偽裝的后端服務(wù)應(yīng)用程序,我們將其命名為“ MyBackendService.jar”。該服務(wù)提供了一些RESTful API。一旦任何外部應(yīng)用程序調(diào)用了這些API,我們都希望在服務(wù)運(yùn)行良好時(shí)計(jì)算覆蓋率。啊..聽起來像是基本的E2E測(cè)試場景,對(duì)吧?最大的不同是,我們將自動(dòng)打開瀏覽器來模擬用戶操作(鍵入或單擊)以與后端服務(wù)進(jìn)行交互。

有一種經(jīng)典的方式(java -jar any.jar)來啟動(dòng)后端服務(wù)并設(shè)置參數(shù)“ -javaagent”的值。

java 

-javaagent:/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=localhost,append=true -jar MyBackendService.jar
  • output = tcpserver:這代表JacocoAgent將偵聽端口以處理進(jìn)一步的請(qǐng)求,以下載覆蓋數(shù)據(jù)。

  • port = 6300:這意味著jacoco代理正在偵聽哪個(gè)端口。

  • include =* :這意味著我們可以過濾應(yīng)該包括哪些源代碼。例如include = com.fizz.api。:com.buzz.controller。

如果我們通過 Docker 運(yùn)行后端服務(wù)怎么辦?我強(qiáng)烈建議您在 docker 鏡像中構(gòu)建jacocoagent。有一個(gè)可能的 Dockerfile 示例,如下所示:

#### Dockerfile #####

ENV JACOCOAGENT_OPTION 
-javaagent:/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=*,append=true
COPY ${JACOCO_AGENT} /jacocoagent.jar
ADD /MyBackendService.jar /App.jar
ENTRYPOINT java ${JACOCOAGENT_OPTION} -server -jar /App.jar

Watch out! Don't forget to expose the port jacocoagent is litening on. docker run -d -p 32399:33399 -p 6300:6300 myBackendServiceImage:latest
 

轉(zhuǎn)儲(chǔ)覆蓋率數(shù)據(jù)

幾次之后,我假設(shè)您的后端 API 服務(wù)已經(jīng)被調(diào)用了很多次?,F(xiàn)在是時(shí)候轉(zhuǎn)儲(chǔ) coverage 數(shù)據(jù)了。

java -jar /lib/jacococli.jar dump --address localhost --port 6300 --destfile ./coverage.exec

執(zhí)行上面的命令以從 jacocoagent tcp 服務(wù)器檢索 coverage 數(shù)據(jù),并將數(shù)據(jù)寫入名為 coverage.exec 的本地文件。

生成可視化報(bào)告

覆蓋率數(shù)據(jù)文件(coverage.exec)對(duì)任何人都沒有意義。我們可以將其可視化為 html 或 xml 報(bào)告。這是人類友好的格式。

java -jar /lib/jacococli.jar report ./coverage.exec --classfiles ./build/classes --html htmlReportFolder --
xml xmlReportFileName.xml
  • –classfiles:此參數(shù)是必需的,它必須是已編譯的類文件的目錄路徑。例如,如果使用Maven作為構(gòu)建工具,則應(yīng)為“ yourPorjectDirectory / taget / classes”。如果是Gradle,則應(yīng)為“ yourProjectDirectory / build / classes”。

您應(yīng)該能夠檢查 htmlReportFolder 或 xml 文件以立即查看覆蓋范圍,或者出現(xiàn)了其他意外情況。

將報(bào)告上傳到SonarQube(可選)

如果您有一個(gè)獨(dú)立的 SonarQube 服務(wù)器,這非常好,因?yàn)槲覀兛梢詫⒏采w率數(shù)據(jù)報(bào)告上傳到 Sonar Web 服務(wù)器,以便其他任何人都可以查看。

./mvnw sonar:sonar  
-Dsonar.coverage.jacoco.xmlReportPaths=./xmlReportFileName.xml  
-Dsonar.java.binaries=./build/classes 
-Dsonar.sources=./src/main/java 
-Dsonar.inclusions="**/*Api.java,**/*Controller.java"
  • sonar.coverage.jacoco.xmlReportPaths:我們?cè)谏弦徊街猩傻膞ml報(bào)告文件的完整路徑。

  • sonar.java.binaries:編譯的類目錄。

  • sonar.inclusions:這是可選的,您可能想知道僅調(diào)用了多少個(gè)api。

結(jié)論

通常,這是您其中一個(gè)可能的解決方案,并且記住僅在基于 JVM 的語言中有效??梢暬?E2E 測(cè)試覆蓋范圍可以指導(dǎo)回答我們身在何處的問題。

文/ThoughtWorks鄧何均

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

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

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