侧边栏壁纸
博主头像
一朵云的博客博主等级

拥抱生活,向阳而生。

  • 累计撰写 67 篇文章
  • 累计创建 25 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

接口自动化 -- 基于JMeter的实战攻略(5)

一朵云
2022-05-24 / 0 评论 / 3 点赞 / 8563 阅读 / 13510 字

前言:

  经过前面4篇博客的铺垫,终于来到尾声了,该篇我们将让jmeter脚本实现真正的自动化,废话少说,let's go!

准备:

1、上传服务端代码到 git

VCS -- Import into Version Control -- Share Project on Gitee

image.png

上传gitee成功,如下图所示:

image.png

2、搭建 mysql 服务

由于之前演示都是基于本地mysql服务的,现在改为线上linux服务器。我的 linux 服务器版本是 centos 8 。

①、查看具体的系统版本

cat /etc/redhat-release

image.png

②、通过 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

image.png

⑤、检查防火墙和安全组是否开放。

# 查看防火墙是否开启
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 环境

具体参考之前的文章:
http://yiduoyun.space/archives/jenkins--%E5%AE%89%E8%A3%85%E5%8F%8A%E9%85%8D%E5%A5%97%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA

4、部署 jenkins 服务

具体参考之前的文章:
http://yiduoyun.space/archives/jenkins--%E5%AE%89%E8%A3%85%E5%8F%8A%E9%85%8D%E5%A5%97%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA

至此,默认环境都搭好了,继续往下走。

构造步骤:

1、登录jenkins

image.png

2、新增任务

image.png

3、联通git仓库

image.png

至此,可以保存,尝试构建该任务,查看是否成功拉取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

image.png

编写 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 和 密码。

webhook.png

image.png

  节点1,至此已完成监听配置,可尝试提交代码到 git,试看 jenkins 会不会触发构建。

6、执行测试用例

①、将本地调试好的文件存放到对应目录下。

分别包括:

.jmx 文件和 .csv 文件放在 /var/lib/jenkins/workspace/jmeter_demo jenkins 任务的工作目录下。

image.png

.jar 包资源放在 /data/jmeter/apache-jmeter-5.4.3/lib/ext jmeter安装目录下。

image.png

②、完善构建中的内容

接在之前第4点的内容后面。

# 执行jmx文件的测试用例
source $PROJ_PATH/jmeter_test.sh

image.png

③、编写 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')

image.png

⑤、为日志加个时间戳,方便后续排查问题。

image.png

⑥、若遇到因linux目录、文件的操作权限不足的情况,可对工作空间执行该条语句。

chmod -R 777 /var/lib/jenkins/workspace/jmeter_demo

  节点2,至此已完成了 jmeter 测试用例的自动执行,我们可以尝试代码提交master分支,然后看测试用例是否自动执行成功。

7、输出测试报告

鉴于jenkins自动构建、执行jmx文件是没有通知的,需要人为去后台查看,过于麻烦,所以这里引入“Publish HTML reports”、“Editable Email Notification”两个插件,用来构建后通知我们结果。

image.png

image.png

邮件模板:

<!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、最终效果展示

构建成功后,收到一封邮件。

image.png

打开邮件可见如下信息,包含测试报告、构建log文件。

image.png

jmeter 测试报告。

image.png

jmeter 接口测试用例结果。

image.png

总结:

  至此,基于 JMeter + Jenkins 的自动化接口测试便完成了,共计 5 篇博客。文章描述是死的,人是活的,要善于利用搜索引擎,踩在前人的基础上解决问题!

3

评论区