單元測試平臺平臺搭建:sonarQube+sonarScanner+Jenkins+jacoco
單元測試平臺搭建及結果分析
一、方案
需求目標:提高單元測試覆蓋率和規范代碼編寫規范
選用工具:Sonarqube、sonarqube Scanner、Jenkins、jacoco
方案:
工程中引入jacoco進行代碼覆蓋率統計,通過sonarqube scanner掃描工程編寫規范,編寫單元測試代碼后,結合Jenkins每次的編譯部署自動執行代碼規范掃描和單元測試代碼,并將結果推送到sonarqube平臺進行圖形展示。
步驟:
- 1、選擇合適的測試框架:選擇一個適合項目的單元測試框架,例如JUnit(Java項目)。
- 2、設置測試環境:確保在測試環境中安裝和配置所有必需的軟件和工具,包括構建工具、依賴項管理器和代碼覆蓋率工具等。
- 3、編寫測試代碼:編寫單元測試代碼,測試各個單元功能是否按預期工作。確保覆蓋代碼的不同路徑和邊界情況。需要開發配合。
- 4、自動化測試:使用持續集成工具Jenkins設置自動化測試流程,以便在每次代碼提交或定期基準測試時運行單元測試。
- 5、代碼覆蓋率檢查:使用代碼覆蓋率工具JaCoCo來檢測測試代碼覆蓋的代碼范圍,以確保測試足夠全面。
- 6、測試結果:jenkins將結果推送到sonarqube平臺進行圖形展示。
二、修改配置信息
1、/etc/security/limits.conf 配置文件
ulimit -n 是用來設置當前用戶的文件描述符限制(file descriptor limit)的命令。該限制用于控制一個進程可以同時打開的文件數。
ulimit -u 是限制用戶最大可用進程數。
/etc/security/limits.conf 中增加以下內容:
* soft nofile 65536
* hard nofile 65536
* soft nproc 655350
* hard nproc 655350
2、/etc/sysctl.conf 配置文件
max_map_count 文件包含限制一個進程可以擁有的VMA(虛擬內存區域)的數量;
fs.file-max 設置系統所有進程一共可以打開的文件數量
/etc/sysctl.conf 中增加以下內容:
vm.max_map_count = 524288
fs.file-max = 9223372036854775807
配置文件生效:sudo sysctl -p
3、查看配置結果

三、安裝JDK11
由于SonarQube和JDK及數據庫有對應版本要求,本次平臺搭建使用版本如下:
- SonarQube 8.9.6
- OpenJDK 11,
- PostgreSQL 12
1、卸載JDK 1.8:
sudo apt-get remove openjdk-8-jdk
2、安裝OpenJDK 11:
sudo apt-get install openjdk-11-jdk
3、配置環境變量:
在安裝OpenJDK 11后,需要更新環境變量以指向新的JDK版本。vi ~/.bashrc
在文件末尾添加以下行:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
4、使配置生效:
在終端中執行以下命令以加載配置的環境變量:source ~/.bashrc
5、驗證安裝:
運行以下命令來檢查是否已正確安裝OpenJDK 11并使其生效:java -version

