国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

開發(fā) 前端
單元測(cè)試覆蓋率的統(tǒng)計(jì)原理實(shí)際上是通過字節(jié)碼插樁實(shí)現(xiàn)的。也就是說,在編譯期間會(huì)向代碼中注入一些特殊的監(jiān)控代碼,以記錄測(cè)試執(zhí)行過程中代碼的執(zhí)行情況,從而推斷代碼的覆蓋情況。

高手回答

我們?cè)谶M(jìn)行單元測(cè)試時(shí),經(jīng)常需要關(guān)注一個(gè)覆蓋率的指標(biāo),許多發(fā)布流程甚至要求達(dá)到特定的百分比。

那么,單元測(cè)試覆蓋率是如何統(tǒng)計(jì)的呢?其底層實(shí)現(xiàn)原理又是怎樣的呢?

單元測(cè)試覆蓋率的統(tǒng)計(jì)原理實(shí)際上是通過字節(jié)碼插樁實(shí)現(xiàn)的。也就是說,在編譯期間會(huì)向代碼中注入一些特殊的監(jiān)控代碼,以記錄測(cè)試執(zhí)行過程中代碼的執(zhí)行情況,從而推斷代碼的覆蓋情況。這些監(jiān)控代碼能在運(yùn)行時(shí)記錄代碼的執(zhí)行情況,也能在編譯時(shí)生成代碼覆蓋率報(bào)告。

常見的單元測(cè)試覆蓋率統(tǒng)計(jì)工具包括JaCoCo、Emma、Cobertura等,這些工具能夠在編譯或運(yùn)行時(shí)對(duì)代碼進(jìn)行插樁,并記錄代碼的執(zhí)行情況,最終生成覆蓋率報(bào)告。

具體見下表:

工具

Jacoco

Emma

Cobertura

原理

使用 ASM 修改字節(jié)碼

修改 jar 文件,class 文件字節(jié)碼文件

基于 jcoverage,基于 asm 框架對(duì) class 文件插樁

覆蓋粒度

行,類,方法,指令,分支

行,類,方法,基本塊,指令,無分支覆蓋

項(xiàng)目,包,類,方法的語句覆蓋/分支覆蓋

插樁

on the fly、offline

on the fly、offline

offline,把統(tǒng)計(jì)代碼插入編譯好的class文件中

生成結(jié)果

在 Tomcat 的 catalina.sh 配置 javaangent 參數(shù),指出需要收集覆蓋率的文件,shutdown 時(shí)才收集,只能使用 kill 命令關(guān)閉 Tomcat,不要使用 kill -9

html、xml、txt,二進(jìn)制格式報(bào)表

html,xml

缺點(diǎn)

需要源代碼

1、需要 debug 版本,并打來 build.xml 中的 debug 編譯項(xiàng);2、需要源代碼,且必須與插樁的代碼完全一致

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

性能


小巧

插入的字節(jié)碼信息更多

執(zhí)行方式

maven,ant,命令行

命令行

maven,ant

Jenkins 集成

生成 html 報(bào)告,直接與 hudson 集成,展示報(bào)告,無趨勢(shì)圖

無法與 hudson 集成

有集成的插件,美觀的報(bào)告,有趨勢(shì)圖

報(bào)告實(shí)時(shí)性

默認(rèn)關(guān)閉,可以動(dòng)態(tài)從 jvm dump 出數(shù)據(jù)

可以不關(guān)閉服務(wù)器

默認(rèn)是在關(guān)閉服務(wù)器時(shí)才寫結(jié)果

維護(hù)狀態(tài)

持續(xù)更新中

停止維護(hù)

停止維護(hù),不支持java1.8的lamda表達(dá)式

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

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

字節(jié)碼插樁技術(shù)通常包括以下幾個(gè)步驟:

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

假設(shè)我們希望對(duì)一個(gè)Java方法進(jìn)行性能監(jiān)控,我們可以在方法的入口和出口處分別插入計(jì)時(shí)器,以統(tǒng)計(jì)方法的執(zhí)行時(shí)間。以下代碼展示了如何實(shí)現(xiàn)這一功能:

public class Monitor {
    public static void start() {
        long startTime = System.nanoTime();
        // 將起始時(shí)間記錄到ThreadLocal中,以便在方法返回時(shí)進(jìn)行計(jì)算
        ThreadLocalHolder.set("startTime", startTime);
    }

