Jmeter+Jenkins实现接口自动化的持续集成
1、前置准备工具(安装步骤省略)
Jmeter
Tomcat+Jenkins
Python
2、Jmeter录制脚本
-
第一步:新建测试计划--线程组--HTTP代理服务器
-
目标控制器可以修改为线程组,分组可以设置为每个组放入一个新的控制器中,这样录制的脚本根据操作停顿的时间按组分配进入线程组中,线程组中的组名可以自己修改,比如:商品模块
端口号设置8888,如果冲突的话可以任意修改
-
Requests Filtering存在包含模式和排除模式
-
-
第二步:打开电脑IE浏览器,点击右上角设置--Internet选项--连接--局域网设置--代理服务器,勾选代理服务器,且进入高级设置中设置地址为127.0.0.1,端口号为Jmeter中的端口号,一致即可,建议8888,这样避免后续多次修改
-
第三步:启动Jmeter
-
第四步:安装证书给浏览器,打开浏览器--设置--管理证书--受信任的根证书颁发机构--导入,导入刚刚jmeter/bin中的ApacheJMeterTemporaryRootCA.crt即可,有效期7天,如7天后还要录制,该证书需要更换一次。教程已Google浏览器为例,上图启动Jmeter后,证书自动生成在Jmeter中的bin路径下(ApacheJMeterTemporaryRootCA.crt),附图:
-
第五步:操作页面,可以根据功能操作,一个模块多个接口放入线程组中的一个组内,至此录制已完成,如图:
3、设置全局断言和单个接口断言
-
响应断言:线程组--右键新建断言--新建响应断言,设置main sample only,勾选响应头和忽略状态,模式匹配规则用包括即可,测试模式输入框输入200,该断言是断言录制的所有请求的HTTP响应码都为200,保障接口正常,但无法保障数据正常。遇到接口返回参数无规则(有时候list[0].type为1,有时候list[0].type为3,JSON提取器无法准确提取到值)的时候也可以使用该方法断言返回参数中的字符串,详情看图:
-
JSON断言:线程组--xx组--xx接口--右键新建断言--新建JSON断言,因为每个接口返回的数据类型不一致,不好用全局断言,所以可以尝试单个接口断言,如A接口返回数据code:0,B接口返回数据code:1,表达式表达方法用.total,提取score的100分的时候就是$.score[0],如图:
4、设置测试报告
-
察看结果树:线程组--右键新建监听器--新建察看结果树,该监听器功能便于查看请求参数、返回参数及断言结果,利于debug。也可以设置单个接口或者单个组,建议设置全局,即线程组--察看结果树,可以勾选仅错误日志,这样只有断言不通过的才会出现在这,断言通过的会被过滤掉,文件名中可以输出三种报告,其中jtl(转html报告用),csv(python提取数据,进行过滤用),xml(不太好看),推荐jtl,这样便于集成jenkins,如图:
用表格察看数据:该功能可以查看接口发出时间等,可以更直观的查看接口并发的情况
聚合报告:可以用来查看接口并发的时间,耗时等,接口并发用较好
汇总报告:接口并发用较好,做自动化的话可以不用加这个
5、HTTP信息头管理器
-
全局信息头管理器:可以在线程组中直接添加一个信息头管理器,后续所有接口都会拿到该信息头,需要加上,若后续接口需要获取登录接口的token的话,可以在信息头管理器中调用变量,这个变量用JSON提取器或者正则表达式提取器从登录接口获取(一般来说),引用名称就是后面调用的变量,比如名称叫auth_token,后面信息头管理器中调用的话就是${auth_token},所有的接口,存在关联参数的话都可以通过JSON提取器和正则表达式提取器获取
局部信息头管理器:录制脚本的时候不要勾选,不然会在每一个接口中生成一个HTTP信息头管理器,这样会增加内存消耗,建议统一使用线程组中的HTTP信息头管理器
6、CSV数据文件设置
-
域名、账号、密码等动态数据(换个人使用或者换个环境运行的话就要替换域名),可以线程组--右键新建配置元件--csv data set config,文件名即存放txt的路径,编码使用utf-8,变量名称自己任意取,后面根据取的变量调用,多个变量之间使用英文逗号隔开,分隔符使用英文逗号,后面的默认选项即可,需要几个自己控制,比如域名只需要传递www.baidu.com,前缀的https在接口处已经存在,所以不用传递,变量调用方法还是${变量名},如图:
7、性能测试
-
线程组中修改线程数、ramp-up(时间)、循环次数,1个线程数即代表一个人或者一台机器去执行整个脚本,ramp-up时间就是并发时间,设置0时可以实现毫秒级并发,设置1的话就是秒级别并发,循环次数就是执行几次这个脚本,按需设置即可,接下来把这三个参数设置遍历,便于后续集成,线程数设置{rampupTime},循环次数设置${loopNum},在指令运行的时候传递这三个值的参数即可,如Jmeter -JthreadNum=100 -JloopNum=1 -JrampupTime=0 -n -t xx.jmx -l xx.jtl -e -o report。至此Jmeter操作已全部结束,后续是关于Jenkins集成的步骤。
8、Jenkins
-
搭建虚拟机、Linux,安装Tomcat,部署Jenkins,步骤省略。因为Jmeter依赖jdk,所以Windows/Linux中还需要安装JDK和Jmeter,以及环境变量,步骤省略。进入Jenkins插件管理中找到和安装对应的插件(HTML report、dingtalk等),安装完毕后进入配置中配置钉钉机器人的参数,步骤省略,附图:
-
新建item,勾选机器人,设置运行空间,构建触发器设置(定时、token、gitlab、github等),构建,以及构建后的报告,如图:
9、Python筛选、过滤数据
-
如遇到报告接口数据过多,可搭配CSV报告进行数据的提取,去重、拼接,以及推送钉钉,如图:
-
钉钉机器人代码已经封装好了,比较简单,可以直接导入和调用,也可以自己写,代码复制在下面:
# -*- coding: utf-8 -*- # @Time: 2021/1/29 14:40 # @Author: wangzhijing # @File: dingtalk_robot.py import base64 import hashlib import hmac import time import json import requests import urllib import urllib.parse class DingTalkRobot: def __init__(self, secret, webhook): # 钉钉机器人秘钥和webhook, 替换成自己的,可以点击机器人设置查看(前提是自己机器人的安全设置选择的加签,非关键词和ip地址) self.secret = secret self.webhook = webhook # signature,不用修改 self.times = int(round(time.time() * 1000)) secret_encode = str(self.secret).encode('utf-8') string_to_sign = '{}\n{}'.format(self.times, self.secret) string_to_sign_encode = str(string_to_sign).encode('utf-8') hmac_code = hmac.new(secret_encode, string_to_sign_encode, digestmod=hashlib.sha256).digest() self.sign = urllib.parse.quote(base64.b64encode(hmac_code)) # 拿钉钉机器人唯一的webhook与时间戳、base64后的秘钥进行拼凑 self.url = self.webhook + '×tamp=' + str(self.times) + '&sign=' + self.sign def push(self, content, isAtAll=False): # 推送文本样式,内容填充在content中,isAtAll为true时@所有人,为false时会@atMobiles中的手机号码,手机号码需群员的真实号码 push_content = { "msgtype": "text", "text": { "content": f"{content}\n" # content是要推送的内容,如果要自定义推送的内容及样式,可以查阅钉钉api官方文档 }, "at": { "atMobiles": [ "xxx", "xxx", "xxx" ], "isAtAll": isAtAll # 是否@所有人,是的话True, False的话会@列表中的真实手机号码(需在机主在群里才@到) } } response = requests.post(self.url, json=push_content) # print(json.dumps(response.json(), indent=4, ensure_ascii=False)) print(str(time.strftime("%H:%M:%S")) + "推送成功")