资料来源:https://www.bilibili.com/video/BV1wC4y1Y7yX?p=3
image.png

一、性能测试概述

image.png

1、性能测试概念

  1. 什么是性能:
    1. 时间:系统处理用户请求的响应时间
    2. 资源:系统运行过程中,系统资源的消耗情况
  2. 什么是性能测试:
    1. 使用自动化工具,模拟不同的场景,对软件各项性能指标进行测试和评估的过程
  3. 性能测试的目的:
    1. 评估当前系统能力
    2. 寻找性能瓶颈,优化性能
    3. 评估软件是否能够满足未来的需要

image.png
image.png
image.png

2、性能测试和功能测试

一般项目中,先功能测试通过后,再进行性能测试。
image.png

3、性能测试策略(分类)

3.1 基准测试

  1. 什么是基准测试
    1. 狭义上讲:就是单用户测试。(单用户循环多次得到的数据
    2. 广义上讲:建立基准线,当系统的软硬件环境发生变化之后再进行一次基准测试以确定变化对性能的影响
  2. 基准测试数据的作用:
    1. 基准测试不会单独存在
    2. 为多用户并发测试和综合场景测试等提供参考依据
    3. 为系统/环境配置、系统优化前后的性能提升/下降提供参考指标

image.png
image.png

3.2 负载测试

  1. 概念:
    1. 通过逐步增加系统负载,确定在满足系统的性能指标(如响应时间等)情况下,找出系统所能够承受的最大负载量的测试
  2. 作用:
    1. 系统最大负载量达到用户要求时,系统才能正式上线使用
  3. 注意:
    1. 通过负载测试,可以确定系统的最大负载量极限负载量
    2. 系统对外宣称的最大负载量
    3. 负载测试的时间一般为1-2小时

image.png
image.png

3.3 稳定性测试

  1. 概念:
    1. 在服务器稳定运行(用户正常的业务负载下)的情况下进行长时间测试(1天 - 1周等),并最终保证服务器能满足线上业务需求
  2. 作用:
    1. 系统在用户要求的业务负载下运行达到规定的时间时,系统才能正式上线使用

image.png
image.png
image.png
image.png

3.4 其他分类

3.4.1 压力测试

  1. 概念:
    1. 在强负载下的测试,查看系统在峰值情况下是否功能隐患、系统是否具有良好的容错能力和可恢复能力
  2. 测试场景:
    1. 极限负载情况下的破坏性压力测试
    2. 高负载下的长时间的稳定性压力测试
  3. 分类:
    1. 高负载下的长时间稳定性压力测试(如: B-C区间内进行24/3*24小时长时间测试)
    2. 极限负载下的破坏性压力测试(如: C-D区间内进行测试)

image.png
image.png

3.4.2 并发测试

  1. 概念:
    1. 并发测试(绝对并发):是指在极短的时间内发送多个请求,来验证服务器对并发的处理能力
  2. 应用场景:
    1. 特定活动场景,如:抢红包、秒杀、抢购等
  3. 与负载测试对比:
    1. 负载测试(相对并发):主要目的是测试高负载情况下,对系统资源的消耗,是否会耗尽的问题(双11活动)
    2. 并发测试(绝对并发):主要目的是测试极短时间内,并发请求时,系统资源争抢的问题(抢红包、秒杀)

image.png

3.5 性能测试策略总结

  1. 基准测试:
    1. 建立基准,系统环境变化后对比确定对性能的影响。不会单独存在,为综合场景测试提供参考依据
  2. 负载测试:
    1. 逐步增加负载,找到满足系统性能指标情况下的系统最大负载量(也可以找出极限负载量)
  3. 稳定性测试:
    1. 用户正常负载下的长时间测试,保证系统长时间稳定运行
  4. 并发测试:
    1. 极短的时间内,发送大量请求,验证并发处理能力
  5. 压力测试:

    1. 高负载下,查看系统在峰值情况下的容错能力和可恢复能力

      4、性能测试的指标

      4.1 响应时间

    2. 指从客户端发起请求开始,到客户端接收到结果的总时间

    3. 包括:服务器处理时间 + 网络传输时间

image.png
image.png

4.2 并发用户数

某一时刻同时向服务器发送请求的用户数。
image.png

4.3 吞吐量

image.png

4.4 QPS

image.png

4.5 TPS

一个业务请求就是一个事务请求。
image.png
image.png

4.6 点击数

image.png

4.7 错误率

image.png
注意:
错误率是性能指标,是高负载下的失败业务的概率
随机bug是功能bug,先解决随机bug才能进行性能测试

4.8 资源利用率

  1. 什么是资源利用率?
    1. 系统各种资源的使用情况,资源的使用量/总的资源可用量 * 100%
  2. 常见资源指标有哪些
    1. CPU使用率:不高于75% - 85%
    2. 内存(大小)使用率:不高于80%
    3. 磁盘IO(速率):不高于90%
    4. 网络(速率):不高于80%

image.png

4.9 总结

  1. 响应时间:
    1. 指从客户端发起请求开始,到客户端接收到结果的总时间。
    2. 包括:服务器处理时间 + 网络传播时间
  2. 并发数:
    1. 某一时刻同时向服务器发送请求的用户数
  3. 吞吐量:
    1. 指的是单位时间内处理的客户端请求数量,直接体现软件系统的性能承载能力。TPS(每秒事务数)、QPS(每秒请求数)
  4. 点击数:
    1. 所有的页面元素(如:图片、链接、框架等)的请求总数量
  5. 错误率:
    1. 指系统在负载情况下,失败业务的概率
  6. 资源利用率:

    1. 系统各种资源的使用情况,资源的使用量/总的资源可用量 * 100%

      5、性能测试的流程

      image.png
      性能测试的核心:需求分析、性能测试执行、性能分析调优
      需要大家掌握:性能测试执行

      5.1 需求分析

      image.png

      5.2 性能测试计划

  7. 测什么

    1. 项目背景
    2. 测试目的
    3. 测试范围
  8. 谁来测
    1. 进度与分工
    2. 交付清单
  9. 怎么测

    1. 测试策略

      5.3 性能测试用例

      image.png

      5.4 性能测试执行

      image.png

      5.5 性能测试分析和调优

      image.png

      5.6 性能测试报告

  10. 测试工作的经过回顾

  11. 缺陷分析和调优
  12. 风险评估
  13. 性能测试结果
  14. 测试工作总结与改进

    5.7 性能测试流程的几个关键步骤

  15. 性能测试需求分析

    1. 熟悉被测系统,明确测试内容,明确测试策略,明确测试指标
  16. 性能测试计划和方案
    1. 测什么、谁来测、怎么测
  17. 性能测试用例设计
    1. 测试标题、测试不步骤、预期结果、实际结果(系统指标、资源指标)
  18. 性能测试执行
    1. 建立测试环境、编写测试脚本、配置性能监控指标、执行测试脚本
  19. 性能测试分析和调优
    1. 测试人员分析并提交bug,开发人员调优bug
  20. 性能测试报告总结

    1. 测试过程记录、问题分析、风险识别、测试结论、经验教训

      6、总结

      6.1 性能测试的概述

  21. 性能测试的关注点:时间和资源

  22. 性能测试的概念:使用自动化的工具,模拟用户真实的使用场景,对软件各项性能指标进行测试和评估 的活动
  23. 性能测试的目的:
    1. 评估当前的系统能力;
    2. 出现性能bug后,优化性能;
    3. 预测未来的性能需求是否满足
  24. 性能和功能的对比:

    1. 焦点:功能(正向、逆向),性能(时间、资源)
    2. 关联:先功能测试,再性能测试

      6.2 性能测试的策略

  25. 基准测试:

    1. 狭义上:单用户测试,记录性能指标
    2. 广义上:设定基准线,后续软硬件条件发生变化时,再进行同样基准测试对比观察性能的变化。
  26. 负载测试:逐步增加系统负载,找到满足系统需求情况下的最大负载量的测试。
  27. 稳定性测试:在用户正常的业务负载下,长时间(1天— 7天)测试,观察系统是否能稳定运行
  28. 并发测试:极短时间内,发送大量请求,观察系统是否能并发执行
  29. 压力测试:在高负载的情况下,观察系统是否有好的容错能力和可恢复能力。

    1. 高负载下的长时间稳定性压力测试
    2. 极限负载下的破坏力压力测试

      6.3 性能测试的指标

  30. 响应时间:客户端发起请求开始,到收到响应的总时间。包含:服务器处理时间 + 网络传输时间

  31. 并发(用户)数:同一段时间往服务器发送请求的用户数
  32. 吞吐量:单位时间内,服务器处理的客户端请求的数量。QPS和TPS
  33. 点击数:访问页面时,加载页面的各种元素(文本、图片、 css、js等)的请求数量。
  34. 错误率:在用户负载情况下,失败业务的概率。 注意:与功能的随机bug区分
  35. 资源使用率:使用系统时,资源占用的比例。常见: CPU、内存、磁盘、网络

    6.4 性能测试的流程

  36. 性能需求分析

  37. 性能测试计划和方案
  38. 性能测试用例设计
  39. 性能测试执行:
    1. 搭建性能环境
    2. 准备测试脚本
    3. 配置监控指标
    4. 执行测试脚本
  40. 性能结果分析和调优
  41. 性能测试的报告

    二、Jmeter基础操作

  42. 主流性能测试工具Jmeter和Loadrunner工具对比

  43. Jmeter基本使用(Jmeter环境安装、功能概要、元件及作用域、示例脚本 - 基本组成)
  44. Jmeter进行HTTP接口测试的计数要点(参数化、断言、关联、直连数据库、逻辑数据库、逻辑控制器、录制脚本)
  45. Jmeter进行性能测试的技术要点(定时器、分布式、测试报告、性能测试图表)

    1、Jmeter和Loadrunner工具对比

    image.png
    image.png
    image.png
    2、Jmeter环境搭建(重点)

  46. 安装JDK:

    1. 下载JDK – 安装JDK – 配置环境变量 – 验证

image.png

  1. 安装Jmeter:
    1. 下载Jmeter – 安装Jmeter – 配置环境变量 – 启动验证

image.png

  1. 注意点:

    1. 下载JDK时,注意电脑操作系统是32位/64位
    2. 下载Jmeter时,注意与本机安装的JDK版本匹配
    3. 安装Jmeter时,安装路径中不能有中文/空格

      2、Jmeter的功能概要

      2.1 Jmeter文件目录结构

      image.png
      image.png
      image.png

      2.2 修改基本配置

      image.png

      3、Jmeter元件及基本作用域(理解)

      3.1 基本元件

      image.png
      image.png
      image.png
      作用域的原则:
  2. 取样器:核心,不和其他元件相互作用,没有作用域

  3. 逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用
  4. 其他元件:
    1. 如果是某个取样器的子节点,则该元件只对其父节点起作用
    2. 如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)

