自学内容网 自学内容网

性能测试-JMeter(1)

主流性能测试工具

Loadrunner

  • HP Loadrunner是一种工业级标准性能测试负载工具,可以模拟上万用户实施测试,并在测试时可实时检测应用服务器及服务器硬件各种数据,来确认和查找存在的瓶颈
  • 支持多协议:Web(HTTP/HTML)、Windows Sockets、FTP、ODBC、MS SQL Server等协议
  • 采用C语言编写
  • 优点
    • 多用户(支持用户以万为单位)
    • 详细的分析报表(以秒为单位)
    • 支持IP欺骗功能
  • 缺点
    • 收费
    • 体积庞大(安装包单位GB)
    • 无法定制功能

JMeter

  • JMeter是Apache组织开发的基于Java的开源软件,用于对系统做功能测试和性能测试
  • 它最初被设计用于Web应用测试,但后来扩展到其他测试领域,例如静态文件、Java程序、shell脚本、数据库、FTP、Mail等
  • 优点
    • 开源免费
    • 小巧(安装包50MB左右)
    • 丰富的学习资料和扩展组件
  • 缺点
    • 不支持IP欺骗
    • 分析和报表能力相对于LR欠缺精度(以分钟为单位)

JMeter环境安装

1、安装JDK
2、安装JMeter(JMeter版本与JDK版本匹配)
安装好后,进入JMeter安装目录下的bin目录【以下任意一种方式打开】
1)双击jmeter.bat
2)双击ApacheJMeter.jar
3)命令行输入:java -jar ApacheJMeter.jar

JMeter功能概要

JDK常用文件目录介绍

  • Bin目录:存放可执行文件和配置文件
    • jmeter.bat——windows的启动文件【重要】
    • jmeter.log——Jmeter工具运行的日志文件
    • jmeter.properties——Jmeter工具的配置文件【重要】
    • jmeter.sh——linux的启动文件
    • jmeter-server linux分布式测试的启动程序
    • jmeter-server.bat windows分布式测试的启动程序
  • docs目录:是JMeter的api文档,用于开发扩展组件
  • printable_docs目录:用户帮助文档
    • 用户手册路径:…\apache-jmeter-5.6.3\printable_docs\usermanual\index.html
  • lib目录:存放JMeter依赖的jar包和用户扩展所依赖的jar包

JMeter元件和组件介绍

