只懂黑盒測試也能學會的代碼覆蓋率及精準化測試

      網友投稿 966 2025-03-31

      測試覆蓋率是對測試完成程度的度量。它通常依據某種覆蓋準則來對測試用例執行情況進行衡量,以判斷測試執行得是否充分


      ——出自《

      計算機科學技術名詞 》第三版

      今天文章中我們給大家介紹覆蓋率統計及覆蓋率分析。在10月13日20:00,資深測試開發架構師思寒將光臨直播間手把手教大家如何搞定精準化測試!

      溫馨提示:你以為代碼覆蓋率與精準化測試知識與黑盒測試無緣?不,你只是沒遇到思寒講的這節課。

      常見覆蓋率統計工具

      emma

      cobertura

      jacoco

      emma 與 cobertura 是為單元測試而設計的覆蓋率統計,jacoco 與 emma 同屬于一家公司,但是是為了更廣泛的覆蓋率統計而設計的工具。

      Jacoco

      jacoco 的文檔中有個 mission 章節,里面對 jacoco 的定位描述的很好。原文的大意是說其他的工具沒有得到積極有效的維護,而且其他的工具都是為了單一任務而設計,他們不是為了 “集成” 而生。從這一點上我們就可以看出 jacoco 的設計理念。

      得益于 jacoco 的設計理念,以及良好的 api 設計,它可以輕松的與已有的工具集成,甚至進行平臺化。它也可以同時用于單元測試與集成測試,所以是一款非常優秀的覆蓋率統計工具,很多公司的精準化測試,就是重度依賴了 jacoco。

      覆蓋率分析原理

      要了解代碼覆蓋率的統計原理,我們就需要去深入了解 jvm 的機制。這方面的知識是 java 領域的高端進階知識,限于篇幅,我們只講解下大概的原理,完整內容請參考 VM 虛擬機系列的書籍,以及 newrelic 早年發布的若干代碼插樁的資料。

      簡單說下原理,java 源代碼會被 javac 編譯為 class 文件,class 文件保存了 class 的基本信息與 jvm 的指令集。java 的底層 runtime,也就是 jvm 在解析 class 的時候,會把文件格式的 class 讀取到內存并運行。android 也是借鑒了這一整套的設計理念,android 上的 runtime 其實是 dalvik 與 art。

      當我們要統計代碼覆蓋率的時候,就需要在代碼的執行路徑上加入探針分析。通常是在讀取類的時候,在關鍵的指令塊的出口與入口增加標記。當指令塊被執行后,就會命中探針并完成記錄。

      要修改最底層的 jvm 字節碼往往是比較麻煩的,需要精通 jvm 的各種指令以及 java class 結構。這方面的處理目前已有有非常成熟的開源項目可以做大了,如下就是一些知名的字節碼修改工具。

      ASM

      JavaAssist

      ByteBuddy、BTrace、JVM-Sandbox

      其中 ASM 是所有字節碼操作的底層基礎,是最底層的字節碼修改工具。其他工具是它之上的一些高級封裝。借助于這些工具與 JVM 自身的一些調試特性,我們就可以對 jvm 代碼或者進程進行便捷的操縱了。

      插樁方式

      插樁方式有很多種,常見的方式如下

      源代碼插樁:offline 插樁,支持 android

      只懂黑盒測試也能學會的代碼覆蓋率及精準化測試

      字節碼插樁:offline 插樁,支持 android

      javaagent 模式:脫離代碼在運行時插樁,on the fly 模式

      jacoco 支持字節碼插樁與 javaagent 這兩種插樁方式。也就是就算沒有源代碼也可以統計到覆蓋率數據,但是最后分析的時候,還是要結合源代碼才能獲得更多的覆蓋率細節數據。畢竟覆蓋率的統計,并不是只是簡單的覆蓋率數據本身的指標高低。

      jacoco的工作方式

      jacoco 支持四種工作模式

      file:進程結束的時候在本地生成文件

      tcpserver:開啟端口等待客戶端獲取覆蓋率

      tcpclient:主動把覆蓋率數據發送出去

      none:不生成覆蓋率

      很多人都會使用 file 模式,但是 tcp server 模式才是最易用的。因為不需要申請服務器的文件訪問權限就可控制覆蓋率數據。你可以根據自己公司的部署情況選擇合適的工作模式。

      on the fly 插樁模式是使用最多的。首先需要在你的被測 java 程序啟動的時候,加入 jvm 的一些 javaagent 參數。

      -javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2] destfile output:file、tcpserver、tcpclient、none address port

      你可以自己設置適合的工作模式。

      離線插樁模式,適合 android 的覆蓋率統計,需要借助于 maven、gradle 等構建工具的 instrument 指令。

      jacoco-cli 是 jacoco 的一個組件,可以在不依賴 maven、gradle 構建工具的情況下完成對代碼的分析。主要用于 tcpserver 工作模式下。

      用法如下

      java -jar jacococli.jar dump [--address

      ] --destfile [--help] \ [--port ] [--quiet] [--reset] [--retry ]

      這是學院里的一個動手演練的小場景,統計 jmeter 工具的啟動覆蓋率

      自動化測試

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS表格辦公—給單元格內數值增加小數位數(wps表格輸入數字自動變成小數)
      下一篇:Excel表格中單元格插入斜線并打字的方法(excel表格怎么在斜線里打字)
      相關文章
      亚洲黄色在线电影| 亚洲精品白色在线发布| 亚洲愉拍一区二区三区| 亚洲妓女综合网99| 亚洲精品免费在线视频| 久久久久亚洲精品影视| 亚洲AV日韩AV高潮无码专区| 久久亚洲国产视频| 亚洲电影一区二区三区| 亚洲男人第一av网站| 777亚洲精品乱码久久久久久 | 亚洲成A人片在线观看无码3D| 亚洲国产成人精品无码区二本 | 亚洲成av人影院| 亚洲AV无码码潮喷在线观看| 亚洲成AV人片一区二区| 亚洲成人午夜在线| 亚洲视频一区二区在线观看| 亚洲成a人片在线观看中文!!!| 亚洲综合在线成人一区| 亚洲乱码无限2021芒果| 亚洲人成电影网站久久| 亚洲精品无码久久久久A片苍井空| 亚洲熟妇成人精品一区| 亚洲AV无码专区在线观看成人| 无码不卡亚洲成?人片| 亚洲精品国产V片在线观看| 怡红院亚洲怡红院首页| 亚洲AV无码精品无码麻豆| 日韩亚洲AV无码一区二区不卡| 亚洲精品视频在线观看免费| 亚洲一级毛片免费观看| 亚洲精品无码久久久久牙蜜区| 亚洲福利在线播放| 亚洲午夜久久久久久久久电影网| 亚洲AV无码成人精品区在线观看 | 国产精品亚洲精品日韩电影| 国产亚洲精品看片在线观看| 久久亚洲一区二区| 亚洲国产精品久久网午夜 | 亚洲婷婷五月综合狠狠爱|