元件执行顺序:
image.png

案例:执行顺序:
image.png
正确:定时器1 - 请求1 - 定时器1 - 定时器2 - 请求2 - 定时器1 - 定时器3 - 请求3

3.2 Jmeter第一个案例

image.png

4、Jmeter三个重要组件(重点)

4.1 线程组

作用:线程组就是控制Jmeter用于执行测试的一组用户
特点:

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

image.png
image.png
线程组的分类:
image.png
线程组的属性:
image.png
image.png
案例分析:
使用1个线程组,添加HTTP请求(百度)

  1. 配置线程数为2,循环次数为3时,运行观察结果
  2. 配置线程数为3,循环次数为2时,运行观察结果,对比不同

分析:

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

    4.2 HTTP请求

    参数介绍:
    作用:向服务器发送http及https请求
    位置:选中线程组 -> 右键 -> 添加 -> 取样器 -> HTTP请求
    image.png
    image.png
    image.png
    image.png

    4.3 查看结果树

    image.png
    image.png

    5、Jmeter参数化(重点)

    定义:使用不同的测试数据,调用相同的测试方法进行测试
    本质:实现测试数据与测试方法的分离。
    实现方式:

  3. 用户定义的变量 —— 全局变量

  4. 用户参数 —— 为每个用户分配不同的参数值
  5. CSV数据文件设置 —— 文件方式参数化
  6. 函数 —— 随机数据
  7. 数据库

    5.1 用户定义的变量

    image.png
    image.png

    5.2 用户参数

    image.png
    image.png
    image.png
    注意点:设置的线程数要与用户参数个数相同,否则只会按线程数执行

    5.3 CSV数据文件设置

    image.png
    image.png
    注意:如果设置多个线程数,CSV文件获取的值也是不相同的
    image.png

    5.4 函数

    image.png
    image.png
    image.png
    image.png

    5.5 四种参数化方式的对比

    image.png

    6、总结

    6.1 Jmeter基本使用

  1. 元件:线程组、配置元件、前置处理器、定时器、取样器、后置处理器、断言、监听器
  2. 作用域:
    1. 取样器:是核心,本身无作用域
    2. 逻辑控制器:只对子节点起作用
    3. 其他元件:
      1. 父节点是取样器,只对父节点起作用
      2. 父节点不是取样器,对父节点的所有后代节点(子节点、子节点的子节点等)都起作用
  3. 执行顺序:

    1. 同一个作用域的不同元件:配置元件、前置处理器、定时器、取样器、后置处理器、断言、监听器
    2. 同一个作用域的相同元件:从上到下的顺序

      6.2 核心元件

  4. 线程组:

    1. 分类:普通线程组、setup线程组、teardown线程组
    2. 属性:线程数、ramp-up时间、循环次数、持续运行时间、延迟启动时间
  5. HTTP请求:
    1. GET请求(在URL的路径中)
      1. URL:协议、域名、端口、路径、请求方法GET、编码格式
      2. 参数:
        1. 在路径中添加参数。?参数名= 参数值&参数名= 参数值
        2. 在参数列表中添加。格式:参数名,参数值
    2. POST请求(在消息体数据中)
      1. URL:协议、域名、端口、路径、请求方法POST、编码格式
      2. 参数:
        1. 在参数列表中添加(只能添加form格式)
        2. 在消息体数据中添加(任意格式)
  6. 查看结果树

    1. 请求:请求行(URL)、请求体(参数)
    2. 响应:状态码、响应体

      6.3 Jmeter参数化

  7. 作用:使用不同的测试数据,调用相同的测试方法

  8. 用户定义的变量:定义全局变量
  9. 用户参数:不同的用户使用不同的测试数据
  10. CSV数据文件设置:不同的用户,或者同一个用户的多次循环,都可以获取不同的数据
  11. 函数:不同的用户,或者同一个用户的多次循环,都可以获取不同的数据,不需要提前准备数据。

