接口测试——精通JMeter测试工具

2023-12-20 15:40:30

前言

Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。

JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。

一、JMeter工具介绍

Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。

JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。

二、JMeter工具下载及安装

安装java环境,因为JMeter工具是基于java开发的(安装JDK)

JMeter工具下载与安装

三、JMeter的目录介绍

  • backups目录:备份脚本(没有写脚本没有此目录)
  • bin目录:模板,主要jar包,启动文件,jmeter.properties全局配置文件。jmeter-server.bat分布式压测
  • extras目录:存放和集成第三方的一些文件
  • lib目录:存放jar包

在这里插入图片描述

四、JMeter常用组件以及作用域

1.常用的组件以及执行顺序

  • (1)测试计划:JMeter启动,其它组件的容器
  • (2)线程组(测试片段):代表一定虚拟用户数,测试片段代表模块
  • (3)配置元件:配置信息
  • (4)前置处理器:请求之前的操作
  • (5)逻辑控制器:控制请求
  • (6)定时器:控制延迟请求
  • (7)取样器:发送请求
  • (8)后置处理器:请求之后的操作
  • (9)断言:判断结果是否正常
  • (10)监听器:收集和查看结果

2.常用的组件(元件)的作用域

  • 组件可以作用于父组件
  • 组件可以作用于同级组件
  • 组件可以作用于同级组件的子组件

五、使用JMeter执行接口测试

1.测试计划

在这里插入图片描述

  • 线程组之间在执行是没有顺序。如果希望线程按顺序执行,则需要勾上【独立运行每个线程组】

    在这里插入图片描述
    在这里插入图片描述

  • 勾上【独立运行每个线程组】以后,线程组按顺序执行

    在这里插入图片描述

2.线程组

在这里插入图片描述

  • 线程组:

    在这里插入图片描述

  • setUp 线程组中的请求会在所有请求之前执行,tearDown 线程组中的请求会在所有请求之后执行

    在这里插入图片描述
    在这里插入图片描述

3.测试片段

在这里插入图片描述

  • 测试片段:可以理解为是特殊的线程组,和线程组同级别。用于多个测试之间协同做接口测试。主要是和模块控制器以及Include控制结合使用

  • 使用情况:

    • 接口数量不多,一个人就可以完成 —— 可以使用 线程组
    • 接口数量巨大,需要多个测试协同测试 —— 可以使用 测试片段 + 线程组
  • 特点:

    • 1.默认是禁用状态

      在这里插入图片描述

    • 2.单个测试片段无法执行,需要结合模块控制器(自己调试)以及Include控制器(leader-领导)执行

      • 单个测试调试

        在这里插入图片描述
        在这里插入图片描述

      • 多个测试调试:多个测试片段需要配合多个模块控制器使用

        在这里插入图片描述

  • 组员如何保存测试片段:选中要保存的测试片段→鼠标右击→选中部分保存为

    在这里插入图片描述

  • 模拟Leader调试组员的测试片段

    创建一个 “线程组” → 线程组中创建一个 “Include控制器” → 浏览文件 "选择组员的保存的测试片段→创建 “查看结果树” → 运行查看结果

    在这里插入图片描述
    在这里插入图片描述

4.HTTP请求默认值

  • HTTP请求默认值:设置一次,其他接口可以进行调用
  • http协议端口:80
  • https协议端口:443

在这里插入图片描述
在这里插入图片描述

5.HTTP Cookie管理器

  • HTTP Cookie管理器:自动的处理有cookie关联的接口

    在这里插入图片描述

六、JMeter关联接口测试

什么是关联接口:一个接口的返回值会作为另外一个接口的入参

1.正则表达式提取器

在这里插入图片描述

  • 正则表达式提取器:左边界和右边界不能缺失,如果有特殊字符必须用 “\” 转义符

  • 关联接口如何进行接口测试:把接口返回值当做一个变量

  • 返回值如何进行设置到对应变量:

    • 正则表达式提取器:对文本进行提取
      • 匹配字符串中特定字符的字符串
      • 正则表达式包含字符 + 限定符
      • 正则表达式写法:左边界 + (. + ?) + 右边界
      • 如何调用变量:${变量名}
      • 万能正则表达式:.*?
  • 基本用法:

    • 自定义名称
    • 正则表达式
    • 使用第一个正则表达式取匹配值
    • 匹配数字:0代表随机,1代表取第一个值,-1代表取所有的值
    • 默认值:没有匹配到使用默认值

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 多个值的用法:

    在这里插入图片描述
    在这里插入图片描述

