前言:
经过前面4篇博客的铺垫,终于来到尾声了,该篇我们将让jmeter脚本实现真正的自动化,废话少说,let's go!
准备:
1、上传服务端代码到 git
VCS -- Import into Version Control -- Share Project on Gitee
上传gitee成功,如下图所示:
2、搭建 mysql 服务
由于之前演示都是基于本地mysql服务的,现在改为线上linux服务器。我的 linux 服务器版本是 centos 8 。
①、查看具体的系统版本
cat /etc/redhat-release
②、通过 yum 安装方式安装 rpm 源
# 拉安装源
rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm
# 检查mysql-community-server
yum info mysql-community-server
# 安装mysql-community-server
yum -y install mysql-community-server
注意:
若 install 失败了,提示“Error: Unable to find a match: mysql-community-server”,可尝试执行mysql模块关闭指令,再重试。
yum module disable mysql
③、启动mysql服务
# 启动mysql服务
systemctl start mysqld
# 查看mysql服务的状态
systemctl status mysqld
④、查看mysql密码
less /var/log/mysqld.log
⑤、检查防火墙和安全组是否开放。
# 查看防火墙是否开启
systemctl status firewalld.service
# 查看防火墙端口开放情况
firewall-cmd --list-ports
# 防火墙放开8080端口
firewall-cmd --zone=public --add-port=8800/tcp --permanent
# 重启防火墙
firewall-cmd --reload
安全组需要登录云服务器的控制台操作,这里不赘述。
⑥、新建数据库、表和数据
CREATE DATABASE test;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `test`.`product`;
CREATE TABLE `test`.`product` (
`id` int(0) NOT NULL,
`product_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`price` int(0) NULL DEFAULT NULL COMMENT '单位:分',
`number` int(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
INSERT INTO `test`.`product` VALUES (1, '牛奶', 300, 2);
INSERT INTO `test`.`product` VALUES (2, '咖啡', 700, 4);
SET FOREIGN_KEY_CHECKS = 1;
⑦、修改 jmeter jdbc 配置
之前的 jmeter 脚本自行修改成对应的服务器地址,这里就不赘述了。
3、搭建 maven 环境
4、部署 jenkins 服务
至此,默认环境都搭好了,继续往下走。
构造步骤:
1、登录jenkins
2、新增任务
3、联通git仓库
至此,可以保存,尝试构建该任务,查看是否成功拉取git项目。如若拉取成功,可在该目录 /var/lib/jenkins/workspace/ 下发现项目。
4、编写构建脚本
这段脚本的作用大致为拉取git上的最新的代码,再通过maven构建jar包,最后使用 jar -jar 指令部署起来**
# jenkins默认在build结束后会kill掉所有的衍生进程,填写该配置可避免
BUILD_ID=DONTKILLME
# 重新加载配置参数
. /etc/profile
# 获取git拉取代码后存放的路径
export PROJ_PATH=`pwd`
# 执行自定义的shell脚本
source $PROJ_PATH/rebuild.sh
编写 rebuild.sh 脚本,存放在 jenkins 对应的工作空间项目目录下,如:/var/lib/jenkins/workspace/jmeter_demo
#!/usr/bin/env bash
# 1、查进程,有则杀,无则输出提示
killJavaProcess()
{
pid=`ps -ef|grep java|grep jemter-demo|awk '{print $2}'`
echo "jmeter-demo PId list :$pid"
if [ "$pid" = "" ]
then
echo "no jmeter-demo pid alive!"
else
kill -9 $pid
echo "kill pid success!"
fi
}
#删除之前的maven生成的target文件夹
rm -rf $PROJ_PATH/target
cd $PROJ_PATH
mvn clean install
#调用之前封装的方法杀掉java进程
killJavaProcess
# 判断是否有history文件夹,没有则创建,用于存储jar包的备份
if [ ! -d "$PROJ_PATH/history" ]; then
mkdir $PROJ_PATH/history
fi
# 备份刚通过maven install出来的jar包
cp $PROJ_PATH/target/jmeter-demo-0.0.1-SNAPSHOT.jar $PROJ_PATH/history/jmeter-demo-0.0.1-SNAPSHOT_`date +%y%m%d%H%M%S`.jar.bak
# 执行java的启动指令
nohup java -jar $PROJ_PATH/target/jmeter-demo-0.0.1-SNAPSHOT.jar > $PROJ_PATH/boot.log 2>&1 &
# 打印项目的启动日志
cat $PROJ_PATH/boot.log
5、监听git仓库
如下方两张图,在 Jenkins 中配置构建触发器,明确 Jenkins 在什么时候会触发构建;再在 gitee 上关联配置 webhook url 和 密码。
节点1,至此已完成监听配置,可尝试提交代码到 git,试看 jenkins 会不会触发构建。
6、执行测试用例
①、将本地调试好的文件存放到对应目录下。
分别包括:
.jmx 文件和 .csv 文件放在 /var/lib/jenkins/workspace/jmeter_demo jenkins 任务的工作目录下。
.jar 包资源放在 /data/jmeter/apache-jmeter-5.4.3/lib/ext jmeter安装目录下。
②、完善构建中的内容
接在之前第4点的内容后面。
# 执行jmx文件的测试用例
source $PROJ_PATH/jmeter_test.sh
③、编写 jmeter_test.sh 脚本
#!/usr/bin/env bash
# 判断是否有report文件夹,有则删除,jmeter存放测试报告的文件夹必须为空
if [ -d "$PROJ_PATH/report" ]; then
rm -rf $PROJ_PATH/report
mkdir $PROJ_PATH/report
echo "删除已存在的report文件夹,并重新生成空文件夹!"
else
mkdir $PROJ_PATH/report
fi
if [ -f "$PROJ_PATH/result.jtl" ]; then
rm -rf $PROJ_PATH/result.jtl
echo "删除已存在的result.jtl文件!"
fi
# 执行jmx文件
jmeter -n -t ./模板.jmx -l ./result.jtl -e -o ./report
if [ ! -d "$PROJ_PATH/jmeter_history" ]; then
mkdir $PROJ_PATH/jmeter_history/
echo "jmeter_history文件夹不存在,现已创建成功!"
fi
# 备份刚执行完的jmx、jtl和测试报告
time="`date +%y%m%d%H%M%S`"
mkdir $PROJ_PATH/jmeter_history/$time
cp $PROJ_PATH/模板.jmx $PROJ_PATH/jmeter_history/$time/模板.jmx
cp $PROJ_PATH/result.jtl $PROJ_PATH/jmeter_history/$time/result.jtl
cp -rf $PROJ_PATH/report $PROJ_PATH/jmeter_history/$time/report
④、为避免js、css文件失效,需添加 Execute system Groovy script
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
⑤、为日志加个时间戳,方便后续排查问题。
⑥、若遇到因linux目录、文件的操作权限不足的情况,可对工作空间执行该条语句。
chmod -R 777 /var/lib/jenkins/workspace/jmeter_demo
节点2,至此已完成了 jmeter 测试用例的自动执行,我们可以尝试代码提交master分支,然后看测试用例是否自动执行成功。
7、输出测试报告
鉴于jenkins自动构建、执行jmx文件是没有通知的,需要人为去后台查看,过于麻烦,所以这里引入“Publish HTML reports”、“Editable Email Notification”两个插件,用来构建后通知我们结果。
邮件模板:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
(本邮件由系统自动发出,无需回复!)
<br />
各位好,以下是${PROJECT_NAME}项目构建信息
<br />
<td>
<font color="#CC0000">构建结果 - ${BUILD_STATUS}</font>
</td>
</tr>
<tr>
<td>
<br />
<b>
<font color="#0B610B">构建信息 - ${BUILD_STATUS}</font>
</b>
<hr size="2" width="100%" align="center" />
</td>
</tr>
<tr>
<td>
<ul>
<li>项目名称:${PROJECT_NAME}</li>
<li>构建编号:第${BUILD_NUMBER}次构建</li>
<li>触发原因:${CAUSE}</li>
<li>构建状态:${BUILD_STATUS}</li>
<li>构建日志:<a href="${BUILD_URL}console">${BUILD_URL}console</a>
</li>
<li>构建地址:<a href="${BUILD_URL}">${BUILD_URL}</a>
</li>
<li>工作目录:<a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a>
</li>
<li>项目地址:<a href="${PROJECT_URL}">${PROJECT_URL}</a>
</li>
<li>测试报告地址:${BUILD_URL}JMeter_20HTML_20Report</li>
</ul>
<h4>
<font color="#0B610B">变更记录</font>
</h4>
<hr size="2" width="100%" />
变更明细:<a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a>
<br />
<h4>
<font color="#0B610B">测试结果</font>
</h4>
<hr size="2" width="100%" />
<div>
<li>本次构建的构建日志请查阅附件《build.log》;</li>
<li>接口测试用例(未执行)请查阅附件《接口测试用例模板.csv》;</li>
<li>接口测试用例(已执行)请查阅附件《测试报告2022xxxx.csv》。</li>
</div>
<br/>
</td>
</tr>
</table>
</body>
</html>
8、最终效果展示
构建成功后,收到一封邮件。
打开邮件可见如下信息,包含测试报告、构建log文件。
jmeter 测试报告。
jmeter 接口测试用例结果。
总结:
至此,基于 JMeter + Jenkins 的自动化接口测试便完成了,共计 5 篇博客。文章描述是死的,人是活的,要善于利用搜索引擎,踩在前人的基础上解决问题!
评论区