问题描述:
当发送www.jd.com的http请求时,查看结果树看到的发送消息和HTTP取样器中配置的不完全一样?
image.png
原因分析:

  1. 查看结果数中最外层HTTP请求的请求信息和响应信息,应该与子节点中最后一个HTTP请求的请求消息和响应消息一致
  2. 自己配置的HTTP请求,应该与子节点中第一个HTTP请求的请求信息一致
  3. JMeter可以自动判断/处理响应状态码(比如302完成重定向,发送第二个请求)

image.png
昨日作业:
某支付系统,需要用1000个不同的用户登录,并使用添加不同的测试金额数据访问支付接口?
答案:

  1. 准备CSV数据文件 —— 1000个登录的用户名密码
  2. 添加线程组,设置线程数为1000
  3. 添加CSV数据文件设置
  4. 添加HTTP请求 - 登录,使用读取的用户名密码
  5. 添加HTTP请求 - 支付 —— 使用counter函数添加不同的测试金额
  6. 查看结果树

    6、Jmeter断言

    image.png

    6.1 响应断言

    image.png
    image.png
    案例1:检查百度首页的接口响应中包含“百度一下,你就知道”
    image.png
    案例2:响应断言中,有多个待校验的测试数据
    image.png

    6.2 JSON断言

    image.png
    案例:
    请求:http://www.weather.com.cn/data/sk/101010100.html
    image.png
    image.png

    6.3 断言持续时间

    image.png
    案例:
    请求:https://www.jd.com
    检查:让程序检查响应时间是否大于100毫秒
    image.png
    image.png
    image.png

    7、Jmeter关联

    image.png
    image.png

    7.1 正则表达式介绍

    正则表达式:就是一个公式,或者说一套规则,使用这套规则可以从任意字符串中提取出想要的数据内容 ```java 公式格式:左边界(匹配符号)右边界:可以提取出想要获取的数据内容 .:是通配符,可以代表任意字符(除换行回车) : 代表前面的字符出现0次或者多次 .匹配规则:找到左边界值后,往右查找有边界,找到最后面的右边界,中间的所有数据都被记录下来 ?: 代表非贪婪匹配,找到左边界后,往右查找匹配右边界,只要有匹配的右边界就停止继续查找;再次查找 左边界和右边界

公式格式:左边界(.*?)右边界

  1. 案例二:
  2. ```java
  3. 原始文本:
  4. 021-1234-1234
  5. 022-1234-1235
  6. 023-1234-1236
  7. 024-1234-1237
  8. 025-1234-1238
  9. 026-1234-1239
  10. 027-1234-1230
  11. 要求:匹配出 城市号、地区号、个人号码三组

