GithubHelp home page GithubHelp logo

super-jacoco's Introduction

简介

  • Super-Jacoco是基于Jacoco、git二次开发打造的一站式JAVA代码全量/diff覆盖率收集平台,能够低成本、无侵入的收集代码覆盖率数据。Super-Jacoco除了支持JVM运行时间段的覆盖率收集外;还能够和环境无缝对接,收集服务端自定义时间段代码全量/增量覆盖率。并提供可视化的html覆盖率报表,协助覆盖情况精准分析,支撑精准测试落地。

产品特性:

  • 通用:既支持单元测试覆盖率收集,也支持手工测试覆盖率收集;既支持全量覆盖率收集,也支持diff覆盖率收集;
  • 无侵入:采用on-the-fly模式,无需对开发代码做任何改造,即可收集覆盖率数据;
  • 高可用:分布式架构,任务机可无限扩展,避免任务机down机或者任务过多时出现性能瓶颈;
  • 可视化:提供html格式的覆盖率报告,可读性高。

使用方法

1、数据库安装和初始化

安装mysql数据库,创建数据库后执行sql/db.sql文件中的建表SQL

2、编译打包

 2.1 安装JDK1.8、mavan3
 2.2 clone代码,更改application.properties文件中的数据库和gitlab配置:
	 spring.datasource.url=jdbc:mysql://IP:端口/数据库名?useUnicode=true&characterEncoding=utf8
	 spring.datasource.username=
	 pring.datasource.password=
	 gitlab.username=
	 gitlab.password=
 2.3 执行mvn package -Dmaven.test.skip=true生成super-jacoco.jar

3、部署

 3.1 执行“nohup java -jar super-jacoco.jar &”启动代码覆盖率服务,默认端口为8899

4、覆盖率收集接口

4.1 单测覆盖率接口
1、启动覆盖率收集
 URL:/cov/triggerUnitCover
 调用方法:POST
 参数(body方式传入):{"uuid":"uuid","type":1,"gitUrl":"git@git","subModule":"","baseVersion":"master","nowVersion":"feature","envType":"-Ptest"}
 返回:{"code":200,"data":true,"msg":"msg"}
 备注:
2、获取覆盖率结果
 URL:/cov/getUnitCoverResult
 调用方法:GET
 参数:uuid(String)
 返回:{"code":200,"data":{"coverStatus":1,"errMsg":"msg","lineCoverage":100.0,"branchCoverage":100.0,"logFile":"file content","reportUrl":"http://"},"msg":"msg"}
 备注:
4.2 环境覆盖率接口
1、启动覆盖率收集
 URL:/cov/triggerEnvCov
 调用方法:POST
 参数(body方式传入):{"uuid":"uuid","type":1,"gitUrl":"git@git","subModule":"","baseVersion":"master","nowVersion":"feature","address":"127.0.0.1","port":"8088"}
 返回:{"code":200,"data":true,"msg":"msg"}
 备注:IP和port为模块部署服务器的IP和端口,在dump jacoco.exec时使用,需要提前把org.jacoco.agent-0.8.5-runtime.jar包拷贝到服务器:/home/xxx/目录,服务启动时需要添加启动参数: -javaagent:/home/xxx/org.jacoco.agent-0.8.5-runtime.jar=includes=*,output=tcpserver,address=*,port=18513
2、获取覆盖率结果
 URL:/cov/getEnvCoverResult
 调用方法:GET
 参数:uuid(String)
 返回:{"code":200,"data":{"coverStatus":1,"errMsg":"msg","lineCoverage":100.0,"branchCoverage":100.0,"logFile":"file content","reportUrl":"http://"},"msg":"msg"}
 备注:

联系我们

微信群:super-jacoco技术支持群(添加管理员二维码邀请进群)

image

super-jacoco's People

Contributors

xiaoyisss avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

super-jacoco's Issues

在获取报告时,为何要向 /cov/triggerUnitCover 进行传参?

我已经完成了将 Jacoco 在服务器上的集成,走通了流程,并获取了一份完整的测试报告。