2.边界值提取器

在这里插入图片描述

  • 基本用法

    在这里插入图片描述
    在这里插入图片描述

3.JSON提取器

在这里插入图片描述

  • 了解JSON语法:
    • (1) $ 根节点

    • (2) .键名["键名"] 去子节点

      在这里插入图片描述
      在这里插入图片描述

    • (3)如果是数组(llist),则通过下标取值

      在这里插入图片描述
      在这里插入图片描述

    • (4)相对路径用法:$..键名 这里的name一般需要唯一

      在这里插入图片描述

    • (5)列表切片:$.tags[0:2]$.tags[开始下标:结束下标] 取值包括开始下标的值,不包括结束下标的值)

      在这里插入图片描述

总结:看到字典则用.看到列表则用[0]下标,下标从0开始。

  • JSON提取器基本用法

    在这里插入图片描述

    在这里插入图片描述

4.Xpath提取器

在这里插入图片描述

  • web自动化里面的定位,一般用于返回html网页时

七、JMeter不同参数的接口测试

  • 参数:表单键值对,表格。
    在这里插入图片描述
    在这里插入图片描述

  • 消息体数据:JSON数据,以 {}[] 组成的数据

    在这里插入图片描述
    在这里插入图片描述

  • 文件上传:文件

    在这里插入图片描述
    在这里插入图片描述

八、JMeter动态参数接口测试

  • 工具 → 函数助手对话框

    在这里插入图片描述

1.随机数字函数

  • 函数:Random
    在这里插入图片描述
    在这里插入图片描述

8.2.随机字符串函数

  • 函数:RandomString
    在这里插入图片描述
    在这里插入图片描述

3.随机时间戳函数

  • 函数:time
    在这里插入图片描述
    在这里插入图片描述

4.其他函数

  • 函数:BeanShell(将小写字母变成大写)

  • 函数:javaScript(将小写字母变成大写)

  • 先使用随机字符串函数生成一个3位随机小写字母 → 然后使用BeanShell函数或者javaScript函数将小写字母变成大写

    #随机字符串函数生成3位随机小写字母
    ${__RandomString(3,abcdefghijklmnopqrstuvwxyz,)}
    #BeanShell函数将小写变成大写
    ${__BeanShell("${__RandomString(3,abcdefghijklmnopqrstuvwxyz,)}".toUpperCase(),)}
    #javaScript函数将小写变成大写
    ${__javaScript("${__RandomString(3,abcdefghijklmnopqrstuvwxyz,)}".toUpperCase(),)}
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

九、JMeter调试文件上传接口

  • 文件的类型
    在这里插入图片描述

十、JMeter接口测试常规断言和数据库断言

在这里插入图片描述

1.常规断言

1.1.响应断言

在这里插入图片描述

1.2.JSON断言

在这里插入图片描述
在这里插入图片描述

1.3.BeanShell断言(一般用在数据库断言中)

  • 主要通过Failure标识是否失败和FailureMessage标识失败信息。Failure=true 失败,Failure=false 成功

    //注释:断言返回的状态码为200
    if("200".equals(""+ResponseCode)){
    	Failure = false;
    	FailureMessage = "断言状态码为200成功!";
    }else{
    	Failure = false;
    	FailureMessage = "断言状态码不为200失败,返回的状态码为:"+ResponseCode;
    }
    		
    //注释:断言返回的结果中包含有某一个字符串
    //获取返回的结果
    var result = prev.getResponseDataAsString();
    if(result.contains("星标组")){
    	Failure = false;
    	FailureMessage = "断言返回结果包含[星标组]成功!";
    }else{
    	Failure = false;
    	FailureMessage = "断言返回结果不包含[星标组]失败,返回的信息为:"+result;
    }
    

    在这里插入图片描述

2.数据库断言

  • 数据库断言使用

    1.在测试计划中引入数据库驱动jar包或将数据库驱动jar包拷贝到JMeter安装目录中的lib目录中

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.新建:JDBC Connection Configuration

    在这里插入图片描述
    在这里插入图片描述

    3.新建:JDBC Request

    在这里插入图片描述
    在这里插入图片描述

    4.使用BeanShell断言实现数据库断言

    //获取数据库查询的数据
    //name = 星标组
    String name = vars.getObject("result").get(4).get("name");
    //打印查看信息
    log.info(name);
    
    var result = prev.getResponseDataAsString();
    if(result.contains(name)){
    	Failure = false;
    	FailureMessage = "断言返回结果包含" + name + "成功!";
    }else{
    	Failure = false;
    	FailureMessage = "断言返回结果不包含" + name + "失败,返回的信息为:"+result;
    }
    

    在这里插入图片描述
    在这里插入图片描述