正则表达式匹配:

  1. (.*?)-(.*?)-(.*?)\n

结论:

  1. 通过一个正则表达式可以提取出多组数据,每组数据设置对应的左边界和右边界即可
  2. 每一组数据都可以有一个或者多个值

    7.2 正则表达式提取器

    image.png
    案例1:获取传智播客首页的title,并作为参数传递
    image.png
    案例2:获取传智播客首页的地址,把第5个校区地址作为参数传递(span为地址的校区)
    1. 响应中的地址格式显示:<p><span>地址</span>上海市浦东新区航头镇航都路18号万香创新港</p>
    方法1:
    image.png
    方法2:
    image.png
    引用:以列表索引的方式来引用。格式:${变量名_索引} ,索引从1开始
    image.png
    案例3:获取传智播客首页的地址,把第5个校区地址作为参数传递(span为地址/后面带一、二、三)
    1. 地址格式1:<p><span>地址一</span>昌平区建材城西路金燕龙办公楼一层</p>
    2. 地址格式2:<p><span>地址</span>上海市浦东新区航头镇航都路18号万香创新港</p>
    image.png
    image.png
    image.png

    7.3 xpath提取器

    image.png
    image.png
    1. 案例:
    2. //a[@id='kw']: 在HTML页面中,找出a标签(有一个属性为id,且id的值为kw)
    3. //a : 找出所有的a标签
    案例:获取传智播客首页的title,并作为参数传递
    image.png

    7.4 Json提取器

    image.png
    image.png
    案例:提取天气接口中的城市信息,作为参数在访问百度首页时传递
    image.png

    7.5 JMeter属性

    前述所将的变量传递都不能在线程组中传递
    image.png
    image.png
    image.png
    案例:
  1. 线程组1:请求获取天气的接口,http://www.weather.com.cn/data/sk/101010100.html,获取返回结果中的城市名称“北京”**
  2. 线程组2:请求https://www.baidu.com/s?wd=北京 ,把获取到的城市名称作为请求参数**

