最近被领导布置了个任务:搞后端代码覆盖率,开始了jacoco学习之旅。最终目标是改造jacoco,做一个增量代码覆盖率工具/插件。
jacoco有2个功能:单元代码覆盖率,功能代码覆盖率。
2020.04.13
2020.02.26的问题在
https://github.com/Bachmann1234/diff_cover/issues/114
和http://www.python88.cn/art/42669/
解决了
看下你的xml的class路径
2020.02.26
在使用了ast方法获取增量方法之外,发现生成的报告总是0,
百思不得其解,浪费了很多天去查找,超过一个星期,傻子似的反复跑ast和asm diff覆盖率(我也不知道我这样反复要干嘛,浪费很多时间)
结果发现相应目录中没有jacoco.exec文件,反复对比,是pom文件中maven-surefire-plugin配置导致的,
当时加上这一句好像是因为执行单元测试的时打印到控制台的日志太长,报错,导致case覆盖率失败,所以加上去了,
现在先把它去掉再说吧
if (pomStr.indexOf("<plugins>") > -1) {
pomStr = pomStr.replace("<plugins>", "<plugins>\n" +
"<plugin>\n" +
" <groupId>org.apache.maven.plugins</groupId>\n" +
" <artifactId>maven-surefire-plugin</artifactId>\n" +
" <version>2.22.1</version>\n" +
" <configuration>\n" +
" <forkCount>3</forkCount>\n" +
" <reuseForks>true</reuseForks>\n" +
" <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>\n" +
" </configuration>\n" +
"</plugin>");
} else {
pomStr = pomStr.replace("</project>", "<build><plugins>\n" +
"<plugin>\n" +
" <groupId>org.apache.maven.plugins</groupId>\n" +
" <artifactId>maven-surefire-plugin</artifactId>\n" +
" <version>2.22.1</version>\n" +
" <configuration>\n" +
" <forkCount>3</forkCount>\n" +
" <reuseForks>true</reuseForks>\n" +
" <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>\n" +
" </configuration>\n" +
" </plugin>\n" +
" </plugins>\n" +
"</build>\n" +
"</project>");
}
2019.10.14
今天启动jacocoagent.jar的时候一直失败:
nohup java -javaagent:/root/qa_charlyne/code/org.jacoco.agent-0.8.5-runtime.jar=includes=*,output=file,destfile=/root/qa_charlyne/jacoco.exec -jar diff-code-coverage.jar >difflog.txt 2>&1 &
报错:
Failed to find Premain-Class manifest attribute in /root/qa_charlyne/org.jacoco.agent-0.8.5.jar
Error occurred during initialization of VM
agent library failed to init: instrument
原来jacoco0.8.4 之后runtime.jar版本有Premain-Class,普通.jar是没有的
原因是:
https://stackoverflow.com/questions/53644625/code-coverage-for-integration-tests-using-jacoco
下载地址:https://search.maven.org/search?q=g:org.jacoco
另外如果遇到如下报错,多半是因为文件的访问权限问题,修改下jacocoagent.jar权限即可
Error opening zip file or JAR manifest missing : /root/Jacoco/jacocoagent.jar
Error occurred during initialization of VM
agent library failed to init: instrument
2019.09.01
今天决定使用jacoco搜集运行时候的覆盖率,然后启动javaagent一直启动不来
在下面一篇文章中找到了原因,javaagent需要在最前面 否则不生效
java -javaagent:/root/qa_charlyne/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=9006,address=* -jar XXX.jar >difflog.txt 2>&1 &
https://blog.csdn.net/jacksonchina2008/article/details/72510228
2019.08.27
今天总算写完了addModule类的“终极版本”,感觉写了有1个月,很累,有些成就感,把这种获得写代码带来的成就感的moment*10000,我应该就能够出师了。加油!
2019.08.02
今天遇到一个问题,saas工程,生成的jacocomodule中包含原工程的子模块,但是报错子工程模块denpendencies.dependency.XXX missing version,查看根目录的pom中没有dependencyManagement,子模块的版本号在子模块的pom里面,所以生成jacocomodule的时候,报错。
学习一下:Maven实战(六)--- dependencies与dependencyManagement的区别
https://blog.csdn.net/liutengteng130/article/details/46991829
2019.07.30
学习到数据库整合mybatis的两种方式:注解方式,配置文件方式(xml)
Spring Boot 揭秘与实战(二) 数据存储篇 - MyBatis整合
https://juejin.im/post/5859bef2b123db0065924f53
----------------------------------------------------------------------------------------------------
从昨天开始,这周开始把jacoco生成的报告落库,网络搜索很多,忐忑写(也不知道代码对不对)mapper,entity,xml啥的,结果启动mvn spring-boot:run报错,说找不到bean,报错org.springframework.beans.factory.NoSuchBeanDefinitionException
Field gitDiffService in XXX.GitDiffController required a bean named 'GitDiffDao' that could not be found.
明明写了mapper,但是找不到,问开发终于解决了,原来在spring-boot的启动类里面少了一个注解
@MapperScan("com.xiaoju.basetech.dao")
有user.property 才可以命令行输入,
形式为:mvn jar:jar -Djar.useDefaultManifestFile=true或者mvn package -Djar.useDefaultManifestFile=true
其余不带有这种的都只能在pom.xml文件中配置插件的参数去实现。
https://www.cnblogs.com/EasonJim/p/6865150.html
2019.07.08
从上周五开始遇到一个问题,
改造后的jacoco
deploy,发布到远程仓库XXX/libs-snapshot
然后在jenkins上执行任务,拉取dependency是从XXX/plugins-snapshot拉取
导致拉取不到jacoco,
没办法,想办法修改远程仓库,发布到XXX/plugins-snapshot才行
解决:把setting.xml里面的配置都改成plugins-snapshot都不行
后来找到方案,在项目的pom文件中添加<distributionManagement>
<distributionManagement>
<repository>
<id>central</id>
<name>plugins-release</name>
<url>
XXX/plugins-release
</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>plugins-snapshot</name>
<url>
XXX/plugins-snapshot
</url>
</snapshotRepository>
</distributionManagement>
但是执行mvn deploy的时候报错,
Failed to deploy artifacts from/to snapshots XX Failed to transfer file Return code is: 405, ReasonPhrase:Method Not Allowed.
https://www.cnblogs.com/sikewang/p/4602330.html
网上都说报405肯定是url或者id配置不对,(例如pom中配置的id和setting.xml中的id需要一致),确认id没有问题,就开始找url的问题,我发现换成其他url deploy没有问题 ,咨询公司效能工具组的同学,才知道果然是url不对,换了url(plugins-snapshot-->plugins-snapshot-local)之后可以了。
2019.07.05
原来:其中带有User property的表示可以在命令行上输入的
其余不带有这种的都只能在pom.xml文件中配置插件的参数去实现。
https://www.cnblogs.com/EasonJim/p/6865150.html
常见问题:
https://ningyu1.github.io/site/post/77-jenkins-sonarqube-jacoco-junit/
2019.07.01
最近遇到一个问题:
Sorry if this comes a late answer.
I assume that your root pom.xml is an aggregater, with <modules>
consisting of module1
, module2
, and report-aggregate
. This is the cause of your trouble: as your root pom.xml is an aggregator, it runs JaCoCo BEFORE your submodules do, so your final report is empty. You should:
- Move the configuration of goal
report-aggregate
of thejacoco-maven-plugin
from the root POM to thereport-aggregate
POM. This should do the trick, because yourreport-aggregate
POM uses<dependencies>
, not<modules>
. - Keep the configuration of goal
prepare-agent
of thejacoco-maven-plugin
in the root POM.
2019.06.19
又被2019.06.07的 https://blog.csdn.net/lvyuan1234/article/details/82836052给坑了,里面有个include,要去掉啊,include是要扫码哪些指定类,他的include是根据他的项目生成的,不是你的项目啊,要去掉include(看官网给的就没有)
遇到一个坑:idea的终端控制台
//例如this.name="aabbccddeeff"
System.out.println(this.name);
String a=this.name;
System.out.println(a);
结果控制台打印出来:
this.name:aabbccddeeff
a:aabbccdde
搞半天不知道为什么,debug完全没有问题a=this.name
结果应该是idea的控制台的原因。在mac自带的控制台运行java文件,控制台输出就没有问题
-------
Java反射如何有效的修改final属性值详解
https://www.jb51.net/article/122257.htm
2019.06.12
今天看到一个diff-cover工具
https://www.jianshu.com/p/a767400986d7?utm_campaign=ma
结果报错No lines with coverage information in this diff,看了链接https://www.jianshu.com/p/bf96db276bc1和https://diff-cover.readthedocs.io/en/latest/ 没有解决,作罢
2019.06.08:今天啥也没干成
今天不知道干嘛,不会啊不会啊,jgit获取基线和分支的差异代码,切割成方法维度,还有什么修改asm类探针的方法,什么鬼啊 不会不会
今天在npm上找到一个可以将报告jacoco.xml解析成json的文件,运行了下可以用,也不知道用来干嘛,先放着吧
https://www.npmjs.com/package/jacoco-parse
例如 jacoco.parseFile( "/Users/didi/nouse/jacoco.xml", function( err, result ) {console.log(result)} );
2019.06.07:idea上使用jacoco统计单元测试覆盖率
https://blog.csdn.net/lvyuan1234/article/details/82836052
遇到问题:配置好jacoco插件之后,终端命令mvn install,有一个module构建失败,报错:
Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.10:test
在pom.xml文件找半天也没看到叫maven-surefire-plugin的插件,开始网上搜索
参考:https://stackoverflow.com/questions/13170860/failed-to-execute-goal-org-apache-maven-pluginsmaven-surefire-plugin2-10test,结合我的情况,可能是因为我的单元测试失败了,所以在pom.xml中添加surefire配置,忽视单元测试失败。To solve this I added a configuration to surefire so that it ignores a failing test.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
根据命令行提示重新运行命令:
mvn install ,依旧报错误,类似:
Failed to execute goal org.jacoco:jacoco-maven-plugin:0.8.1:check (default-check)
on project j8fu: The parameters 'rules' for goal org.jacoco:jacoco-maven-plugin:0.8.1:check
are missing or invalid -> [Help 1]
继续网上搜索,最后找到了解决方案,参考:https://github.com/jacoco/jacoco/issues/736
把pom.xml中jacoco的配置的check去掉,重新mvn install 就成功了,生成了覆盖率报告。
<!--注释
<execution>
<id>check</id>
<goals>
<goal>check</goal>
</goals>
</execution>
-->
总结:因为单元测试失败,所以报错。
其他学习链接
- 服务端代码覆盖率统计平台实现 http://www.runtester.com/detail/blog/17
- 增量代码覆盖率工具 https://tech.youzan.com/yzicov/