美文网首页
Jmeter+Jenkins实现接口自动化的持续集成

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

作者: 三观正_1e5f | 来源:发表于2021-03-25 09:27 被阅读0次

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

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

  • Jmeter

  • Tomcat+Jenkins

  • Python

2、Jmeter录制脚本

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

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

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

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

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

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

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

    image
    image
    image
  • 第三步:启动Jmeter

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

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

    image

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

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

    image
    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],如图:

    image

4、设置测试报告

  • 察看结果树:线程组--右键新建监听器--新建察看结果树,该监听器功能便于查看请求参数、返回参数及断言结果,利于debug。也可以设置单个接口或者单个组,建议设置全局,即线程组--察看结果树,可以勾选仅错误日志,这样只有断言不通过的才会出现在这,断言通过的会被过滤掉,文件名中可以输出三种报告,其中jtl(转html报告用),csv(python提取数据,进行过滤用),xml(不太好看),推荐jtl,这样便于集成jenkins,如图:

    image
  • 用表格察看数据:该功能可以查看接口发出时间等,可以更直观的查看接口并发的情况

  • 聚合报告:可以用来查看接口并发的时间,耗时等,接口并发用较好

  • 汇总报告:接口并发用较好,做自动化的话可以不用加这个

5、HTTP信息头管理器

  • 全局信息头管理器:可以在线程组中直接添加一个信息头管理器,后续所有接口都会拿到该信息头,需要加上,若后续接口需要获取登录接口的token的话,可以在信息头管理器中调用变量,这个变量用JSON提取器或者正则表达式提取器从登录接口获取(一般来说),引用名称就是后面调用的变量,比如名称叫auth_token,后面信息头管理器中调用的话就是${auth_token},所有的接口,存在关联参数的话都可以通过JSON提取器和正则表达式提取器获取

    image

    image
  • 局部信息头管理器:录制脚本的时候不要勾选,不然会在每一个接口中生成一个HTTP信息头管理器,这样会增加内存消耗,建议统一使用线程组中的HTTP信息头管理器

6、CSV数据文件设置

  • 域名、账号、密码等动态数据(换个人使用或者换个环境运行的话就要替换域名),可以线程组--右键新建配置元件--csv data set config,文件名即存放txt的路径,编码使用utf-8,变量名称自己任意取,后面根据取的变量调用,多个变量之间使用英文逗号隔开,分隔符使用英文逗号,后面的默认选项即可,需要几个自己控制,比如域名只需要传递www.baidu.com,前缀的https在接口处已经存在,所以不用传递,变量调用方法还是${变量名},如图:

    image

    image

    image

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集成的步骤。

    image

8、Jenkins

  • 搭建虚拟机、Linux,安装Tomcat,部署Jenkins,步骤省略。因为Jmeter依赖jdk,所以Windows/Linux中还需要安装JDK和Jmeter,以及环境变量,步骤省略。进入Jenkins插件管理中找到和安装对应的插件(HTML report、dingtalk等),安装完毕后进入配置中配置钉钉机器人的参数,步骤省略,附图:

    image
  • 新建item,勾选机器人,设置运行空间,构建触发器设置(定时、token、gitlab、github等),构建,以及构建后的报告,如图:

    image

    image

    image

    image

    image

    image

9、Python筛选、过滤数据

  • 如遇到报告接口数据过多,可搭配CSV报告进行数据的提取,去重、拼接,以及推送钉钉,如图:

    image
  • 钉钉机器人代码已经封装好了,比较简单,可以直接导入和调用,也可以自己写,代码复制在下面:

    # -*- 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")) + "推送成功")
    
    

相关文章

网友评论

      本文标题:Jmeter+Jenkins实现接口自动化的持续集成

      本文链接:https://www.haomeiwen.com/subject/vmqrhltx.html