image.png

7.6 Jmeter关联总结

image.png

7、自动录制脚本

7.1 原理

image.png

7.2 Jmeter脚本录制

1、添加HTTP代理服务器,并进行配置

  1. 加HTTP代理服务器:测试计划(右键)-> 非测试元件 -> HTTP代理服务器
  2. 配置代理服务器的参数

image.png
image.png
2、开启windows操作系统的浏览器代理
image.png
3、启动代理服务器,开始录制
image.png
image.png
4、在浏览器页面中进行操作,成功后,就能在JMeter当中看到抓取到的接口请求了。
image.png
练习:
设置过滤规则,录制tpshop的登录脚本,运行脚本观察测试结果

当使用代理的过程中,发现抓不到包,几个可能的情况:

  1. 过滤规则设置有问题
  2. 重启Jmeter代理服务器或者重启Jmeter
  3. 换浏览器来使用(Chrome、IE)
  4. 检查PC机中的代理设置是否处于可用状态
  5. 拔掉网线,抓包

断言和关联总结:

  1. Jmeter断言
    1. 响应断言:
      1. 作用:在任意响应格式中,都可以使用
      2. 配置:
        1. 实际要校验的字段
        2. 校验规则
        3. 预期结果
    2. JSON断言:
      1. 作用:响应格式为JSON数据时,使用JSON断言
      2. 配置:
        1. JSON路径
        2. 预期结果
    3. 持续时间断言:
      1. 作用:检查响应时间是否超出预期时间
      2. 配置:预期响应时间
  2. Jmeter关联
    1. 概念:请求依赖关系,一个请求的响应作为另一个请求的参数进行传递
    2. 正则表达式提取器
      1. 作用:可以针对任意格式的响应数据进行提取
      2. 配置:
        1. 变量名
        2. 正则表达式:左边界(.*?)右边界
        3. 模板:$n$ 。提取第几个括号的(提取第几组值)
        4. 匹配数字:1表示第一个值,-1表示全部值,0表示随机
    3. XPath提取器:
      1. 作用:可以针对HTML格式的响应数据进行提取
      2. 配置:
        1. 变量名
        2. xpath表达式。//标签,//标签[@属性名=属性值]
        3. 匹配数字:1表示第一个值,-1表示全部值,0表示随机
    4. JSON提取器:
    5. 作用:可以针对JSON格式的响应数据进行提取
    6. 配置:
      1. 变量名
      2. JSON路径。格式:$.键名.键名
  3. Jmeter属性:
    1. 作用:跨线程组关联,跨线程组实现数据的传递
    2. 函数及调用:
      1. 保存Jmeter属性:setProperty —— 放入到BeanShell取样器中执行
      2. 读取Jmeter属性:Property —— 放入到第二个线程组的HTTP请求中
    3. 步骤:
      1. 添加第一个线程组
      2. 添加HTTP请求
      3. 添加JSON/Xpath/正则表达式提取器—— 提取数据
      4. 添加BeanShell取样器—— 执行setProperty函数
      5. 添加第二个线程组
      6. 添加HTTP请求—— Property函数读取Jmeter属性
      7. 查看结果树
  4. Jmeter脚本录制

    1. 端口
    2. 目标控制器
    3. 过滤条件

      8、Jmeter直连数据库

      直连数据库的作用:
      image.png
      步骤:
  5. 添加MySQL驱动jar包

    1. 方式一:在测试计划面板点击“浏览…“按钮,将你的JDBC驱动添加进来
    2. 方式二:将MySQL驱动jar包放入到lib/ext目录下,重启Jmeter

