SonarQube学习(三)- 项目代码扫描

一、前言

元旦三天假,两天半都在玩86版本DNF,不得不说,这个服真的粘度太高了,但是真的很良心。

作为一个老玩家,玩的就是个情怀!

说明:

注册账号上线100w点券,一身+15红字史诗装备以及+21强化新手武器。在线泡点一分钟888点券。所有东西皆可白嫖!

游戏成就

附图1

附图2

附图3

附图4

这把+21的武器,创建角色就给,刷图是真的太爽了!

附图5

我拿到坠入深渊的灵魂称号,刷到红狗所有鬼剑的85版本史诗武器,天御三等二,开盒子开到手软,重点是不花钱,不花钱!

下午突然想到SonarQube这个我还没学完,接着便开始接着搞SonarQube,自己想做的事,必须要坚持,有始有终,一定要更新完。

正事的时候,我一般都是随时可以退掉不玩,哈哈,谁和我打排位估计会坑吧。

二、准备

1、创建一个springboot 工程

此处略

2、随便写几个 Service Controller 及API的测试方法。

代码1,示例如下:

package com.rongrong.springboot.demo.controller;

import com.rongrong.springboot.demo.responstory.StudentResponstory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

/**
 * @description: 对API进行单元测试
 * @author rongrong
 * @version 1.0
 * @date 2021/1/03 14:12
 */
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class StudentApiTest {


    @Autowired
    MockMvc mockMvc;

    @Test
    public void testStudentApiTest() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/students"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("[{\"id\":16,\"name\":\"alex\",\"age\":10,\"sex\":\"boy\",\"email\":\"[email protected]\"},{\"id\":857,\"name\":\"tester\",\"age\":15,\"sex\":\"boy\",\"email\":\"[email protected]\"}]"));
    }

}

代码2,示例如下:

package com.rongrong.springboot.demo.controller;

import com.rongrong.springboot.demo.domain.Student;
import com.rongrong.springboot.demo.responstory.StudentResponstory;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @description: 对service进行单元测试
 * @author rongrong
 * @version 1.0
 * @date 2021/1/03 14:52
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class StudentControllerTest {

    @Autowired
    StudentResponstory studentResponstory;

    @Test
    public void sudentFindOne() {
        Student student = studentResponstory.findOne(16);
        Assert.assertEquals(new Integer(10), student.getAge());
    }
}

3、配置本地 maven 配置文件 conf/settings.xml

添加如下内容:

  <pluginGroups>
	<!-- SonarQube 插件 -->
	<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
  </pluginGroups>
  
  <profiles>
	<!-- SonarQube 插件 -->
	<profile>
		<id>sonar</id>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
		<properties>
			<!-- Optional URL to server. Default value is //localhost:9000 -->
			<sonar.host.url>
			  //192.168.1.106:9000
			</sonar.host.url>
		</properties>
	</profile>
  </profiles>

4、在pom.xml中引入JaCoCo插件

添加如下内容:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.2</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <!-- change phase from verify to test -->
        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

三、配置扫描数据

1、添加文件

在项目下:添加 sonar-project.properties 文件

2、复制以下文件内容

# 指定SonarQube instance必须是唯一的
sonar.projectKey=springboot_demo
# 设置SonarQube UI显示的名称 
# PS:有人会问这里的名称是否可以是中文名称,我在网上搜索了好多资料都说是不可以的(至少我看到的资
#料都是)后来自己尝试了一下,答案是可以写成中文的,但是要换一种方式,比如你想把项目名称命名为“测
#试”,那么在这里就要写成“\u6d4b\u8bd5”,那么下面这个参数就应该这样写“sonar.projectName= 
#\u6d4b\u8bd5”,说白了就是将中文转成Unicode
sonar.projectName=springboot_demo
sonar.projectVersion=1.0
sonar.language=java
# 指定src和classes文件夹位置,当然也可以是全路径,如果是当前工程根目录下用“.”表示也可以,比如“sonar.sources=.”
sonar.sources=src/main
sonar.test=src/test
sonar.java.binaries=target
# 下面的这两个参数作用是相同的,因为有时我们需要指定某个文件夹或者忽略某个文件夹
# sonar.inclusions=src1/**,src3/**
# sonar.exclusions=src2/**,src4/**
# 源码编码,默认是系统编码
sonar.sourceEncoding=UTF-8
# Set jacoco Configuration
# 指定代码覆盖率工具
sonar.core.codeCoveragePlugin=jacoco
# 指定exec二进制文件存放路径
#sonar.jacoco.reportPaths=[yourPath/]jacoco.exec
#本demo之前设置的exec文件是在工程根目录下的target/coverage-reports下:

sonar.jacoco.reportPaths=target/jacoco.exec
# 以下属性可选择性加,当然也可以不加
sonar.dynamicAnalysis=reuseReports
sonar.jacoco.reportMissing.force.zero=false

3、运行

在项目根目录下,运行** mvn package**.

当build成功的时候Jacoco的结果就会产生在target/site/jacoco文件夹下。

接着,在项目根目录下运行命令 sonar-scanner,如果看到以下结果证明已经覆盖率已经可以在SonarQube上查阅。

四、在SonarQube查看扫描结果

刷新下系统页面,如下显示

知识点:
借用风总说的话就是,你要先进行测试才有覆盖率

五、结束语

powermock用这个能做覆盖率吗,有兴趣的同学可以尝试下,此处埋下伏笔了,哈哈。

下一篇就是收尾了,Jenkins集成JaCoCo和SonarQube和检查代码测试覆盖率。

Tags: