一、项目背景:
一个小公司的朋友反应他们那边Java项目单元测试有,但还没有可视化统计覆盖率数据,没法统计就不能直观的看到单测的覆盖率,Java的覆盖率统计框架还是比较成熟,部署起来也不是很难,下面我们逐一讲解怎么部署, 提高单元测试覆盖率和规范代码编写规范
二、方案
工程中引入jacoco进行代码覆盖率统计,通过sonarqube scanner扫描工程编写规范,编写单元测试代码后,结合Jenkins每次的编译部署自动执行代码规范扫描和单元测试代码,并将结果推送到sonarqube平台进行图形展示。
步骤:
1、选择合适的测试框架:选择一个适合项目的单元测试框架,例如JUnit(Java项目)。
2、设置测试环境:确保在测试环境中安装和配置所有必需的软件和工具,包括构建工具、依赖项管理器和代码覆盖率工具等。
3、编写测试代码:编写单元测试代码,测试各个单元功能是否按预期工作。确保覆盖代码的不同路径和边界情况。需要开发配合。
4、自动化测试:使用持续集成工具Jenkins设置自动化测试流程,以便在每次代码提交或定期基准测试时运行单元测试。
5、代码覆盖率检查:使用代码覆盖率工具JaCoCo来检测测试代码覆盖的代码范围,以确保测试足够全面。
6、测试结果:jenkins将结果推送到sonarqube平台进行图形展示。
选用的工具及框架:
Sonarqube、sonarqube Scanner、Jenkins、jacoco
三、环境配置:
安装JDK11
由于SonarQube和JDK及数据库有对应版本要求,本次平台搭建使用版本如下:
- SonarQube 8.9.6
- OpenJDK 11,
- PostgreSQL 12
1、安装OpenJDK 11:
sudo apt-get install openjdk-11-jdk
2、配置环境变量:
在安装OpenJDK 11后,需要更新环境变量以指向新的JDK版本。vi ~/.bashrc
在文件末尾添加以下行:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
2、使配置生效:
在终端中执行以下命令以加载配置的环境变量:source ~/.bashrc
4、验证安装:
运行以下命令来检查是否已正确安装OpenJDK 11并使其生效:java -version
修改配置信息
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、查看配置结果
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-communityrestart: alwayscontainer_name: sonarqubedepends_on:- dbenvironment:SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonarSONAR_JDBC_USERNAME: sonarSONAR_JDBC_PASSWORD: sonarvolumes:- sonarqube_data:/opt/sonarqube/data- sonarqube_extensions:/opt/sonarqube/extensions- sonarqube_logs:/opt/sonarqube/logsports:- "9000:9000"db:image: postgres:12container_name: postgresqlports:- "5432:5432"environment:POSTGRES_USER: sonarPOSTGRES_PASSWORD: sonarvolumes:- postgresql:/var/lib/postgresql- postgresql_data:/var/lib/postgresql/datapgadmin4:image: dpage/pgadmin4container_name: pgadmin4ports:- "5433:80"environment:- PGADMIN_DEFAULT_EMAIL=test@123.com- PGADMIN_DEFAULT_PASSWORD=123456volumes: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配置文件中一致
--> 保存
四、Jenkins集成sonarScanner
说明:如果已经在Docker中安装了SonarQube,一般不需要在服务器上单独安装SonarScanner。
SonarScanner是用于执行SonarQube分析的命令行工具,通常在Jenkins或其他CI/CD工具中集成并使用。
1、jenkins安装sonarQube插件
3、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平台查看结果:
下图展示扫描发现的bug数量,覆盖率百分比展示,重复率百分比及重复的模块数量
1)结果分析
后端应用esmc,待解决的BUG有32个,其中主要BUG有26个,次要BUG有6;严重漏洞有3个;异味有3.3K。
可靠性比率为D;安全性比率为D;安全审核等级为E;可维护性即SQALE评级为A;覆盖率为0.0%;重复行密度为4.5%;总代码行数为69961;圈复杂度为7126,认知复杂度为4589;违规问题3349,均为开启问题。
2)结论
Java代码覆盖率工具在软件开发中起到了不可或缺的作用。它们不仅帮助开发者识别耒覆盖的代码、还可以通过生成详细报告提高代码质量和可靠性。通过适当的使用和定期的维护,开发团队可以显著提升代码的测试覆盖率,从而提升软件的稳定性与用户的满意度。希望本文能帮助你理解并有效地利用这些工具,提高开发效率。