image.png

  1. 配置数据库连接信息
    1. 添加方式:测试计划 —> 线程组 —> (右键添加)配置元件 —> JDBC Connection Configuration

image.png

  1. 添加JDBC请求
    1. 添加方式:测试计划 —> 线程组 —> 取样器 —> JDBC Requset

image.png
案例1:
连接tpshop商城数据库获取商品名包含:小米手机5的商品id
需求:
1、在tpshop首页中搜索商品名称“长虹(CHANGHONG) 49A1U 49英寸双64位4K超清智能网络LED液晶电视”,请求URL:http://127.0.0.1/Home/Goods/search.html
请求方法:GET
请求参数:q=
2、在搜索的响应数据中检查是否有该商品对应的商品链接: /Home/Goods/goodsInfo/id/65.html (id:65需要通过数据库查询返回,才保证每次都是有效的)

编写JDBC脚本步骤(搜索指定商品,在返回结果中检查是否包含指定商品的ID的详情URL):

  1. 添加线程组
  2. 添加JDBC Connection Configuration
  3. 添加JDBC request
  4. 添加HTTP请求 - 搜索商品
  5. 在搜索HTTP请求下,添加响应断言,检查响应结果中的字符是否包含**商品URL。
    1. 引用格式:${变量名_索引}
  6. 添加查看结果树

image.png

9、逻辑控制器

9.1 如果(if)控制器

image.png
案例:
1、使用“用户定义的变量”定义一个变量name,name的值可以是baidu或itcast
2、根据name的变量值实现对应网站的访问
image.png
image.png

9.2 循环控制器

image.png
image.png
(3)思考:线程组属性可以控制循环次数,那么循环控制器有什么用?

  1. 不同点:
    1. 线程组的循环次数对线程组下的所有HTTP请求有效
    2. 循环控制器的循环次数对子节点下的 HTTP请求有效
  2. 关联:循环控制器次数为M,线程组循环次数为N,

    1. 循环控制器下的请求运行: M * N 次
    2. 线程组下,非循环控制器下的请求运行: N次

      9.3 ForEach控制器

      image.png
      image.png
      案例1:与用户定义的变量配合使用
  3. 有一组关键字 [hello,python,测试],使用用户定义的变量存储

  4. 要依次取出关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=hel

步骤:

  1. 添加线程组
  2. 添加用户定义的变量

image.png

  1. 添加ForEach控制器

image.png

  1. 添加HTTP请求-百度

image.png

  1. 添加查看结果树

image.png
image.png
案例2:与正则表达式配合使用

  1. 访问传智播客首页http://www.itcast.cn,获取首页中的地址信息,并全部保存下来
  2. 要依次取出地址关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=地址

步骤:

  1. 添加线程组
  2. 添加HTTP请求1:http://www.itcast.cn
  3. 在HTTP请求1的下面,添加正则表达式提取器,提取出所有的地址信息

image.png

  1. 添加ForEach控制器

image.png

  1. 添加HTTP请求-百度

image.png

  1. 添加查看结果树

注意:结束循环字段可以设置为0,自动读取到最后一个
image.png

10、定时器

10.1 同步定时器

image.png
image.png
image.png
image.png
案例:1、模拟100个用户同时访问百度首页,统计各种高并发情况下运行情况
操作步骤:

  1. 添加线程组,设置线程数为n
  2. 添加HTTP请求
  3. 添加同步定时器
    1. 设置并发线程数:同时发送请求的虚拟用户数
    2. 设置超时时间
      1. 建议设置:不设置的话,若没有达到设置的线程数会一直死等
      2. 不能设置太小:等待时间后还没达到设置的线程数,会释放已到达的线程
  4. 添加查看结果树
  5. 添加监听器 - 聚合报告

image.png

10.2 常数吞吐量定时器

image.png
image.png
image.png
案例:
( 1)一个用户以20QPS(20次/s)的频率访问百度首页,持续一段时间,统计运行情况
( 2) 2个用户针对(服务器的QPS要求:20QPS (20 次/s))的频率访问百度首页,持续一段时间,统 计运行情况
image.png
image.png

10.3 固定定时器

