Jmeter+Jenkins实现接口自动化的持续集成

Jmeter+Jenkins实现接口自动化的持续集成

1、前置准备工具(安装步骤省略)

  • Jmeter

  • Tomcat+Jenkins

  • Python

2、Jmeter录制脚本

  • 第一步:新建测试计划--线程组--HTTP代理服务器

    • 目标控制器可以修改为线程组,分组可以设置为每个组放入一个新的控制器中,这样录制的脚本根据操作停顿的时间按组分配进入线程组中,线程组中的组名可以自己修改,比如:商品模块

    • 端口号设置8888,如果冲突的话可以任意修改

    • Requests Filtering存在包含模式和排除模式

      • 包含模式:使用正则过滤要抓包的域名(正则表达式可以百度在线正则表达式),如我要抓取任何和baidu.com有关的请求

      • 排除模式:前一步包含模式是过滤要抓的包,排除模式是在前面的基础上去掉包含bmp|css|js|gif|ico|jpe?g|png|swf|woff|woff2|htm|html|gif的包,避免录制到了页面请求的js、gif等请求

  • 第二步:打开电脑IE浏览器,点击右上角设置--Internet选项--连接--局域网设置--代理服务器,勾选代理服务器,且进入高级设置中设置地址为127.0.0.1,端口号为Jmeter中的端口号,一致即可,建议8888,这样避免后续多次修改


    image

    image

  • 第三步:启动Jmeter

  • 第四步:安装证书给浏览器,打开浏览器--设置--管理证书--受信任的根证书颁发机构--导入,导入刚刚jmeter/bin中的ApacheJMeterTemporaryRootCA.crt即可,有效期7天,如7天后还要录制,该证书需要更换一次。教程已Google浏览器为例,上图启动Jmeter后,证书自动生成在Jmeter中的bin路径下(ApacheJMeterTemporaryRootCA.crt),附图:


    image

  • 第五步:操作页面,可以根据功能操作,一个模块多个接口放入线程组中的一个组内,至此录制已完成,如图:

3、设置全局断言和单个接口断言

  • 响应断言:线程组--右键新建断言--新建响应断言,设置main sample only,勾选响应头和忽略状态,模式匹配规则用包括即可,测试模式输入框输入200,该断言是断言录制的所有请求的HTTP响应码都为200,保障接口正常,但无法保障数据正常。遇到接口返回参数无规则(有时候list[0].type为1,有时候list[0].type为3,JSON提取器无法准确提取到值)的时候也可以使用该方法断言返回参数中的字符串,详情看图:


    image

  • JSON断言:线程组--xx组--xx接口--右键新建断言--新建JSON断言,因为每个接口返回的数据类型不一致,不好用全局断言,所以可以尝试单个接口断言,如A接口返回数据code:0,B接口返回数据code:1,表达式表达方法用代替接口返回的整个数据,然后使用JSON提取方法去JSON中的key,比如接口返回{"code":1,"total":2,"score":[100,90,80]},提取total的表达式就是.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的话就是秒级别并发,循环次数就是执行几次这个脚本,按需设置即可,接下来把这三个参数设置遍历,便于后续集成,线程数设置{threadNum}调用变量,ramp-up设置{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 + '&timestamp=' + 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")) + "推送成功")
    
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容