    public static void end() {
        long endTime = System.nanoTime();
        // 獲取起始時(shí)間
        long startTime = (long) ThreadLocalHolder.get("startTime");
        // 計(jì)算方法執(zhí)行時(shí)間
        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)控多個(gè)方法的性能,分別在每個(gè)方法中插入Monitor.start()和Monitor.end()將導(dǎo)致代碼重復(fù)、可讀性下降,并存在遺漏的風(fēng)險(xiǎn)。在這種情況下,可以借助字節(jié)碼插樁技術(shù),在編譯期或運(yùn)行期間自動(dòng)向每個(gè)方法的入口和出口處插入Monitor.start()和Monitor.end(),以確保代碼的統(tǒng)一性和可維護(hù)性。

具體實(shí)現(xiàn)可借助字節(jié)碼生成庫ASM或Javassist來實(shí)現(xiàn),此處以ASM為例。以下代碼展示了如何使用ASM對(duì)Example類進(jìn)行字節(jié)碼插樁:

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();
    }
}


責(zé)任編輯:武曉燕 來源: 碼上遇見你
相關(guān)推薦

2022-03-29 11:32:32

單元測(cè)試覆蓋率框架

2021-10-15 13:47:19

覆蓋率檢測(cè) istanbul 總代碼的比例

2019-09-25 09:20:41

谷歌代碼開發(fā)者

2024-09-03 14:10:00

模型測(cè)試

2011-11-01 10:10:48

ScriptCover

2022-05-31 09:01:18

SwiftApp 項(xiàng)目

2023-10-27 08:49:00

JCovOpenJDK

2025-03-11 09:04:26

2022-08-25 06:27:39

vivoJaCoCo代碼覆蓋率

2022-10-21 15:29:32

5G網(wǎng)絡(luò)

2021-12-25 22:30:27

Chrome DevTJavaScript調(diào)試工具

2023-04-06 08:03:43

Spock插件Surefire

2012-04-11 11:21:57

ibmdw

2019-09-30 10:27:52

變異測(cè)試評(píng)估

2024-08-21 08:22:33

2022-04-10 11:52:43

前端單測(cè)程序

2020-08-18 08:10:02

單元測(cè)試Java

2024-11-25 12:20:00

Hystrix微服務(wù)架構(gòu)

2018-02-27 14:50:20

大數(shù)據(jù)公廁城市

2021-10-21 09:40:50

AI人工智能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