案例:
IHRM系统登录错误3次后,锁定1分钟,1分钟后重新输入正确的用户名密码登录成功
步骤:

  1. 添加线程组
  2. 添加HTTP请求1 - 错误1次
  3. 添加HTTP请求2 - 错误2次
  4. 添加HTTP请求3 - 错误3次
  5. 添加HTTP请求4 - 正确用户名密码
  6. 在HTTP请求4下,添加固定定时器
  7. 添加查看结果树

image.png
注意:
固定定时器,必须添加在需要等待的HTTP请求的子节点下
在HTTP信息头管理器中,修改HTTP请求的头域
image.png

三、Jmeter进阶操作

1、JMeter分布式测试

1.1 概念

  1. 当一个JMeter客户端因网络限制等因素,无法模拟足够的用户对服务器施压时,需要用到JMeter分布式测试:用一台控制机,控制多台远程负载机,同时对服务器施压
  2. 控制机通过RMI控制负载机,在负载机上运行控制机上的脚本,同时对服务器造成冲击
  3. 主控制机:存放JMeter脚本的机器叫做主控制机
  4. 负载机:被连接并用来运行脚本的机器叫做负载机

1.2 前提条件

  1. 保证在控制机和负载机上都能够运行Jmeter(jmeter和jdk版本需一致)
  2. 要保证控制机和负载机、负载机和被测服务器之间的网络能够通信(同一个局域网内)

1.3 操作步骤
第一步:建立连接通道
create-rmi-keystore.bat是主控机与负载机建立连接的通道,首次双击打开可能会需要填写相关内容,随便填写,然后选y,确认,主控机和负载机都需要进行这步操作
image.png
RMI默认传输机制使用SSL,因此需要双击create-rmi-keystore.bat创建密钥才可以
image.png
第二步:配置负载机
Jmeter-server的默认服务端口是1099,如果在负载机上该端口被占用,则配置文件jmeter.properties中的属性server.rmi.localport来指定服务端口
1.png
image.png
负载机上启动Jmeter-server.bat
第三步:配置控制机
配置jmeter.properties文件,告诉控制机(Master)去尝试连接哪些机器
在”remote_hosts”关键字后面加上远程Jmeter负载机的IP即可(推荐使用IP而非机器名),IP之间用逗号隔开
image.png
第四步:重启控制机上的Jmeter
控制机上,打开需要运行的脚本,设置好线程组属性,就可以通过远程启动or远程全部启动的方式来运行脚本
image.png
上述所有的文件均在bin目录下
1.4 注意事项

  1. 联机负载时,要保证控制机和负载机的Jmeter的版本、JAVA环境的一致性
  2. 联机负载时,脚本的运行环境是负载机的环境
  3. 对于脚本中用到的第三方文件,包括jar包和参数文件等
    1. 对于jar包,只需要保证第三方jar包同时在控制机和负载机的jmeter的lib目录下存在即可
    2. 对于第三方文件,比如参数文件,也要求在控制机和负载机都要在相同目录下
  4. 联机负载时,远程全部启动时,当前的测试计划是分别、独立、同步在每一台负载机上执行的。这就意味着此时对服务器造成的实际压力(RL)和测试计划所设置的压力(DL)是不一样的,是和负载机的数量(N)有关的。RL=DL*N

1.5 主控机连不上负载机

  1. 检查负载机和主控机ip是否可以ping通
  2. 检查负载机防火墙是否关闭
  3. 检查负载机上是否运行了jmeter的代理(jmeter-server.bat)
  4. 如果主控机的脚本上有参数化文件,那么在负载机同样位置上也得有一个参数化文件

    2、监听器(服务器资源)

    jp@gc - PerfMon Metrics Collector
  1. 作用:监控服务器CPU、内存、磁盘、网络等相关资源
  2. 安装插件ServerAgent-2.2.3及验证是否安装成功image.png

image.png

  1. 运行 ServerAgent-2.2.1\bin\startAgent.bat(Linux使用startAgent.sh)
    1. 默认端口为4444,也可以参数指定 –udp-port 4445 –tcp-port 4445

image.png

  1. 添加监听器 “jp@gc - PerfMon Metrics Collector”

image.png

  1. 输出

image.png

3、终极线程组

  1. 步骤:右键测试计划 -> 添加 -> Threads(Users) -> jp@gc - Ultimate Thread Group
  2. 参数含义解释

