日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

你們單測覆蓋率是如何統(tǒng)計的?原理是什么?

來源: 責編: 時間:2024-04-02 17:23:05 240觀看
導讀高手回答我們在進行單元測試時,經(jīng)常需要關(guān)注一個覆蓋率的指標,許多發(fā)布流程甚至要求達到特定的百分比。那么,單元測試覆蓋率是如何統(tǒng)計的呢?其底層實現(xiàn)原理又是怎樣的呢?單元測試覆蓋率的統(tǒng)計原理實際上是通過字節(jié)碼插樁實

高手回答

我們在進行單元測試時,經(jīng)常需要關(guān)注一個覆蓋率的指標,許多發(fā)布流程甚至要求達到特定的百分比。B4o28資訊網(wǎng)——每日最新資訊28at.com

那么,單元測試覆蓋率是如何統(tǒng)計的呢?其底層實現(xiàn)原理又是怎樣的呢?B4o28資訊網(wǎng)——每日最新資訊28at.com

單元測試覆蓋率的統(tǒng)計原理實際上是通過字節(jié)碼插樁實現(xiàn)的。也就是說,在編譯期間會向代碼中注入一些特殊的監(jiān)控代碼,以記錄測試執(zhí)行過程中代碼的執(zhí)行情況,從而推斷代碼的覆蓋情況。這些監(jiān)控代碼能在運行時記錄代碼的執(zhí)行情況,也能在編譯時生成代碼覆蓋率報告。B4o28資訊網(wǎng)——每日最新資訊28at.com

常見的單元測試覆蓋率統(tǒng)計工具包括JaCoCo、Emma、Cobertura等,這些工具能夠在編譯或運行時對代碼進行插樁,并記錄代碼的執(zhí)行情況,最終生成覆蓋率報告。B4o28資訊網(wǎng)——每日最新資訊28at.com

具體見下表:B4o28資訊網(wǎng)——每日最新資訊28at.com

工具
B4o28資訊網(wǎng)——每日最新資訊28at.com

Jacoco
B4o28資訊網(wǎng)——每日最新資訊28at.com

Emma
B4o28資訊網(wǎng)——每日最新資訊28at.com

Cobertura
B4o28資訊網(wǎng)——每日最新資訊28at.com

原理
B4o28資訊網(wǎng)——每日最新資訊28at.com

使用 ASM 修改字節(jié)碼
B4o28資訊網(wǎng)——每日最新資訊28at.com

修改 jar 文件,class 文件字節(jié)碼文件
B4o28資訊網(wǎng)——每日最新資訊28at.com

基于 jcoverage,基于 asm 框架對 class 文件插樁
B4o28資訊網(wǎng)——每日最新資訊28at.com

覆蓋粒度
B4o28資訊網(wǎng)——每日最新資訊28at.com

行,類,方法,指令,分支
B4o28資訊網(wǎng)——每日最新資訊28at.com

行,類,方法,基本塊,指令,無分支覆蓋
B4o28資訊網(wǎng)——每日最新資訊28at.com

項目,包,類,方法的語句覆蓋/分支覆蓋
B4o28資訊網(wǎng)——每日最新資訊28at.com

插樁
B4o28資訊網(wǎng)——每日最新資訊28at.com

on the fly、offline
B4o28資訊網(wǎng)——每日最新資訊28at.com

on the fly、offline
B4o28資訊網(wǎng)——每日最新資訊28at.com

offline,把統(tǒng)計代碼插入編譯好的class文件中
B4o28資訊網(wǎng)——每日最新資訊28at.com

生成結(jié)果
B4o28資訊網(wǎng)——每日最新資訊28at.com

在 Tomcat 的 catalina.sh 配置 javaangent 參數(shù),指出需要收集覆蓋率的文件,shutdown 時才收集,只能使用 kill 命令關(guān)閉 Tomcat,不要使用 kill -9
B4o28資訊網(wǎng)——每日最新資訊28at.com

html、xml、txt,二進制格式報表
B4o28資訊網(wǎng)——每日最新資訊28at.com

html,xml
B4o28資訊網(wǎng)——每日最新資訊28at.com

缺點
B4o28資訊網(wǎng)——每日最新資訊28at.com

需要源代碼
B4o28資訊網(wǎng)——每日最新資訊28at.com

1、需要 debug 版本,并打來 build.xml 中的 debug 編譯項;2、需要源代碼,且必須與插樁的代碼完全一致
B4o28資訊網(wǎng)——每日最新資訊28at.com

