JMeter 简析

JMeter : 用于接口测试,简单接口自动化测试,也可做性能测试,主要用于服务端系统的性能测试

个人认为:要做自动化测试,最好使用代码来做,更加的灵活;

而使用JMeter来做一些性能测试相对合适

名词

测试计划:可理解为一个容器,存放所有的线程组,及存放的所有的测试内容,你的测试内容都基于测试计划

线程组

  • 常规线程组:常用的线程组,在线程组内实现主要的测试任务。

  • setUp线程组:在执行常规线程组(Thread Group)之前执行一些必要的操作,它会在常规线程组执行之前被触发。主要的应用场景有:

    • 测试数据库时,可以用来执行数据链接等操作
    • 获取前置数据,如依赖的token和cookies
  • teraDown线程组:用于在常规线程组完成后执行一些必要的操作,它会在常规线程组执行之后被触发。主要应用场景:

    • 如果关闭数据库连接
    • 处理其他善后操作

​ 与unittest自动化框架的前后置操作类似。

  • 线程属性
    • 线程数:并发用户数量,可以理解为虚拟用户数量;线程之间是互不影响的,线程A中修改的变量值,不会影响到线程B。
    • Ramp-Up时间(秒):设置启动所有线程所需要的时间。如,线程数设置为5,启动所有线程所需要的时间设置为1,意思为所有的线程要在1秒内启动完成。
    • 循环次数(不要勾选永远):设置线程组内个线程执行的次数。如果线程数设置为5,循环次数设置为2,那么线程组内的每个线程都会执行2次,所有线程执行了10次。
    • 永远:勾选该选项,测试计划就会一直执行下去。
    • same user on each iteration,每次迭代使用相同的线程,即线程复用,默认勾选即可。
    • 延时创建线程直到需要:勾选后,只有需要线程了才会创建。
    • 调度器,搭配永远选项使用,有的时候,要长时间对系统进行压测,那么就要勾选永远选项,并且为永远选项添加配置:
      • 持续时间(秒):如要对系统持续压测1小时,那么就要在此填写3600,在3600秒后结束执行。
      • 启动延迟(秒):设置线程启动延时时间,是指多少秒后才开始启动所有线程,但并不是说每个线程都延迟多少秒启动。

作用域

在jmeter中,各个元件(如察看结果树),所处的位置不同,它其作用的范围也不同,常见的作用域:

  • 取样器作用域:元件位于指定取样器下,它只作用于该取样器,应用场景:
    • 特定请求需要携带特殊的请求头的情况。
  • 线程组作用域,元件位于某个线程组内,跟取样器平台,它作用于当前线程组,应用场景:
    • 一个线程组内多个取样器依赖同样的请求头或者某一个参数,如token。
  • 测试计划作用域:元件位于测试计划下,跟线程组平级,那该元件的作用范围是所有线程组,应用场景:
    • 查看所有线程组的请求结果

HTTP请求默认值

将HTTP请求的一些公共变量提取出来,便于复用,简化参数配置

常用断言

  • 响应断言
  • 大小断言
  • json断言
  • beanshell断言
  1. 响应断言

    参数说明:

    Field to Test,断言的内容来自于:

    • Test Response响应体
    • Response Code响应状态码
    • Response Message响应信息
    • Response Headers响应头
    • Request Headers请求头
    • Request Data请求体
    • URL Sampled请求的URL

    Patterns Matching Rules,断言(匹配)规则:

    • Container:响应文本中是否包含某个字段值,支持正则
    • Matches:响应文本是否完全匹配预期值,支持正则
    • Equals:响应文本是否完全匹配预期值,不支持正则
    • Substring:响应文本中是否包含某个字段值,不支持正则

    Patterns to Test,编写你的断言

    Custom failure message,自定义的断言失败信息

  2. 大小断言

    根据响应返回有字节数进行大小比较来断言

  3. json断言

    根据json路径及值的判断,示例$.xx.xx

  4. beanshell断言

    写一些简单的判断来进行断言

参数化

jmeter内置了很多函数来供我们使用,比如:

  • 随机数函数系列
  • 加密
  • 时间戳函数
  • UUID

使用函数助手生成函数,在需要的地方进行引用

前后置处理器

处理请求发送之前响应之后要做的处理

前置处理器

  • 用户参数

后置处理器

  • json提取器
  • 正则表达式提取器
  • beanshell处理器

