成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

高手回答

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

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

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

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

具體見下表:

工具

Jacoco

Emma

Cobertura

原理

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

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

基于 jcoverage,基于 asm 框架對 class 文件插樁

覆蓋粒度

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

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

項目,包,類,方法的語句覆蓋/分支覆蓋

插樁

on the fly、offline

on the fly、offline

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

生成結(jié)果

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

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

html,xml

缺點(diǎn)

需要源代碼

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

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

性能


小巧

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

執(zhí)行方式

maven,ant,命令行

命令行

maven,ant

Jenkins 集成

生成 html 報告,直接與 hudson 集成,展示報告,無趨勢圖

無法與 hudson 集成

有集成的插件,美觀的報告,有趨勢圖

報告實時性

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

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

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

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

持續(xù)更新中

停止維護(hù)

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

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

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

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

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

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

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

具體實現(xiàn)可借助字節(jié)碼生成庫ASM或Javassist來實現(xiàn),此處以ASM為例。以下代碼展示了如何使用ASM對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

單元測試覆蓋率框架

2021-10-15 13:47:19

覆蓋率檢測 istanbul 總代碼的比例

2011-11-01 10:10:48

ScriptCover

2019-09-25 09:20:41

谷歌代碼開發(fā)者

2024-09-03 14:10:00

模型測試

2022-05-31 09:01:18

SwiftApp 項目

2023-10-27 08:49:00

JCovOpenJDK

2022-10-21 15:29:32

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

2022-08-25 06:27:39

vivoJaCoCo代碼覆蓋率

2025-03-11 09:04:26

2021-12-25 22:30:27

Chrome DevTJavaScript調(diào)試工具

2012-04-11 11:21:57

ibmdw

2023-04-06 08:03:43

Spock插件Surefire

2019-09-30 10:27:52

變異測試評估

2022-04-10 11:52:43

前端單測程序

2024-08-21 08:22:33

2020-08-18 08:10:02

單元測試Java

2018-02-27 14:50:20

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

2011-04-25 09:49:20

代碼測試

2024-06-14 12:04:33

點(diǎn)贊
收藏

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

主站蜘蛛池模板: 久在线观看 | 欧美一级片在线观看 | 久久国产精99精产国高潮 | 亚洲一区二区三区在线观看免费 | 中文字幕一区二区三区乱码在线 | 亚洲精品一二三区 | 在线视频日韩精品 | 精品国产一区二区三区性色av | 精品久久久久久亚洲精品 | 日韩中文字幕在线观看 | 国产大片黄色 | 国产99免费| 日韩欧美中文 | 一级黄色片在线看 | 国产精品欧美大片 | 国产高清不卡 | 欧美日韩午夜精品 | 有码一区 | 精品一级电影 | 久久国产福利 | 成人一区二区三区在线观看 | 久久在线 | 国产精品久久久久久av公交车 | 特级特黄特色的免费大片 | 精品一区二区三区中文字幕 | 天堂在线91 | 爱爱视频日本 | 欧美在线视频不卡 | 精品国产欧美一区二区三区成人 | 亚洲免费一区二区 | 欧美一区2区三区4区公司 | 特级做a爰片毛片免费看108 | 99re视频在线免费观看 | 成人高清在线视频 | 天天操精品视频 | 欧美区精品| 久久久久国产精品 | 在线看片福利 | 中文字幕视频网 | 午夜免费福利片 | 久草电影网 |