十一、JMeter参数化(用于实现正例和反例)

  • 参数化:用不同的测试数据对同一个接口进行循环测试(用于实现正例和反例)

1.CSV参数化(CSV 数据文件设置)

  • CSV参数化(CSV 数据文件设置)使用

    1.准备一个csv数据文件,按照测试接口需求填写准备对应的数据

    在这里插入图片描述

    2.新建一个 “CSV 数据文件设置” → 填写对应的信息

    在这里插入图片描述
    在这里插入图片描述

    3.调用 “CSV 数据文件设置” 里面的变量

    在这里插入图片描述

    4.创建一个 “响应断言”(断言响应返回的数据是否跟CSV数据文件里面设置的断言结果相同) → 调用CSV数据文件里设置的断言结果变量

    在这里插入图片描述

    5.创建一个 “循环控制器” → 将测试的接口放到循环控制器中

    在这里插入图片描述
    在这里插入图片描述

    6.查看执行结果

    在这里插入图片描述

注意:如果有接口关联,后面的接口需要用到前面接口的数据,那么就要把与预期结果相同的数据放到CSV数据文件的最后,避免后面关联的接口获取不到前面的数据

十二、JMeter跨线程组实现接口关联

对第2个接口做基准(压力)测试,但是第二个接口又依赖于第一个接口,那么把他们放到同一个线程组测试则相当于是对两个接口进行测试,而不是单独对第2个接口进行测试,造成测试不准确

在这里插入图片描述

  • 跨线程组实现接口关联

    1.线程组1中的接口使用了JSON提取器提取了接口返回数据中某个键的值

    在这里插入图片描述
    2.线程组1中的接口新建一个 “BeanShell 后置处理程序”

    在这里插入图片描述

    3.使用 “函数助手对话框” 中的 "setProperty"函数 (如图所示进行操作) → 复制生成的函数字符串 → 在 “函数助手对话框” 中使用setProperty函数生成的函数字符串

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4.使用 “函数助手对话框” 中的 "property"函数 (如图所示进行操作) → 复制生成的函数字符串

    在这里插入图片描述
    在这里插入图片描述

    5.调用"property"函数生成的函数字符串

    在这里插入图片描述

    6.勾选 “独立运行每个线程组” (因为线程组之间在执行是没有顺序,不勾选可能会导致线程2比线程1先执行,就会导致结果错误)

    在这里插入图片描述

    7.查看测试结果

    在这里插入图片描述

注意:在测试计划中需要勾选上【独立运行每个线程组】

十三、JMeter跨线程组实现Cookie关联

  • 同一个线程:可以增加HTTP Cookie管理器就可以自动化管理

  • 如果是跨线程:

    • 1.(可以按照上面的跨线程组实现接口关联方式先操作,操作完成后执行下面步骤)

    • 2.修改JMeter安装目录下的bin目录中的 “jmeter.properties” 配置文件(修改如图所示——配置完成后关掉命令提示符及JMeter工具,然后重启JMeter)

      CookieManager.save.cookies=True
      

      在这里插入图片描述

    • 3.查看如下图所示两个地方的Cookie值,如果两组数据一致表示Cookie值百分百正确,如果两组数据不一致,取数据多的那一组

    在这里插入图片描述
    在这里插入图片描述

    • 4.从调试取样器中取得Cookie的值并在 “BeanShell 后置处理程序” 中设置为全局变量

      注意:变量名不能随便取,必须和响应头里面的变量名一致

      在这里插入图片描述
      在这里插入图片描述

    • 5.将 “BeanShell 后置处理程序处理器” 中设置的全局变量添加到 “HTTP Cookie管理器” 中

      在这里插入图片描述
      在这里插入图片描述

    • 6.将关联的接口实现Cookie关联

      在这里插入图片描述
      在这里插入图片描述

十四、JMeter工具其他常用组件

  • 调试取样器
    在这里插入图片描述

  • 固定定时器

    在这里插入图片描述

  • 用户定义的变量

    在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_44904239/article/details/135092413
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。