您現在的位置是:首頁 > 藝術

程式碼覆蓋率在DevOps中的應用(附案例演示)

由 道普雲 發表于 藝術2023-02-01
簡介一執行這個jar包就相當於這個Java的服務也就起來了,但是我在執行這個服務的同時,把Jacoco也執行起來,換句話說就是我啟動這個服務的同時,讓它不停給我監聽、監控著程式碼的覆蓋統計的情況

電腦程式碼在哪裡找

程式碼覆蓋率在DevOps中的應用(附案例演示)

前面的文章裡我們講了程式碼覆蓋率的理論知識以及程式碼覆蓋率的工具介紹

接下來的文章我們介紹一下程式碼覆蓋率在

DevOps中的應用

單元測試我們不可能一直本地化地這樣執行,我們找一個

Jekenis,把程式碼傳到gitte、github、gitlab等程式碼倉庫中。在Jenkins上配一個任務,把程式碼拉取下來之後,進行打包、編譯、出覆蓋率報告,出完了覆蓋率報告之後,推送到Jenkins前段去進行展示。

這個對於開發人員來說可能都比較熟悉了,咱們測試人員接觸的可能少一些,但是我們要知道這個原理。總體來說就是把程式碼放到

Jenkins上去,拉取之後先執行,編譯,執行單元測試,統計程式碼覆蓋率,然後程式碼覆蓋率到達一個值之後,才允許你進行下一步的構建,這也是我們現在很多流水線上都做的一個操作。

下面是兩個很簡單的例子,拉取程式碼,執行

shell檔案,執行之後出報告,出報告之後把這個程式碼跑起來,在服務的架設上把程式碼的覆蓋率推送給前端去展示。

程式碼覆蓋率在DevOps中的應用(附案例演示)

我們這裡說的功能測試其實也包含介面測試。回到一開始我們提到的內容,執行測試的方式不同,覆蓋率關心的東西也不同。

剛才我們說的是執行單元測試用例,所以我們關心的是單元測試的覆蓋率。現在我們說的是介面測試,我們執行的是介面測試的測試用例,那我們統計的也是覆蓋率,我們叫介面測試測到的程式碼覆蓋率情況。

但實際上統計的都是程式碼。如果我們再進一步,我們測的是功能,我們在頁面上點點點,那我們最終統計的是功能測試的程式碼覆蓋率情況。

最終的落腳點還是統計程式碼,只不過你的測試手段不一樣。不管是介面還是功能,其實都一樣。

有很多朋友會問,介面測試程式碼覆蓋率是什麼意思?介面測試程式碼覆蓋率也是程式碼覆蓋率,只不過你執行測試用例的手段是執行介面測試用例,所以沒有區別。

操作流程:

gitte拉取——-> maven編譯、打包——->啟動event。jar並新增jacoco-agent監聽 ——->關聯介面自動化專案開始執行——->向event專案傳送dump指令——->生成jacoco覆蓋率報告

下面我們來演示一下。我現在找了一臺

Linux主機,在這個主機上提前放好了一個專案。

程式碼覆蓋率在DevOps中的應用(附案例演示)

這個專案是我們以前寫的一個做效能測試和持續整合時候的專案。這個專案是一個純介面的一個專案,沒有頁面。我執行

Maven命令的時候,會把它打包成一個jar包,我們先把這個jar包執行起來。

程式碼覆蓋率在DevOps中的應用(附案例演示)

一執行這個

jar包就相當於這個Java的服務也就起來了,但是我在執行這個服務的同時,把Jacoco也執行起來,換句話說就是我啟動這個服務的同時,讓它不停給我監聽、監控著程式碼的覆蓋統計的情況。

他是怎麼監控的呢?一個是對你程式裡的

java配置進行一些小的變更,其實不用汙染程式碼,是需要加一個jar包就可以,加一些依賴就可以。加好之後,啟動專案的時候要加一個額外的輔助命令:

nohup java-javaagent:jacocoagent。jar=includes=*,output=tcpserver,address=192。168。0。188,port=12345 -jar event-0。0。1-SNAPSHOT。jar &

這個

jacocoagent。jar的包去哪下呢?剛才咱們展示的官方的那個包裡就有這個jar包。這個jar包放在你的伺服器上,啟動專案的同時,連同這個jar包一起啟動。

並且對外指定一個協議型別是