前置处理器(Pre Processors)常用来在请求之前提前作一些处理,常见的前置处理器有:

  • 在请求中,携带一些参数
  • HTML链接解析器
  • HTTP URL重写修饰符
  • JDBC预处理程序,链接数据库
  • BeanShell预处理程序,可以通过编写脚本来说处理更为复杂的操作。

在前置处理器中,最常用的是JDBC和BeanShell两个处理器

后置处理器常用来从响应中提取数据用作它用,主要包括:

  • json提取器:当响应体的数据类型是json时,用json提取器相当方便。
  • 正则表达式提取器:正则表达式提取器比json提取器更加的灵活、强大,适用于各种复杂的场景中。
  • beanshell处理程序:暂时理解为我们可以他通过编写脚本来完成更加复杂的操作。

逻辑控制

JMeter中的逻辑控制器大体分为两类:

  • 控制测试计划执行过程中线程执行的顺序,如循环控制器、if控制器等。
  • 对测试计划中的脚本进行分组,方便jmeter统计执行结果以及进行脚本的运行控制等,如简单控制器、吞吐量控制器、事务控制器等。

相当于编程中的分支、循环、判断…

聚合报告

“聚合报告”展示了一次执行的所有的接口请求信息,并且还展示事务的执行情况,细心如你一定发现了,事务的结果在某些选项上来自于其内的接口的值的和。各参数的意思如下:

  • label展示了被压测的接口。
  • 样本(Samples):表示总请求数,也就是在单位时间内,一共发出了多少个请求。
  • 平均响应时间(Average):平均响应时间。
  • 中位数,表示响应时间取中间值。
  • 90%百分位:表示90%的接口响应时间低于某个值。
  • 95%百分位:表示95%的接口响应时间低于某个值。
  • 99%百分位:表示99%的接口响应时间低于某个值。
  • 最小值(Min):最小响应时间。
  • 最大值(Max):最大响应时间。
  • 异常(error):错误率,计算公式是错误的请求数量 / 请求总数
  • 吞吐量(throughput):默认情况下,表示每秒完成的请求数(request per second),在jmeter中吞吐量等于tps。
  • 接收KB/sec:每秒从服务端接收的数据量。
  • 发送KB/sec:每秒向服务端发送的数据量。
  • 保存表格数据:将数据以csv形式保存到本地

定时器

在默认情况下,jmeter发送每个请求的间隔极短,如果线程数足够大,瞬间就会将服务器压死

在jmeter中,定时器组件提供了系列不同类型的延时控制。合理使用定时器组件,能让你的性能测试更接近真实,更能挖掘出系统的瓶颈和评估系统的性能指标。

基本规则:在每个采样器(sampler)之前去执行,也就是定时器的作用域:

  • 定时器是在每个采样器(sampler)之前执行的,而不是之后(无论定时器位置在采样器(sampler)之前还是下面)。
  • 当执行一个采样器(sampler)之前时,所有当前作用域内的定时器都会被执行。
  • 如果希望定时器仅应用于其中一个采样器(sampler),则把定时器作为子节点加入

同步定时器

使用同步定时器来测试并发场景

集合点用于同步虚拟用户恰好在某一时刻执行任务,确保用户更准确、集中的进行某个指定操作,达到更理想的负载模拟效果,更有针对性地对某个可能存在性能问题的模糊或子系统施压,以便找到性能瓶颈

“同步定时器”的作用域:

  • 如果它位于线程组内,跟其他请求同级,则所有的请求都会受此影响。
  • 如果它位于指定的请求内,则只作用于该请求,不影响线程组内的其他请求

常见性能测试场景

1.弱压力测试

有时间范围限制,设置Ramp-Up时间;添加聚合报告查看性能分析报告

2.高并发

模拟各种正常的,峰值的测试环境,检测程序的各项性能指标是否能够达标

添加同步定时器, 多少用户在线程数里去设置,然后对同步定时器里模拟的用户组数量进行设置,来表明每组多少人,超时时间不要为0;添加聚合报告查看性能分析报告

3.高频率

QPS:每秒查询数

循环次数 = 访问频率 * 持续时间

有频率的访问,添加常量吞吐量定时器,多少用户在线程数里去设置,设置目标吞吐量每分钟多少次,根据QPS或其他时间以及执行次数计算设置循环次数;添加聚合报告查看性能分析报告

都看到这里了,不赏点银子吗^v^