四、Docker部署SonarQube、postgreSQL、pgAdmin4
1、新建目錄/usr/local/docker/sonarqube_docker
2、該目錄下新增docker-compose.yml文件
配置信息如下:
#docker-compose.yml
version: "3"
services:
sonarqube:
image: sonarqube:8.9.6-community
restart: always
container_name: sonarqube
depends_on:
- db
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
ports:
- "9000:9000"
db:
image: postgres:12
container_name: postgresql
ports:
- "5432:5432"
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
pgadmin4:
image: dpage/pgadmin4
container_name: pgadmin4
ports:
- "5433:80"
environment:
- PGADMIN_DEFAULT_EMAIL=test@123.com
- PGADMIN_DEFAULT_PASSWORD=123456
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
postgresql:
postgresql_data:
配置信息說明:
在這個文件中,我們定義了三個服務:sonarqube、postgresql和pgadmin4。
sonarqube 服務運行代碼掃描服務,并將容器端口9000映射到主機端口9000。
postgresql 服務將運行PostgreSQL數據庫,并將容器端口5432映射到主機端口5432。
pgadmin4 服務將運行pgAdmin 4可視化工具,并將容器端口80映射到主機端口5433。
postgresql和pgadmin4兩個服務都使用postgresql_data卷來共享數據。
3、容器啟動命令
啟動: sudo docker-compose up -d
重啟sonarqube容器: sudo docker restart sonarqube
4、訪問
sonarqube:http://宿主機IP:9000/ 用戶名/密碼:admin/123456
pgAdmin4:http://宿主機IP:5433/ 郵箱:test@123.com 密碼:123456
5、配置sonarqube
1)漢化:
配置-->應用市場-->插件,搜索chinese-->安裝插件-->重啟容器
2)開啟SCM:
配置-->SCM-->Disable the SCM Sensor,打開

3)得到登錄token令牌:
我的賬號-->安全-->輸入字符串:jenkinsTest-->得到登錄token令牌
sonarqube的令牌:
jenkinsTest:e698cc590cc8f7362b30e6b987fd1e835bcb1186
4)創建項目
創建項目:esmc-->得到項目令牌-->得到maven掃描SonarQube的命令
項目令牌:
esmc-test: 9aad77f4ad3f3ecfc23c9178c7305e144991d0f6
maven掃描SonarQube的命令:
mvn clean verify sonar:sonar \
-Dsonar.projectKey=esmc-test \
-Dsonar.host.url=http://宿主機IP:9000 \
-Dsonar.login=9aad77f4ad3f3ecfc23c9178c7305e144991d0f6
說明:登錄token令牌和項目令牌,在后續配置jenkins的時候會用到,需要提前保存好。
6、配置pgAdmin4數據庫
1)登錄pgAdmin4,使用docker-compose.yml文件中配置的郵箱和密碼。
pgAdmin4:http://宿主機IP:5433/
用戶名:test@123.com 密碼:123456
2)新增server:
點擊Add New Server按鈕
--> General填寫name:目前改成了PostgreSQL12
--> connection填寫宿主機IP、用戶名、密碼:與docker-compose.yml配置文件中一致
--> 保存


3)查看表

五、Jenkins集成sonarScanner
說明:如果已經在Docker中安裝了SonarQube,一般不需要在服務器上單獨安裝SonarScanner。
SonarScanner是用于執行SonarQube分析的命令行工具,通常在Jenkins或其他CI/CD工具中集成并使用。
1、jenkins安裝sonarQube插件

2、jenkins安裝jacoco插件

3、sonarQube的配置:見前面配置
4、Jenkins配置sonarQube
1)添加憑證:
選擇 Secret text 類型,輸入 SonarQube令牌,然后Secret中填入之前生成的登錄Token,ID只要不跟之前重復就行。

2)系統管理:填寫sonar的地址,憑證

3)全局工具管理:SonarQube servers配置項,增加 SonarQube


4)項目流水線配置修改
構建環境勾選:Delete workspace before build starts
構建環境勾選:Prepare SonarQube Scanner environment

Build Steps將目標修改為:
clean verify sonar:sonar -Dsonar.projectKey=esmc-test -Dsonar.host.url=http://宿主機ip:9000 -Dsonar.login=9aad77f4ad3f3ecfc23c9178c7305e144991d0f6 package -Dmaven.test.skip=true
保存后重新構建。
六、掃描結果

點擊SonarQube,跳轉到SonarQube平臺查看結果:


結果分析:
后端應用esmc,待解決的BUG有32個,其中主要BUG有26個,次要BUG有6;嚴重漏洞有3個;異味有3.3K。
可靠性比率為D;安全性比率為D;安全審核等級為E;可維護性即SQALE評級為A;覆蓋率為0.0%;重復行密度為4.5%;總代碼行數為69961;圈復雜度為7126,認知復雜度為4589;違規問題3349,均為開啟問題。
浙公網安備 33010602011771號