但我在使用 super-jacoco 时碰到了一些问题,我详细阅读了许多遍文档,但依然没能找到解决办法。

现将问题列在下方,希望能得到帮助,谢谢!

1、使用super-jacoco时,是否仍然需要在项目的 JVM 中添加 -javaagent 的启动参数?

2、Readme.md 文档中写道 「需要在 application.properties 中更改 spring.datasource.url、spring.datasource.username、spring.datasource.password」这三个字段。请问这三个字段是否就是「后台服务所连接的数据库」?

3、如果成功使用 super-jacoco 执行了测试,在获取报告阶段,向类似「 /cov/triggerUnitCover 」这个 URL 传参的目的是什么?
因为我在原始的 Jacoco 使用文档中并未看到向接口传参的操作。

关于克隆代码时出现切换分支失败问题

在使用clone代码,源码使用setGitDir方法,这会导致克隆目标仓库代码时,会克隆到工程本地,且指定的地址,没有目标工程代码,改为setDirectory方法,可以克隆成功

image

[WARNING] Corrupted STDOUT by directly writing to native stream in forked JVM 1.

执行单元测试失败,err_msg为“项目没有单元测试case”,有以下报错:

Error occurred in starting fork, check output in log
Process Exit Code: 134
at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:671)
at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:533)
at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:278)
at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:244)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1149)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:978)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:854)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:972)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:293)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:196)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)

启动被测服务失败

$ nohup java -javaagent:/usr/local/org.jacoco.agent-0.8.5-runtime.jar includes=,output=tcpserver,port=18513,address=,append=true -jar /Users/demo3-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &

zsh: no matches found: includes=,output=tcpserver,port=18513,address=,append=true

文件提交后,覆盖率数据如何处理

我在实践jacoco做增量覆盖率的时候,发现当代码文件提交后吗,拿提交前的覆盖率数据和提交后的覆盖率数据进行合并后生成报告,覆盖率数据只有提交后的内容,提交前的数据都丢失了,请问这个如何规避呢

执行测试后,代码仍然显示未覆盖

1)修改数据库和git信息,启动 super-jacoco,默认端口8899

2)启动测试程序demo,demo的端口是8080,tcpserver的端口是18513
java -javaagent:/Users/org.jacoco.agent-0.8.5-runtime.jar=includes=*,output=tcpserver,address=127.0.0.1,port=18513,append=false -jar /Users/demo-0.0.1-SNAPSHOT.jar

3)执行测试 ,postman调用demo的增量方法: http://127.0.0.1:8080/brand/listAll2

4)收集覆盖率文件
post,type=2为增量,port传的是第2步的tcpserver的端口
http://127.0.0.1:8899/cov/triggerEnvCov
{
"uuid": "0001",
"type": 2,
"gitUrl": "http://****/demo.git",
"subModule": "",
"baseVersion": "release-0001",
"nowVersion": "release-0002",
"address": "127.0.0.1",
"port": "18513"
}

5)获取覆盖率结果
get
http://127.0.0.1:8899/cov/triggerEnvCov?uuid=0001

非常奇怪的是,增量的代码依然显示红色,明明已经postman执行了。
请教各位大佬,看看哪里出问题了。非常感谢!!

windows环境下,当super-jacoco部署在非C盘时, 不能生成报告的问题.

windows环境下,当super-jacoco部署(使用IDE直接运行)在非C盘分区时, 程序仅执行如下命令:

executeCmd : bash -c cd C:\Users\admin/app/super_jacoco/clonecode/10/master&&mvn clean -Dmaven.test.skip=false...

由于不能切换到C盘, cd命令无效, mvn命令会作用于super-jacoco上, 从而不能生成被测项目的报告.

bug: 参数列表过长

增量的时候, 代码变动太多, shell命令就会很长, 操作系统会报参数列表过长

请问支持收集部署在云上的服务么?

现在大多数服务都是部署在云上的,由于k8s自动分配容器的ip地址且地址是变化的,请问有解决方案做到dump这个容器上服务的代码执行信息文件么?谢谢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.