1、不能捕獲測試用例中未考慮的異常;2、關(guān)閉服務器才能輸出覆蓋率信息(已有修改源代碼的解決方案,定時輸出結(jié)果;輸出結(jié)果之前設(shè)置了 hook,會與某些服務器的 hook 沖突,web 測試中需要將 cobertura.ser 文件來回 copy
B4o28資訊網(wǎng)——每日最新資訊28at.com

性能
B4o28資訊網(wǎng)——每日最新資訊28at.com


B4o28資訊網(wǎng)——每日最新資訊28at.com

小巧
B4o28資訊網(wǎng)——每日最新資訊28at.com

插入的字節(jié)碼信息更多
B4o28資訊網(wǎng)——每日最新資訊28at.com

執(zhí)行方式
B4o28資訊網(wǎng)——每日最新資訊28at.com

maven,ant,命令行
B4o28資訊網(wǎng)——每日最新資訊28at.com

命令行
B4o28資訊網(wǎng)——每日最新資訊28at.com

maven,ant
B4o28資訊網(wǎng)——每日最新資訊28at.com

Jenkins 集成
B4o28資訊網(wǎng)——每日最新資訊28at.com

生成 html 報告,直接與 hudson 集成,展示報告,無趨勢圖
B4o28資訊網(wǎng)——每日最新資訊28at.com

無法與 hudson 集成
B4o28資訊網(wǎng)——每日最新資訊28at.com

有集成的插件,美觀的報告,有趨勢圖
B4o28資訊網(wǎng)——每日最新資訊28at.com

報告實時性
B4o28資訊網(wǎng)——每日最新資訊28at.com

默認關(guān)閉,可以動態(tài)從 jvm dump 出數(shù)據(jù)
B4o28資訊網(wǎng)——每日最新資訊28at.com

可以不關(guān)閉服務器
B4o28資訊網(wǎng)——每日最新資訊28at.com

默認是在關(guān)閉服務器時才寫結(jié)果
B4o28資訊網(wǎng)——每日最新資訊28at.com

維護狀態(tài)
B4o28資訊網(wǎng)——每日最新資訊28at.com

持續(xù)更新中
B4o28資訊網(wǎng)——每日最新資訊28at.com

停止維護
B4o28資訊網(wǎng)——每日最新資訊28at.com

停止維護,不支持java1.8的lamda表達式
B4o28資訊網(wǎng)——每日最新資訊28at.com

什么是字節(jié)碼插樁

Java字節(jié)碼插樁技術(shù)是指在編譯期或運行期,通過修改Java字節(jié)碼的方式,在代碼中插入額外的代碼。這種技術(shù)可以在不改變Java源代碼的情況下,對Java應用程序的運行時行為進行監(jiān)控、調(diào)試、分析和優(yōu)化等操作。舉例來說,它可以用于實現(xiàn)性能監(jiān)控、代碼覆蓋率檢測、代碼安全掃描等功能。B4o28資訊網(wǎng)——每日最新資訊28at.com

字節(jié)碼插樁技術(shù)通常包括以下幾個步驟:B4o28資訊網(wǎng)——每日最新資訊28at.com

  1. 生成目標類的字節(jié)碼,這一步可以通過Java編譯器(如javac)或其他工具(如AspectJ)來完成。
  2. 解析字節(jié)碼,識別需要進行插樁的代碼區(qū)域(如方法、循環(huán)、異常處理等)。
  3. 插入額外的字節(jié)碼,通常通過編寫Java代碼來實現(xiàn)這一步,然后利用字節(jié)碼生成庫(如ASM、Javassist等)生成相應的字節(jié)碼。
  4. 將修改后的字節(jié)碼重新寫回到磁盤或內(nèi)存中,以供后續(xù)使用。

假設(shè)我們希望對一個Java方法進行性能監(jiān)控,我們可以在方法的入口和出口處分別插入計時器,以統(tǒng)計方法的執(zhí)行時間。以下代碼展示了如何實現(xiàn)這一功能:B4o28資訊網(wǎng)——每日最新資訊28at.com

public class Monitor {    public static void start() {        long startTime = System.nanoTime();        // 將起始時間記錄到ThreadLocal中,以便在方法返回時進行計算        ThreadLocalHolder.set("startTime", startTime);    }    public static void end() {        long endTime = System.nanoTime();        // 獲取起始時間        long startTime = (long) ThreadLocalHolder.get("startTime");        // 計算方法執(zhí)行時間        long elapsedTime = endTime - startTime;        System.out.println("Method execution time: " + elapsedTime + "ns");    }}public class Example {    public void method() {        Monitor.start();        // 執(zhí)行方法邏輯        Monitor.end();    }}

然而,若需監(jiān)控多個方法的性能,分別在每個方法中插入Monitor.start()和Monitor.end()將導致代碼重復、可讀性下降,并存在遺漏的風險。在這種情況下,可以借助字節(jié)碼插樁技術(shù),在編譯期或運行期間自動向每個方法的入口和出口處插入Monitor.start()和Monitor.end(),以確保代碼的統(tǒng)一性和可維護性。B4o28資訊網(wǎng)——每日最新資訊28at.com

具體實現(xiàn)可借助字節(jié)碼生成庫ASM或Javassist來實現(xiàn),此處以ASM為例。以下代碼展示了如何使用ASM對Example類進行字節(jié)碼插樁:B4o28資訊網(wǎng)——每日最新資訊28at.com

import org.objectweb.asm.ClassReader;import org.objectweb.asm.ClassVisitor;import org.objectweb.asm.ClassWriter;import org.objectweb.asm.MethodVisitor;import org.objectweb.asm.Opcodes;import java.io.IOException;public class MonitorTransformer implements Opcodes {    public static byte[] transform(byte[] classBytes) throws IOException {        ClassReader reader = new ClassReader(classBytes);        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);        ClassVisitor visitor = new ClassVisitor(Opcodes.ASM5, writer) {            @Override            public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {                MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);                // 只為指定方法添加字節(jié)碼插樁                if ("method".equals(name) && "()V".equals(desc)) {                    mv = new MethodVisitor(Opcodes.ASM5, mv) {                        @Override                        public void visitCode() {                            super.visitCode();                            // 在方法執(zhí)行之前插入字節(jié)碼                            mv.visitMethodInsn(INVOKESTATIC, "Monitor", "start", "()V", false);                        }                        @Override                        public void visitInsn(int opcode) {                            // 在方法返回之前插入字節(jié)碼                            if (opcode == RETURN) {                                mv.visitMethodInsn(INVOKESTATIC, "Monitor", "end", "()V", false);                            }                            super.visitInsn(opcode);                        }                    };                }                return mv;            }        };        reader.accept(visitor, ClassReader.EXPAND_FRAMES);        return writer.toByteArray();    }}


B4o28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-80882-0.html你們單測覆蓋率是如何統(tǒng)計的?原理是什么?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 深度解析Git核心機理,你學會了嗎?

下一篇: 代碼是如何被被編譯的?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
夜夜嗨av一区二区三区四季av| 欧美精品一区二区精品网| 亚洲一区二区三区视频播放| 亚洲男人影院| 久久久久国产精品一区二区| 美女黄毛**国产精品啪啪| 欧美日韩国产综合视频在线| 国产乱码精品一区二区三区忘忧草 | 国产免费观看久久黄| 国产午夜精品一区二区三区欧美| 1024成人| 亚洲一区二区三区在线| 久久久国产成人精品| 欧美高清自拍一区| 国产精品系列在线播放| 亚洲第一综合天堂另类专| 亚洲午夜视频| 久久亚洲影音av资源网| 国产精品成人va在线观看| 一区在线观看| 亚洲影院污污.| 久久亚洲国产精品一区二区| 欧美性大战久久久久久久蜜臀| 韩国av一区二区| 中文国产亚洲喷潮| 久久综合色婷婷| 国产精品国产a级| 亚洲大胆女人| 亚洲欧美日韩国产成人| 欧美成人综合网站| 国产日韩欧美三级| 一本到高清视频免费精品| 久久精品毛片| 国产精品成人免费精品自在线观看| 一区二区三区在线视频播放| 亚洲一区二区三区中文字幕在线| 欧美77777| 国产在线精品自拍| 亚洲自拍偷拍麻豆| 欧美成ee人免费视频| 国产又爽又黄的激情精品视频| 一区二区三区四区国产| 欧美不卡在线视频| 韩国三级电影一区二区| 午夜精品久久久久久久久久久久| 欧美日韩成人一区二区三区| 在线看成人片| 久久9热精品视频| 国产精品久久久久一区二区三区共| 亚洲日本中文字幕| 久久综合久久综合九色| 国产一区二区三区精品久久久| 亚洲婷婷免费| 欧美精品一区二区精品网| 在线观看亚洲视频| 久久久久久久999| 国产香蕉97碰碰久久人人| 亚洲男人的天堂在线| 欧美日韩一区三区四区| 亚洲精品乱码| 欧美大片在线观看一区二区| 在线观看亚洲精品| 久久久久久国产精品mv| 国产综合欧美| 欧美在线免费视频| 国产视频欧美| 欧美在线观看视频| 国产情人节一区| 欧美一级视频| 国产日本欧美一区二区| 午夜亚洲精品| 国产精品一区二区久激情瑜伽| 亚洲在线国产日韩欧美| 国产精品理论片| 亚洲一区二区av电影| 国产精品成人va在线观看| 亚洲视频一区二区在线观看| 国产精品99免费看 | 久久一区亚洲| 国内外成人免费激情在线视频网站 | 亚洲九九爱视频| 欧美国产三区| 亚洲精品一区中文| 欧美日本久久| 99精品欧美一区二区蜜桃免费| 欧美日韩国产精品专区| 一区二区三区免费看| 欧美午夜一区二区福利视频| 中日韩美女免费视频网站在线观看| 欧美日韩在线精品一区二区三区| 一区二区高清在线| 国产精品久久久久7777婷婷| 亚洲欧美日韩精品久久亚洲区 | 欧美一级日韩一级| 国产一区二区三区奇米久涩| 久久狠狠亚洲综合| 一区二区三区无毛| 麻豆乱码国产一区二区三区| 亚洲黄色小视频| 欧美日韩极品在线观看一区| 亚洲图片欧洲图片日韩av| 国产精品嫩草影院av蜜臀| 欧美一区二区三区视频免费| 国内精品一区二区三区| 蜜臀av国产精品久久久久| 亚洲人久久久| 欧美午夜国产| 欧美在线播放一区| 亚洲第一精品电影| 欧美日本视频在线| 亚洲一本视频| 国产资源精品在线观看| 欧美成人性生活| 这里是久久伊人| 国产日韩精品在线播放| 麻豆av一区二区三区| 日韩一级精品视频在线观看| 国产精品亚洲不卡a| 久久久综合免费视频| 亚洲精品视频在线观看网站| 欧美午夜精品久久久久久浪潮| 欧美一区二区三区在线| 亚洲韩日在线| 国产精品免费网站在线观看| 久久精品国产一区二区三 | 久久露脸国产精品| 日韩亚洲在线| 国产婷婷精品| 欧美激情日韩| 小辣椒精品导航| …久久精品99久久香蕉国产| 欧美视频一区在线观看| 久久久久久999| 亚洲深夜福利网站| 伊人久久综合| 国产精品v欧美精品v日韩| 久久综合精品国产一区二区三区| 在线综合+亚洲+欧美中文字幕| 国内视频一区| 国产精品国产三级国产专区53| 久久婷婷蜜乳一本欲蜜臀| av成人免费| 精品成人在线观看| 国产精品久久久久久久久久久久久久 | 国产免费一区二区三区香蕉精| 你懂的亚洲视频| 亚洲欧美日韩高清| 亚洲精品欧美在线| 国产综合香蕉五月婷在线| 欧美日韩色综合| 老司机精品视频网站| 亚洲综合社区| 亚洲精品视频免费| 今天的高清视频免费播放成人| 欧美色区777第一页| 麻豆成人av| 欧美资源在线观看| 亚洲视频1区| 91久久黄色| 一区二区视频免费在线观看| 欧美午夜视频在线| 欧美精品免费在线观看| 久久夜色精品国产噜噜av| 亚洲欧美中日韩| 99视频一区二区| 亚洲电影免费在线观看| 国产无遮挡一区二区三区毛片日本| 欧美日韩中文| 欧美激情黄色片| 久久久五月天| 久久精品123| 亚洲欧美综合另类中字| 亚洲视频在线一区| 亚洲精品一区二区三| 亚洲高清一区二| 好看的av在线不卡观看| 国产精品一卡| 国产精品卡一卡二卡三| 欧美三级精品| 欧美日韩一本到| 欧美母乳在线| 欧美第一黄色网| 免费日韩精品中文字幕视频在线| 久久久久国产成人精品亚洲午夜| 午夜视频在线观看一区二区三区| 亚洲一区二区高清视频| 一本色道久久加勒比精品| 亚洲精品国产精品国自产观看浪潮 | 国产精品亚洲综合一区在线观看 | 久久在线免费观看| 久久久久国色av免费观看性色| 午夜精品一区二区三区在线视| 亚洲午夜精品一区二区| 一本色道久久88综合日韩精品| 亚洲美女诱惑| 日韩视频二区| 日韩亚洲欧美一区| 一区二区三区回区在观看免费视频| 99v久久综合狠狠综合久久| 夜夜嗨网站十八久久| 亚洲视频在线观看一区| 亚洲天堂av综合网| 亚洲欧美日韩国产中文在线| 亚洲欧美一区二区原创|