免费观看羞羞视频网站| 欧美激情视频给我| 成人天堂av| 中文字幕国产一区| 成年人视频网站免费观看| 精品美女视频在线观看免费软件 | 亚洲国产成人av网| 最新av在线| 欧美日韩一区二区三区四区| 国产精品96久久久久久| 91三级在线| 日韩有码在线观看| 欧美中文字幕一区二区| 日本视频精品一区| 国产精品家庭影院| 日本在线视频www鲁啊鲁| 亚洲性生活视频| 国产精品xxx| 蓝色福利精品导航| 看全色黄大色大片| 亚洲综合视频在线观看| 国产不卡人人| 91美女片黄在线观看游戏| 日本中文字幕一区| 欧美午夜aaaaaa免费视频| 亚洲精品合集| 亚洲视频1区| 久久国产精品-国产精品| 国产在线精品免费| 第三区美女视频在线| 欧美亚洲另类久久综合| 综合欧美国产视频二区| 图片婷婷一区| 国产午夜大地久久| 精品国产网站地址| 久久久精品一品道一区| 精品伊人久久| 成人h动漫在线| 成人黄色片网站| 欧美午夜寂寞影院| 视频一区欧美日韩| 三上悠亚激情av一区二区三区| 国产午夜精品视频一区二区三区| 韩日欧美一区| 亚洲精品少妇久久久久久| 91啪国产在线| 精品少妇一区二区三区视频免付费| 美女国产一区二区| 中文字幕一区二区三区四区久久| 嫩草影院在线观看网站成人| 成人情趣片在线观看免费| 欧美区视频在线观看| bt7086福利一区国产| 国产a久久精品一区二区三区| 免费成人午夜视频| 亚洲免费观看高清| 亚洲一区激情| 亚洲国产精品久久久天堂| 国产亚洲精彩久久| 3p视频在线观看| av网站在线观看不卡| 国产精品v欧美精品v日韩| 911精品国产一区二区在线| 日韩高清不卡av| av在线电影观看| 久久久精品区| 久热国产在线| 日本一区二区不卡| 亚洲一区国产视频| 久久亚洲综合av| 秋霞国产午夜精品免费视频| 手机在线电影一区| 精品一区亚洲| 久久亚洲黄色| 日韩最新av| 日本成人一区二区| 日本免费久久| 色网在线免费观看| heyzo高清在线| 黄色网址在线免费观看| 91社区在线高清| 免费观看在线黄色网| 麻豆传媒在线免费| 青青在线视频| 午夜激情在线播放| 国产成人77亚洲精品www| 91九色综合| 日韩在线观看一区二区三区| 一区二区免费| 狠狠操综合网| 久久久精品久久久久久96| 一区二区亚洲精品| 免费看黄裸体一级大秀欧美| 亚洲激情国产| 国产高清在线精品| 国产日韩影视精品| 欧美性猛交xxxx乱大交蜜桃| 欧美疯狂性受xxxxx喷水图片| 精品国产乱码久久久久久久| 亚洲精品自拍视频| 午夜精品一区二区三区在线播放| 国产精品久久久久久久天堂| 蜜桃狠狠色伊人亚洲综合网站| 日韩亚洲视频在线| 手机看片福利盒子久久| 黄页网站视频在线观看| 亚洲欧美久久234| 亚洲爆乳无码专区| 午夜影院网站| 亚洲综合影视| 欧美视频二区欧美影视| 区一区二视频| 免费看日韩精品| 国产精品视频一二三| 日韩欧美精品免费在线| 国产一级揄自揄精品视频| 成人激情视频免费在线| 中国女人做爰视频| 国产二区视频在线观看| 99re8精品视频在线观看| 国内精品久久久久久久97牛牛| 成人午夜精品在线| 日韩欧美中文第一页| 久久99热精品| 一二三四中文字幕| 日本成人网址| 超碰成人久久| 国产欧美日韩在线看| 亚洲国产精品久久久| 国产99久久久欧美黑人| 国产1区2区3区中文字幕| 啊灬啊灬啊灬啊灬高潮在线看| av成人 com a| 在线精品亚洲| 精品国产1区2区| 97国产精品视频人人做人人爱| 被灌满精子的波多野结衣| 欧美xxxx性xxxxx高清| 四虎精品一区二区免费| 国产一区二区三区四区在线观看| 综合久久久久久久| 日韩欧美天堂| 久久久加勒比| 亚洲精品影视| 亚洲一区二区综合| 最近2019年手机中文字幕| 国产精品国产三级国产专区53| 久热精品在线播放| www.久久久.com| 国产在线精品一区在线观看麻豆| 色老综合老女人久久久| 国产精品激情av在线播放 | 成人国产免费视频| 影音先锋亚洲电影| 国产精品自拍网站| 欧美在线啊v一区| 北条麻妃一区二区三区中文字幕| 午夜精品一区二区三区在线| 国产一区不卡在线观看| 毛片毛片毛片毛片| 成人啊v在线| 国产日韩一区二区三区在线播放| 久久综合色鬼综合色| 精品久久久久久久一区二区蜜臀| 国产精品福利小视频| 丁香啪啪综合成人亚洲| 人人爽人人av| 日本免费一区二区视频| 91精品国产调教在线观看| 国产福利视频一区二区三区| 亚洲观看高清完整版在线观看 | 精品少妇一区| 久久久精品2019中文字幕之3| 欧美日韩午夜剧场| 国内外成人免费激情在线视频| 中文字幕在线观看第三页| 成人精品电影在线| 久久久久久免费精品| 欧美日韩国产精品一卡| 日韩黄色片在线| 伊伊综合在线| 亚洲视频播放| www久久久久| 日韩三级成人av网| 91在线短视频| 少妇高潮露脸国语对白| 精品嫩草影院| 国产成人午夜精品5599| 中文字幕日韩综合av| 亚洲一区二区三区午夜| 女人让男人操自己视频在线观看| 国产美女一区| 在线播放91灌醉迷j高跟美女| 色就是色欧美| 日韩一级特黄| 国产精品美女久久久久aⅴ国产馆| 精品国产成人在线影院| 18视频在线观看娇喘| 成人在线日韩| 中文字幕av不卡|