devops学习Day2-单元测试jacoco

什么是单元测试?

在一个项目中,通常测试的是最小单元,比如说类或者函数

单元测试的目的

  1. 单元测试可以保证当前代码的正确性;
  2. 单元测试可以保证代码修改、重构或改进之后的正确性;

devops中自动化单元测试

自动化单元测试由四部分组成:

  1. 通过版本控制系统来实现配置管理(git)
  2. 由构建工具来管理依赖(maven)
  3. 测试框架方便编写测试用例和批量测试(JUntil)
  4. 通过反馈平台可以很好的查看测试成果(可视化平台Jenkins)

jacoco介绍–java代码覆盖率工具

什么是代码覆盖率?

代码覆盖率是用来衡量测试代码对功能代码的测试情况,通过统计测试代码对功能代码中行、分支、类等模拟场景数量,来量化说明测试的充分度。代码覆盖率=代码覆盖程度。

覆盖率简单来说就是功能代码在测试代码的基础上哪些文件、模块、类、方法、分支执行了。

  1. 行覆盖:当至少一个指令被指定源码行执行时,该源码行被认定为已执行。
  2. 分支覆盖:if或switch作为分支覆盖率,这个指标作为一个方法中的分支总数,并决定已执行和未执行的分支数量。
  3. 方法覆盖:当方法中至少有一个指令被执行,该方法被认定为已执行。包括构造函数和静态初始化方法。
  4. 类覆盖:当类中至少有一个指令被执行,该类被认定为已执行。
    绿色覆盖行:表示全部执行;
    黄色覆盖行:表示部分执行;
    红色覆盖行:表示没有被执行;

代码覆盖率的意义

分析未覆盖的部分代码,反推测试是否设计充分,没有覆盖到的代码是否存在测试设计盲点。

覆盖率误区

    public long test1(int a){
        long b;
        if(a >100) b = 10/a;
        else b = 10/(a-2);
        return b;
    }

当a=101的时候if分支被执行,有被覆盖到;
当a=1的时候else分支被覆盖到;
这样就达到了百分百的覆盖率;
devops学习Day2-单元测试jacoco_第1张图片
但是a = 2的情况就没有被测试到,这就出现了很大的问题。

  1. 不要过于追求高的代码覆盖率;
  2. 高覆盖测试用例不等于测试用例有用;
  3. 没覆盖的分支相当于该分支上的任何错误肯定都测不到;

jacoco

jacoco是以一个开源的java代码覆盖率工具,其使用方法很灵活,可以嵌入到Ant、Maven中;可以作为Eclipse插件,可以使用其javaAgent技术监控java程序等等。

JaCoCo包含了多种尺度的覆盖率计数器,包含指令级覆盖(Instructions,C0coverage),分支(Branches,C1coverage)、圈复杂度(CyclomaticComplexity)、行覆盖(Lines)、方法覆盖(non-abstract
methods)、类覆盖(classes)

jacoco的原理

jacoco使用插桩的方法来记录覆盖率数据,是通过一个probe探针来注入。
**没有分支:**在一行或多行没有分支的代码前,放置探针,该探针是在编译期间被插入到代码前的,若该探针被执行了,那么下面的代码就会被执行;
**存在分支:**如果存在分支的话,就在每一个分支的第一行代码前放置 一个探针,同理该探针被执行了,那么该分支里的代码就会被执行。
插桩模式有两种:

1.on-the-fly模式(不用不插,即用即插)

JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。

2.offline模式(在测试之前,全部插好,在进行测试)

在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩 的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。

3.on-the-fly与offline对比

on-the-fly更方便简单,无需提前插桩,无需考虑classpath设置问题。
存在以下情况不适合使用on-the-fly:

  • 不支持javaagent
  • 无法设置JVM参数
  • 字节码需要被转换为其他虚拟机
  • 动态修改字节码过程和其他agent冲突
  • 无法去自定义用户加载
jacoco是如何在字节码注入的

查看字节码: javap -c 类名.class
将java文件转换为字节码文件,可以在虚拟机上运行,jacoco在字节码上增加相应的探针,判断探针是否执行,执行了探针,也就执行了相对应的代码。

jacoco的使用

官网下载:https://www.jacoco.org/jacoco/
在jacoco文件下找到两个jar包

  • jacocoagent.jar
  • jacococli.jar
    第一步: 准备好你要进行自动换单元测试的项目jar包;
    第二步: 将三个jar放如同一个文件夹内
    第三步: 启动项目保持项目启动,然后通过javaagent导出html可视化查看覆盖率。

jacoco增量覆盖/全量覆盖

什么是增量覆盖
增量覆盖简单理解就是第一次提交的代码在测试的过程中发现了bug,现在的情况就是部分代码测试了,部分代码因为bug还没有测试,在下次程序猿修改bug后第二次提交代码,已经测试过的代码部分就可以不用重新测试了,而是测试修改后的代码。
什么是全量覆盖
全量覆盖可以简单理解为是将整个代码进行扫描。

增量覆盖是在全量覆盖的基础上迭代更新。

你可能感兴趣的:(devops,单元测试,devops,学习)