相关文章推荐
温文尔雅的豆芽  ·  Java基础 - 知乎·  1 年前    · 
深情的小摩托  ·  Glide ...·  1 年前    · 

我们团队一直在做自动化,自动化只是做了,成果可以替代部分手工回归,但是自动化究竟起了多少作用,覆盖率有多少,哈斯是没有具体的数据去统计,于是就在查找一款工具可以用来统计fugailv ,因为项目后台开发语言是java,选择了大众都在用的工具jacoco工具。

安装下载起服务:

jacoco工具下载地址: http://eclemma.org/jacoco/

jacoco官方文档地址: 专业的人看专业的文档

jacoco工具下载之后,我们将jacocoagent.jar包放在服务器端。

jacoco服务器端命令:

JAVA_OPTS="$JAVA_OPTS -javaagent:/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=9999,address=ip"

JAVA_OPTS="$JAVA_OPTS -javaagent:[yourpath]=[options1]=[value1],[options2]=[value2]"

将本行代码放在catalina.sh文件的

#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"配置下面。

一般catalina.sh文件是在tomcat的bin目录下

字段解释:

选项 描述 默认
destfile 执行数据的输出文件的路径。 jacoco.exec
append 如果设置为true并且执行数据文件已经存在,则将覆盖数据附加到现有文件。如果设置为 false,则将替换现有的执行数据文件。 true
includes 执行分析中应包含的类名列表。列表条目以冒号(:)分隔,可以使用通配符(*和?)。除了性能优化或技术角落案例,通常不需要此选项。 * (所有类)
excludes 应从执行分析中排除的类名称列表。列表条目以冒号(:)分隔,可以使用通配符(*和?)。除了性能优化或技术角落案例,通常不需要此选项。 空(不排除类)
exclclassloader 应从执行分析中排除的类加载器名称的列表。列表条目以冒号(:)分隔,可以使用通配符(*和 ?)。如果特殊框架与JaCoCo代码工具发生冲突,特别是无法访问Java运行时类的类加载器,则可能需要此选项。 sun.reflect.DelegatingClassLoader
inclbootstrapclasses 指定是否还应该检测引导类加载器的类。谨慎使用此功能,需要大量包括/不包括调整。 false
inclnolocationclasses 指定是否还应该检测没有源位置的类。通常这样的类是在运行时产生的,例如通过模拟框架,因此在默认情况下被排除。 false
sessionid 与执行数据一起写入的会话标识符。没有这个参数,代理就会创建一个随机的标识符。 自动生成
dumponexit 如果设置为true覆盖数据,将在VM关闭时写入。如果file指定了转储,或者输出为tcpserver/ tcpclient 并且在虚拟机终止时连接处于打开状态,则只能写入转储。 true
output 用于写入覆盖率数据的输出方法。有效的选项是:
file: 在虚拟机终止执行数据写入destfile属性中指定的文件。
tcpserver: 代理侦听由address和port属性指定的TCP端口上的传入连接。执行数据被写入到这个TCP连接。
tcpclient: 启动时,代理将连接到由address和port属性指定的TCP端口。执行数据被写入到这个TCP连接。
none: 不要产生任何输出。
请参阅下面的安全考虑。
file
address 当输出方法为tcpserver或连接到 输出方法时要绑定的IP地址或主机名 tcpclient。在tcpserver模式中,值“ *”使代理接受任何本地地址上的连接。 回环接口
port 当输出方法是绑定的端口,tcpserver或者当输出方法是连接的端口tcpclient。在 tcpserver模式下,端口必须可用,这意味着如果多个JaCoCo代理应该在同一台机器上运行,则必须指定不同的端口。 6300
classdumpdir agent所调用到的所有class文件的目录。这可以用于调试目的,或者在动态创建类的情况下,例如当使用脚本引擎时。 没有转储
jmx 如果设置为true代理通过名称下的JMX 公开 功能org.jacoco:type=Runtime。请参阅下面的安全考虑。 false

部署好了之后,可以通过netstat -tulnp|grep port 查看端口是否正常启动,一般是将tomcat重启,jacocoagent.jar跟着正常起来。

生成exec文件

生成文件网上好多是根据ant.xml配置,等其他方式生成,我是利用jacococli.jar在本地直接生成exec文件

本地cmd窗口直接输入如下脚本:

java -jar jacococli.jar dump --address ip --port 9999 --destfile [path]\[execName].exec

找到jacoco.jar包本地的地址,address地址是部署服务器地址,端口是第一步配置地址,destfile是生成exec的文件保存地址

将服务器端的打桩的文件从服务器下载至本地,将git仓源码地址download到本地,进行文件的识别

本地cmd窗口输入如下脚本:

java -jar jacococli.jar report 【exec文件】 --classfiles 【class文件地址】 --sourcefiles 【源码地址】  --html 【报告生成位置】 --xml report.xml

这样就可以直接将打桩的文件拷贝至本地,在本地完成覆盖率

结果如下:

jacoco工具还是很强大java覆盖率工具,在部署时,可以对特殊的地方进行打桩。

过程遇到的坑

在部署时,也遇到了很多坑,比如我们框架比较老,登录接口对布尔值不能识别,导致报如下错误信息,也想了很多办法解决

想得很多办法都被否定了,比如保持会话session,开发修改源码等,最后回归的还是工具本身的功能,将登录的class文件去除打桩,这样就很容易跳过了登录的问题。

第二个问题是在查找代码源文件时,总是报找不到源码的错误:

可能是测试,对功能不太熟悉,总是试了很多次,最后才知道是怎么回事,原来source file路径需要和--sourcefiles后面的路径拼成绝对路径,这样才是一个完整本地路径。

折腾了一番,最终效果出来了。我们的测试也慢慢偏向于灰度测试,对自动化覆盖率也有一个数据标准,更好的指导工作自动化方向,提高覆盖率,减少质量问题

可以下载对应系统下的压缩包:zip(window), tar.gz(linux)。 自行解压后,在解压后的文件夹中可以找到这两个jar. 3. Ant:配置Ant环境和配置 JDK/Maven 一样,下载对应的包,配置环境变量即可。 下载链接:https://ant.a...
前言Android 开发统计 代码覆盖率 ,在之前的老版本中,需要借助第三方工具,在现在的新版本中,只要使用 JaCoCo 插件,就可以完成简单覆盖率测试。与 Espresso 框架结合,进行覆盖率测试Android SDK 现在已经内置了对 Emma Test Coverage框架的支持,可以在官方文档中进行查阅。 具体由 JaCoCo 工具进行覆盖率相关内容。
写在之前:百度上抄来抄去那些文章都是屎、害人不浅啊。 声明::cobertura或者 jacoco 只支持单模块的测试。都是会编译当前module下的类。即使全部配置文件配置正确,如果当前moudle下没有类。也不会生成相应的index.html文件。 搞了三天。把操蛋的 问题 记录一下: a:不生成index.html: jacoco 配置的excut ion s配置错误或者maven-surefire-...
准备项目jar包 自己找一个打包好的jar服务,或者从github上down一个Springboot demo项目,自行打包成jar包。 说明:下载后将项目打包成jar。(此处通过idea打开项目,下载依赖,然后执行maven 的install即可)。 2. 下载 jacoco 相关jar包,地址:https://www. jacoco .org/ jacoco /index.html ......
在使用 clang++ 编译器时,可以使用 LLVM 自带的工具 llvm-cov 来实现 代码覆盖率 的统计。以下是具体步骤: 1. 编译代码时需要添加覆盖率统计选项 `-fprofile-instr- generat e -fcoverage-mapping`,例如: clang++ -fprofile-instr- generat e -fcoverage-mapping main.cpp -o main 2. 运行程序,执行测试用例等,生成覆盖率数据文件 `default.profraw`,例如: ./main 3. 使用 llvm-cov 工具来生成 代码覆盖率 报告,例如: llvm-cov show ./main -instr-profile=default.profraw 该命令会输出 代码覆盖率 报告,其中包括每个函数、每行代码的覆盖情况,以及 代码覆盖率 的统计信息。 注意:在使用 llvm-cov 生成 代码覆盖率 报告时,需要提供编译时指定的覆盖率数据文件路径。如果没有指定路径,则默认使用 `default.profraw` 文件。另外,如果代码中存在多个 源文件 ,需要对每个 源文件 分别生成覆盖率数据文件和 代码覆盖率 报告。
解决django.core.exceptions.FieldError: Cannot resolve keyword ‘Classes‘ into field. Choices are:XX问题 11417