我们团队一直在做自动化,自动化只是做了,成果可以替代部分手工回归,但是自动化究竟起了多少作用,覆盖率有多少,哈斯是没有具体的数据去统计,于是就在查找一款工具可以用来统计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