元件的基本介绍

  • 元件:多个类似功能组件的容器(类似于
    jmeter元件
    • 取样器:发送请求
    • 逻辑控制器:控制语句的执行顺序
    • 前置处理器:对请求参数进行预处理
    • 后置处理器:对响应结果进行提取
    • 断言:检查接口的返回结果是否与预期结果一致
    • 定时器:设置等待
    • 测试片段:封装一段代码,供其他脚本调用
    • 配置元件:测试数据的初始化配置
    • 监听器:查看JMeter脚本的运行结果

组件的基本介绍

  • 组件:实现独立的某个功能(类似于方法)

    如:取样器的组件
    jmete取样器下的组件

(1)如下接口自动化脚本的实现过程对应着Jmeter哪个元件?

  1. 初始化测试数据——配置元件
  2. 对请求参数化赋值——前置处理器
  3. 调用GET/POST方法发送请求——取样器
  4. 提取响应中特定字段的值——后置处理器
  5. 对提取出来的值与预期结果进行对比——断言
  6. 在控制台查看脚本运行的结果——监听器
    (2)元件与组件有什么关系?
    元件:多个类似功能组件的容器(类似于
    组件:容器中实现独立的某个功能(类似于方法

JMeter元件作用域和执行顺序

元件的作用域:是靠测试计划的树形结构中元件的父子关系来确定的
提示:所有的组件都是以取样器为核心来运行的。组件添加的位置不同,生效的取样器也不同。

  • 作用域的原则
    • 取样器:核心,不和其他元件相互作用,没有作用域
    • 逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用
    • 其他元件:
      • 如果是某个取样器的子节点,则该元件只对其父节点起作用
      • 如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点、子节点的子节点等)
  • 元件的执行顺序
    • 同一个作用域下不同类型元件:
    1. 配置元件
    2. 前置处理程序
    3. 定时器
    4. 取样器
    5. 后置处理程序
    6. 断言
    7. 监听器

JMeter第一个案例

需求:使用JMeter访问百度首页接口,并查看请求和响应信息
步骤:

  1. 启动JMeter
  2. 在’测试计划’下添加’线程组’
  3. 在’线程组’下添加’HTTP请求’取样器
  4. 填写’HTTP请求’的相关请求数据
  5. 在’线程组’下添加’查看结果树’监听器
  6. 点击’启动’按钮运行,并查看结果
    案例

线程组

作用:线程组就是控制Jmeter用于执行测试的一组用户
位置:右键点击‘测试计划’ --> 添加 --> 线程(用户) --> 线程组
【特点】

  • 模拟多人操作
  • 线程组可以添加多个,多个线程组可以并行或串行
  • 取样器(请求)和逻辑控制器必须依赖线程组才能使用
  • 线程组可以添加其他元件下组件

【线程组分类】

  • 线程组:普通的、常用的线程组,可以看作一个虚拟用户组,线程组的每一个线程都可以理解为一个虚拟用户
  • setUp线程组:一种特殊类型的线程组,可用于执行预测试操作
  • tearDown线程组:一种特殊类型的线程组,可用于执行测试后工作

【参数详解】
线程组-参数详解
如下场景如何设置线程组?

  • 模拟10个用户并行执行——线程数10
  • 模拟10个用户5s内启动完成——线程数10,ramp-up时间:5s
  • 模拟2个用户各循环3次——线程数2,循环次数2
  • 模拟2个用户运行30s——线程数2,循环永远,持续时间30s
  • 模拟2个用户等待10s后开始执行——线程数2,循环永远,启动延迟10s

案例分析:

  • 使用1个线程组,添加http请求
    • 配置线程数为2,循环次数为3时,运行观察结果
    • 配置线程数为3,循环次数为2时,运行观察结果,对比不同

分析:

  • 线程数代表虚拟用户数,用户数越多,负载越大
  • 循环次数代表运行时间,次数越多,运行时间越长

HTTP请求

作用:向服务器发送http及https请求
位置:选中线程组 --> 右键 --> 添加 --> 取样器 --> HTTP请求
参数:
HTTP请求参数设置
【练习】编写Jmeter脚本,访问百度
案例一:GET请求,URL为http://www.baidu.com/S?wd=test
要求:使用HTTP请求—路径来传递get请求参数
在这里插入图片描述

案例二:GET请求,URL为https://www.baidu.com/S?wd=test
要求:使用HTTP请求—参数列表来传递get请求的参数
在这里插入图片描述

案例三:POST请求,URI为https://www.baidu.com/S,请求体为:wd=test(form表单
要求:使用HTTP请求—参数列表来传递POST请求的form格式参数
在这里插入图片描述

案例四:POST请求,URL为http://www.baidu.com/S,请求体为:wd=test(form表单)要求:使用HTTP请求—消息体数据来传递POST请求的form格式参数
在这里插入图片描述

查看结果树

作用:查看http请求的请求和响应结果
位置:选中测试计划/线程组 --> 右键 --> 添加 --> 监听器 --> 查看结果树
组成:

  • 取样结果:查看响应信息头信息、响应状态码
  • 请求:查看请求相关信息(url、方法、参数)
  • 响应:查看响应信息

若结果出现乱码,解决方法:
1、找到jmeter安装目录下的bin目录
2、打开jmeter.properties文件,修改配置sampleresult.default.encoding=UTF-8
3、重启jmeter即可
【新版默认就是utf-8】

JMeter参数化(重点)

参数化测试:把测试数据组织起来,用不同的测试数据调用相同的测试方法
本质:实现测试数据与测试方法的分离

  • JMeter中常见的参数化方式:
    • 用户定义的变量——全局变量
    • 用户参数——为每个用户分配不同的参数值
    • CSV Data Set Config——文件方式参数化
    • 函数——随机数据
    • 数据库

用户定义的变量

作用:定义全局变量
位置:测试计划 --> 线程组 --> 配置元件 --> 用户定义的变量
【练习】
请求:https://www.baidu.com:443
要求:使用用户定义的变量配置被测系统的协议、域名和端口
在这里插入图片描述
在这里插入图片描述

用户参数

作用:针对同一组参数,当不同的用户来访问时,可以获取到不同的值
位置:测试计划 --> 线程组 --> 前置处理器 --> 用户参数
【练习】
请求:https://www.baidu.com
要求:第一个用户请求附带参数:name=“张三"&age=28;第二个用户请求附带参数:name=“李四”&age=30
操作步骤:
1、添加线程组,线程数设置为2
2、添加用户参数
3、添加HTTP请求
4、添加查看结果树
在这里插入图片描述
在这里插入图片描述

CSV数据文件设置

作用:让不同用户在多次循环时,可以取到不同的值
位置:测试计划 --> 线程组 --> 配置元件 --> CSV数据文件设置
在这里插入图片描述
【练习】
请求:https://www.baidu.com
要求:循环请求3次,每次请求时附带参数username,password,code的值不相同
操作步骤:
1、定义CSV数据文件
2、添加线程组,设置循环次数为3
3、添加CSV数据文件设置
4、添加HTTP请求
5、添加查看结果树
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

函数(__counter)

作用:计数函数,一般做执行次数统计使用
位置:在菜单中选择 --> 选项(工具) --> 函数助手对话框
在这里插入图片描述
【练习】
请求:访问百度首页 http://www.baidu.com/s?num=1
要求:每个用户每次循环执行该脚本都可以使用不同的值
操作步骤:
1、添加线程组,设置虚拟用户数和循环次数
2、生成__counter函数
3、添加HTTP请求,使用__counter函数
4、添加查看结果树
在这里插入图片描述

小结

  • 什么是参数化?
    • 把测试数据组织起来,用不同的测试数据调用相同的测试方法
  • 4种参数化方式有何不同?如何选择适当的方式?
    • 用户定义的变量
      • 作用:定义全局变量
      • 局限性:每次取值(无论是否相同的用户)都是固定值
    • 用户参数
      • 作用:保证不同的用户针对同一组参数,可以取到不同的值
      • 局限性:同一个用户在多次循环时,取到相同的值
    • CSV数据文件设置
      • 作用:保证不同的用户及同一用户多次循环时,都可以取到不同的值
      • 局限性:需要手动进行测试数据的设置
    • 函数
      • 作用:保证不同的用户及多次循环时,都可以取到不同的值,不需要提前设置
      • 局限性:输入数据有特定的业务要求时无法使用(如:登录时的用户密码)

【案例】
某支付系统,需要1000个不同的用户登录,并使用添加不同的测试金额数据访问支付接口?
答案:
1、准备CSV数据文件——1000个登录的用户名密码
2、添加线程组
3、添加CSV数据文件设置
4、添加HTTP请求——登录,使用读取的用户名密码
5、添加HTTP请求——支付,使用counter函数添加不同的测试金额
6、查看结果树


原文地址:https://blog.csdn.net/zxcvbnm_1206/article/details/142728087

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!