tcp協議,地址是你的伺服器的內網的地址,埠號隨便寫一個,比如說示例這裡寫的是12345,Jacoco的官方也是推薦你使用12345,它的示例裡面也是這樣寫的。

也就是說我在啟動原始的服務的同時,啟動一個

server,這個server是用來出程式碼覆蓋率報告的,也就是說我們同時啟動了兩個服務,一個是我的服務本身,還有一個是程式碼覆蓋率統計的服務,這個服務依然在本地,埠號是12345。

程式碼覆蓋率在DevOps中的應用(附案例演示)

放在伺服器之後,我們可以看到大概花費了

10秒鐘的時間把它起來了。起來之後,我們去訪問一個介面,然後看一下程式碼覆蓋率到底覆蓋了哪些程式碼。

程式碼覆蓋率在DevOps中的應用(附案例演示)

然後我們在這個專案的本地,找到

jacococli。jar,我們用這個包來出覆蓋率的報告。剛才的服務我們起來了,並且開了一個埠號,用於出覆蓋率,那我們現在就應該訪問剛才那個地址和12345埠,把剛才報告統計的資訊輸出出來。

程式碼覆蓋率在DevOps中的應用(附案例演示)

dump結果檔案:

現在執行第二個命令:

java -jar jacococli。jar dump ——address localhost ——port 12345 ——destfile 。/jacoco-demo。exec

注意我們不是在一臺電腦上執行的,這個是在本地執行的,我們填的是剛才那臺伺服器的外網地址,

12345埠。出一個覆蓋率的報告,這個檔案就放在我們當前的路徑下就可以。

它的含義是,訪問遠端的服務埠,出具這一段時間(從程式碼起來到目前為止)的程式碼覆蓋的情況。

生成報告:

java -jar jacococli。jar report 。/jacoco-demo。exec ——classfiles 。/target/classes ——html 。/report

我們有了這個路徑了,接著要出一個覆蓋率的報告了,還在這個路徑下,透過剛才那個檔案生成了一個報告,把報告儲存在當前路徑下一個叫

report的資料夾裡,這叫遠端出報告。

程式碼覆蓋率在DevOps中的應用(附案例演示)

我們一起看一下這個報告,我們先來看一下

controller控制器裡面的東西。

程式碼覆蓋率在DevOps中的應用(附案例演示)

我們可以看到有這麼多的介面,其中有一個介面叫

findAllCity,這個介面被測到了,所以這個介面是百分之百。其他的介面都沒有被測到,那我們現在再測一個,findCityByName。

我們再訪問這個介面的地址,我們再重複剛才的動作,再出一個報告,看看是否有變化,我們可以看到報告已經跟上面的不一樣了。

程式碼覆蓋率在DevOps中的應用(附案例演示)

也就是說,只要我們不停地去測,我們就可以看到在測介面的過程中程式碼覆蓋率的情況了。

很多朋友可能會問了,如果要是測功能測試,頁面測試呢?

我們現在測的是介面,假設現在有一個頁面,我們在頁面上點點點,出來一個報告,報告裡同樣會展示哪裡被測到了,哪裡沒有被測到,測試過多少程式碼都可以被看到。

問題又來了,有時候開發測試團隊並沒有遵循那麼標準的流程,我先上一班,都改完後再上一版,這就是我們經常所說的全量覆蓋率對於日常迭代,尤其是敏捷開發模型下面其實是沒有什麼價值的。

什麼意思呢,張三可能在下午

4點的時候測了一版,他的覆蓋率是80%,這時候李四是一個開發,就改了一點程式碼,但張三沒有必要把所有程式碼都改一遍了,他只測李四的修改就可以了,這個時候他的程式碼覆蓋率可能從第一個全量版本的80%一下子跌到下一個版本可能只有10%。

所以說我們在很多實際情況下要統計增量程式碼的覆蓋情況,這個就需要我們自己來寫指令碼,來做程式碼庫的

diff

,來對比兩個程式碼庫

diff

的不同點,來看是否被統計,我們要二次渲染、修改這個報告。

以上

就是我們

本系列文章

分享的所有內容了,給大家展示了什麼是程式碼覆蓋率,程式碼覆蓋率的價值是什麼,怎麼做單元測試程式碼覆蓋率的整合,怎麼做功能測試程式碼覆蓋率的一個簡單演示。

推薦文章