SpringBoot结合Jacoco计算api覆盖率

这里我主要准备三点内容:

  • SpringBoot发布jar包
  • 命令行运行SpingBoot.jar
  • 通过ant dump Api代码覆盖率

开发环境

Win10 x64

jdk 1.8.0

ant 1.10.8  https://ant.apache.org/bindownload.cgi

jacoco 0.8.5   https://www.jacoco.org/jacoco/index.html

IDEAL Ultimate

SpringBoot发布jar包

建立SpringBoot工程

File->New->Project->(Keep default)Next

设置name和group

然后这里记得加上springboot web依赖

创建完成的目录结构如下:

其中SpringbootApplication是web的启动文件。

application.properies是配置文件。

    这里默认端口是8080,如果遇到端口占用问题,在这里添加配置  server.port=8081

在它的同级目录建立第一个测试类

HelloController.java

其中RestController标注了他是一个controller,  RequestMapping是他的访问路径。

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

写完之后就可以运行起来看效果了。运行SpringbootApplication

我们可以看到他自己带的tomcat启动了8081端口

o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8081 (http)

访问index,可以看到效果

继续打包

 

注:

如果是idea 是community版,记得在pom添加依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
</dependency>

利用idal自带Maven打包

如果找不到maven 窗口

View->Tool Windows->Maven

打开maven窗口

先选择clean,点绿色三角运行,清除以前编译记录

再点package,运行打包。

打包成功后,就可以在工程目录的target路径下找到刚刚生成的包

[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ springboot ---
[INFO] Building jar: D:\ideaProjects\sbt\target\springboot-0.0.1-SNAPSHOT.jar

恭喜!我们的第一个springboot jar包成功完成!

注:

如果可以,还是建议安装maven环境。

刚才用maven窗口运行等同于命令:

mvn -U clean

mvn package

 

命令行运行SpingBoot.jar

由于SpringBoot内嵌tomcat,只需要运行jar包就可以启动一个web服务器。

如果只是启动jar包,简单运行即可。这样运行起来和刚才运行项目效果一样。

java -jar springboot-0.0.1-SNAPSHOT.jar

停掉刚才的服务。然后加入javaagent,并指定任意空闲端口(如 9100 )与jacoco通信。

java -javaagent:D:\\jacocoagent.jar=includes=*,output=tcpserver,port=9100,address=127.0.0.1 -jar springboot-0.0.1-SNAPSHOT.jar

注:

javaagent: 简单的说它是一个独立于应用程序的代理,用于监控JVM上的程序。

 

通过ant dump api代码覆盖率

jacoco利用了探针的原理。在每行执行过的代码上都做了标记。

jacoco计算代码覆盖率有两种模式 on-the-fly 和offline。计算api覆盖率一般采用on-the-fly, 它的好处是实时更新。

 

step1.首先下载并安装ant环境,并把bin目录加到环境变量里。

step2, 下载jacoco压缩包,直接解压jar包到路径下即可。

step3. 建立build.xml。 照抄如下xml,并在同目录运行ant命令. 所需要的配置中文说的很清楚。

执行覆盖率:   ant dump

    -执行后生成jacoco.exec 是jacoco分析后的结果。

根据jacoco.exec生成report:  ant report

    -执行完后在路径下生成可看的html. 

<?xml version="1.0" ?>
<project name="Lengyu" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
	<!--Jacoco的安装路径-->
	<property name="jacocoantPath" value="D:/Program Files/jacoco-0.8.5/lib/jacocoant.jar"/>
	<!--最终生成.exec文件的路径,Jacoco就是根据这个文件生成最终的报告的-->
	<property name="jacocoexecPath" value="D:/Program Files/jacoco-0.8.5/regression/jacoco.exec"/>
	<!--生成覆盖率报告的路径-->
	<property name="reportfolderPath" value="D:/Program Files/jacoco-0.8.5/report/"/>
	<!--远程tomcat服务的ip地址-->
	<property name="server_ip" value="127.0.0.1"/>
	<!--前面配置的远程tomcat服务打开的端口,要跟上面配置的一样-->
	<property name="server_port" value="9100"/>
	<!--源代码路径-->
	<property name="checkOrderSrcpath" value="D:/ideaProjects/sbt/src/main/java/" />
	<!--.class文件路径-->
	<property name="checkOrderClasspath" value="D:/sbt/target/classes/com/spt/springboot/" />

	<!--让ant知道去哪儿找Jacoco-->
	<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
		<classpath path="${jacocoantPath}" />
	</taskdef>

	<!--dump任务:
根据前面配置的ip地址,和端口号,
访问目标tomcat服务,并生成.exec文件。-->
	<target name="dump">
		<jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
	</target>

	<!--jacoco任务:
根据前面配置的源代码路径和.class文件路径,
根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
	<target name="report">
		<delete dir="${reportfolderPath}" />
		<mkdir dir="${reportfolderPath}" />

		<jacoco:report>
			<executiondata>
				<file file="${jacocoexecPath}" />
			</executiondata>

			<structure name="JaCoCo Report">
				<group name="Check Order related">
					<classfiles>
						<fileset dir="${checkOrderClasspath}" />
					</classfiles>
					<sourcefiles encoding="gbk">
						<fileset dir="${checkOrderSrcpath}" />
					</sourcefiles>
				</group>
			</structure>

			<html destdir="${reportfolderPath}" encoding="utf-8" />
		</jacoco:report>
	</target>
</project>

生成报告如下:

因为我们只有一个接口 /hello,  所以第一次运行覆盖率是51%,表示没覆盖到这一行

return "hello world";

通过浏览器访问 /hello。再次计算覆盖率,就会发现它变为100%了。

感谢:

cf_崔先生

https://blog.csdn.net/m0_37599783/article/details/107211913

小稳

https://blog.csdn.net/ccxw1983/article/details/94346013

Boblim

https://www.cnblogs.com/fnlingnzb-learner/p/10637802.html

wangfg

https://www.cnblogs.com/wangfg/p/12304526.html

简简单单

https://segmentfault.com/a/1190000022259363

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页