Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析

1、测试覆盖率的重要性

在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代码。用代码覆盖率来衡量,有利也有有弊。

2、spring白盒测试

常用的测试手段是debug,Junit测试,也可用postman,pytest,等等测试方式。当然有利也有弊,但是作为java开发工作者,junit测试是必须学会的一种手段。但是测试写了不少还是不知道如何展示结果。下面介绍两种测试结果展示方式 1、sonarqube 2、idea自带展示方式

3、JaCoCo配合maven进行测试

项目中增加部分配置

 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.2.5.RELEASEversion>
        <relativePath/> 
    parent>
    <groupId>com.examplegroupId>
    <artifactId>demoartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>junitDemoname>
    <description>Demo project for Spring Bootdescription>

    <properties>
        <java.version>8java.version>
        <sonar.version>3.6.0.1398sonar.version>
        <jacoco.version>0.8.5jacoco.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>fastjsonartifactId>
            <version>1.2.66version>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.13version>
            <scope>testscope>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintagegroupId>
                    <artifactId>junit-vintage-engineartifactId>
                exclusion>
            exclusions>
        dependency>
    dependencies>

    <build>
        <finalName>${project.artifactId}finalName>
        <pluginManagement>
            <plugins>

                <plugin>
                    <groupId>org.jacocogroupId>
                    <artifactId>jacoco-maven-pluginartifactId>
                    <version>${jacoco.version}version>
                    <configuration>
                        <includes>
                            <include>**/service/**include>
                            <include>**/controller/**include>
                            
                        includes>
                        
                        <rules>
                            <rule implementation="org.jacoco.maven.RuleConfiguration">
                                <element>BUNDLEelement>
                                <limits>  
                                    
                                    <limit implementation="org.jacoco.report.check.Limit">
                                        <counter>METHODcounter>
                                        <value>COVEREDRATIOvalue>
                                        <minimum>0.50minimum>
                                    limit>
                                    
                                    <limit implementation="org.jacoco.report.check.Limit">
                                        <counter>BRANCHcounter>
                                        <value>COVEREDRATIOvalue>
                                        <minimum>0.50minimum>
                                    limit>
                                    
                                    <limit implementation="org.jacoco.report.check.Limit">
                                        <counter>CLASScounter>
                                        <value>MISSEDCOUNTvalue>
                                        <maximum>0maximum>
                                    limit>
                                limits>
                            rule>
                        rules>
                    configuration>
                plugin>
            plugins>
        pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.sonarsource.scanner.mavengroupId>
                <artifactId>sonar-maven-pluginartifactId>
                <version>${sonar.version}version>
            plugin>
            <plugin>
                <groupId>org.jacocogroupId>
                <artifactId>jacoco-maven-pluginartifactId>
                <executions>
                    <execution>
                        <id>jacoco-initializeid>
                        <goals>
                            <goal>prepare-agentgoal>
                        goals>
                    execution>
                    
                    <execution>
                        <id>checkid>
                        <goals>
                            <goal>checkgoal>
                        goals>
                    execution>
                    
                    <execution>
                        <id>jacoco-siteid>
                        <phase>packagephase>
                        <goals>
                            <goal>reportgoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>
project>

配置后利用sonarqube

mvn sonar:sonar -Dsonar.host.url=http://sonar.juneyaoair.com:9000 -Dsonar.login=aaa-Dsonar.password=aaa

后可登录页面查看

Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第1张图片
sonarqube页面查看效果
Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第2张图片Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第3张图片
当然有点尴尬,写了测试用例覆盖率还是0.0%

  1. 这个问题终于在一篇博客里找到了,是因为sonarqube没有安装jacoco这个收集插件!!!!!!!!!
  2. 现在遇到问题,maven聚合项目无法收集每个module下面的测试报告 -----这个问题解决了!解决方式为配置 -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml 这样maven插件回去每个单独的module下收集所有测试报告,但是这个无法在jenkins的sonar-scanner里配置。暂时这个不知道什么原因
  3. Destfile配置后,结果报告为乱码状态无法收集

以上第二个问题找到了解决方案
利用sonar-scanner的modules的方式配置每个具体的modules
Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第4张图片

4、利用idea查看当前项目测试用例覆盖情况

右击项目 点击 Run ‘All Tests’ with Coverage

Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第5张图片
就可得到以下覆盖率报告

Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第6张图片
点击进入后可查看每个方法覆盖情况

Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第7张图片
绿色为测试覆盖到的代码,红色是需要覆盖的地方

Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第8张图片
同时项目中也会有代码覆盖描述

Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第9张图片

点击创建代码测试覆盖率分析

Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第10张图片
将这个选项改为JaCoCo 后点击run后会在target下生成当前项目的JaCoCo的测试覆盖率报告html

Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第11张图片
将index.html拖到浏览器或者用网页打开

Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第12张图片Jenkins+Jacoco+Sonarqube+Springboot 测试覆盖率分析_第13张图片
即可看到测试用例覆盖率报告。

你可能感兴趣的:(Springboot,jenkens,spring,boot,sonarqube)