image.png

  1. Start Threads Count:当前行启动的线程总数
  2. Initial Delay/sec:延时启动当前行的线程,单位:秒
  3. Startup Time/sec:启动当前行所有线程达峰值所需时间,单位:秒
  4. Hold Load For/sec:当前行线程达到峰值后的稳定加载时间,单位:秒
  5. Shutdown Time:停止当前行所有线程所需时间,单位:秒

    4、聚合报告

    image.png
    image.png
    重点关注的性能指标:
  1. 响应时间
    1. 观察当前的最大最小值得波动范围
      1. 如果波动范围不大,以平均响应时间作为最终的性能响应时间结果
      2. 如果波动范围很大,以90%(经验)的响应时间作为最终性能响应时间结果
  2. 错误率
  3. 吞吐量

    5、输出HTML报告

    5.1 环境要求

    1. Jmeter3.0版本之后开始支持动态生成测试报表
    2. Jdk版本1.7以上
    3. Jmx脚本文件

5.2 直接生成HTML报告。在脚本文件路径下,执行cmd命令:jmeter -n -t jmx文件 -l result.jtl -e -o D:\ResultReport
image.png
image.png

  1. ● -n:非GUI模式(即非图形界面的方式)执行JMeter
  2. ● -t:执行测试文件所在的位置
  3. ● -l:指定生成测试结果的保存文件,jtl文件格式
  4. ● -e:测试结束后,生成测试报告
  5. ● -o:指定测试报告的存放位置
  6. 注意:结尾的 ResultReport 是自己手动创建的报告文件夹。每次启动命令之前,文件夹内容必须和 jtl 文件一起清空
  7. 每次运行脚本文件时,必须把报告文件夹下的内容和.jtl文件全部删除,否则会出现如下截图中的错误

性能测试基础 - 图163
解决办法:写一个bat,每次执行bat都自动去清空之前的报告和jtl文件
① 删除文件:del resylt.jtl
② 删除文件夹:rd 文件夹名称
③ 重建文件夹:md 文件夹路径
性能测试基础 - 图164
5.3 使用之前的测试结果,生成测试报告

  1. 先生成测试结果:jmeter -n -t jmx文件 -l result.jtl
  2. 再生成报告:jmeter -g result.jtl -o D:\ResultReport

5.4 报告详解:https://www.jianshu.com/p/4f32918d66bb

image.png

6、插件管理包工具

说明:下载Jmeter插件管理工具包(可以用此包下载Jmeter插件)
(1)应用步骤:

  1. 下载包管理工具jar包
  2. 将包管理工具jar包添加到Jmeter中(将jar包加到Jmeter安装目录的lib/ext目录下)
  3. 下载性能测试常用组件

image.png
将jar包加到Jmeter安装目录的lib/ext目录下
image.png
image.png
(2)安装指定的插件

  1. 打开Plugins Manager插件管理器
  2. 选择Available Plugins,当前可用的插件
  3. 选择需要下载的插件(等待右方文本内容展示出来)
  4. 下载右下角的下载按钮,自动的完成下载,Jmeter会自动重启

    6.1 Concurrency Thread Group阶梯线程组

    添加方式:测试计划 - 线程(用户) - Concurrency Thread Group
    image.png

    6.2 Transaction per Second

    说明:每秒完成事务数
    场景:统计业务成功数
    添加方式:测试计划 - 线程组 - 监听器 - Transaction per Second

TPS:运行过程中的TPS统计
image.png

6.3 Bytes Throughput Over Time

说明:查看服务器吞吐流量 单位/字节
添加方式:测试计划 - 线程组 - 监听器 - Bytes Throughput Over Time

Bytes Throughput Over Time:运行过程中的传输速率
image.png

6.4 PerfMon Metrics Collector

说明:用来监控服务器的性能工具,包括CPU、内存、磁盘、网络等性能数据
添加方式:线程组 - 监听器 - jp@gc - PerfMon Metrics Collector
注意:使用之前需要在服务器端安装监听器服务并启动
image.png
image.png

7、并发用户数的计算

7.1 常用平均并发数计算公式

image.png
image.png

7.1.1 普通计算方法

计算公式:TPS = 总请求数 / 总时间
image.png

7.1.2 二八原则计算方法

二八原则就是指80%的请求在20%的时间内完成
计算公式:TPS = (总请求数 80%) / (总时间 20%)
image.png

7.2 计算稳定性测试和压力测试的并发量

业务数据:有的公司会统计一定时间内的所有业务数据,我们可以根据这个业务数据曲线图,统计出并发量
image.png
image.png

7.2.1 稳定性测试并发量

计算模拟用户正常业务(稳定性测试)的并发量:
image.png

7.2.2 压力测试并发量

计算模拟用户峰值业务操作(压力测试)的并发量:
image.png

7.3 并发数计算总结

image.png
image.png