JaCoCo基础

作者: 小圆圈Belen | 来源:发表于2020-10-29 18:26 被阅读0次

    作用:

    1.通过UI操作或者API操作就可以获取覆盖率;
    2.了解到测试用例之间的冗余度;
    3.分析测试用例遗漏的部分。

    简介:

    1.JaCoCo是一个开源的覆盖率工具(官网地址:http://www.eclemma.org/JaCoCo/),它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant、Maven中。

    2.JaCoCo包含了很多维度的覆盖率计数器


    (1)指令覆盖Instructions:
    JaCoCo计算的最小单位就是字节码指令。指令覆盖率表明了在所有的指令中,哪些被指令过以及哪些没有被执行。这项指数完全独立于源码格式并且在任何情况下有效,不需要类文件的调试信息。
    (2)分支覆盖Branches:
    JaCoCo对所有的if和switch指令计算了分支覆盖率。这项指标会统计所有的分支数量,并同时指出哪些分支被执行,哪些分支没有被执行。这项指标也在任何情况都有效。异常处理不考虑在分支范围内。
    在有调试信息的情况下,代码分支的左边会有一个带颜色的钻石,
    绿色全部分支被执行
    红色全部分支未执行
    黄色钻石部分分支被执行。
    (3)圈复杂度Cyclomatic Complexity(Cxty):
    JaCoCo会计算每个非抽象方法的圈复杂度,并且也会计算类,包,组的复杂度。根据McCabe1996的定义,圈复杂度可以理解为覆盖所有的可能情况最少使用的测试用例数。这项参数也在任何情况下有效。
    (4)行覆盖Lines:
    该项指数在有调试信息的情况下计算。因为每一行代码可能会产生若干条字节码指令
    红色背景表示该行指令未被执行
    黄色背景表示该行部分指令未被执行
    绿色背景则表示该行指令全部执行。
    (5)方法覆盖Medhods:
    每一个非抽象方法都至少有一条指令。若一个方法至少被执行了一条指令,就认为它被执行过。因为jacoco直接对字节码进行操作,所以有些方法没有在源码显示(比如某些构造方法和由编译器自动生成的方法)也会被计入在内。
    (6)类覆盖Classes:
    每个类中只要有一个方法被执行,这个类就被认定为被执行。同medhods一样,有些没有在源码声明的方法被执行,也认定该类被执行。

    3.插桩方式
    • 原理:注入
    • 源代码(Source Code)注入和字节码(Byte Code)注入两大类
    • 字节码注入又可以分为两大模式:On-The-Fly 注入模式和 Offline 注入模式。
    • 实现:ASM 是一个 Java 字节码操纵框架,能被用来动态生成类或者增强既有类的功能,可以直接产生 class 文件,也可以在类被加载入 JVM 之前动态改变类行为。


      官网图片

    (1)On-the-fly插桩
    JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。
    (2)Offline模式
    在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩 的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。

    4.相关jar包

    (1)jacocoagent:运行时启动tcp服务监控代码覆盖,dump出覆盖率数据。启动应用时主要用来插桩的jar包
    (2)jacocoant:jacoco的任务是ant驱动的,所以这个包用来执行jacoco的任务,向tcp服务发送请求。
    (3)jacococli:导出覆盖率记录的exec文件,生成覆盖率报告。

    5.启动方式
    1. 文件方式:output=file
      • 需要mvn打jar包,或者tomcat打war包
      • 在每次服务结束时统一收集覆盖率dump
      • java -javaagent:/tmp/jacoco/lib/jacocoagent.jar=includes=*,output=file,append=true,destfile=/tmp/jacoco/service/demo/jacoco.exec -jar demo-0.0.1-SNAPSHOT.jar
    2. tcp服务: output=tcpserver
      • 开放一个tcp端口,可以在过程中收集覆盖率dump
      • java -javaagent:/tmp/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=localhost,append=true -jar demo-0.0.1-SNAPSHOT.jar
      • 需要通过jacococli.jar 来获取dump
      • java -jar jacococli.jar dump --address localhost --port 6300 --destfile ./jacoco-demo.exec

    相关文章

      网友评论

        本文标题:JaCoCo基础

        本文链接:https://www.haomeiwen.com/subject/iipamktx.html