SonarQube學習(三)- 專案程式碼掃描

久曲健發表於2021-01-03

一、前言

元旦三天假,兩天半都在玩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\":\"alex@gmail.com\"},{\"id\":857,\"name\":\"tester\",\"age\":15,\"sex\":\"boy\",\"email\":\"tester@gamil.com\"}]"));
    }

}

程式碼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 http://localhost:9000 -->
			<sonar.host.url>
			  http://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檢視掃描結果

重新整理下系統頁面,如下顯示

知識點:
借用風總說的話就是,你要先進行測試才有覆蓋率

五、結束語

下一篇就是收尾了,Jenkins整合JaCoCo和SonarQube和檢查程式碼測試覆蓋率。

來個互動,powermock用這個能做覆蓋率嗎,有興趣的同學可以嘗試下,此處埋下伏筆了,哈哈。

相關文章