Jmeter基本使用

入门

简介

特点

  • 能够对HTTP和FTP服务器进行压力和性能测试,也可以对任何数据库进行同样的测试(通过DBC)
  • 完全的可移植性和100%纯java
  • 完全多线程框架允许通过多个线程并发取样和通过单独的线程组对不同的功能同时取样。
  • 各种负载统计表和可链接的计时器可供选择
  • 数据分析和可视化插件提供了很好的可扩展性以及个性化。
  • 具有提供动态输入到测试的功能

缺点

  • 不支持IP欺骗
  • 使用Jmeter无法验证js程序,也无法验证页面ui,所以要和selenium配合完成Web2.0应用的测试

工作原理

image

下载安装

Jmeter下载安装详细步骤(最新)-CSDN博客

image

一个简单案例

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

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

bin目录

  • bin目录是可执行文件,jmeter.bat用于启动jmeter,里面可以配置jvm参数
  • 根据经验,heap最多设置为物理内存的一半,默认设置为512M。如果heap超过物理内存的一半,可能运行jmeter会慢,甚至出现内存溢出。
  • jmeter的log在jmeter.log中查看
  • jmeter.properties文件中有一个属性log_level.JMeter可以设置改变日志详细度。默认为info,可以改为debug。

项目简介

一文看懂什么是 RESTful API?- API 接口简介
RESTful 风格详解_restful风格-CSDN博客

image

线程组

进程和线程的简单概念:

  • 进程:正在运行的程序
  • 线程:是进程中的执行线索
  • 线程组:进程中有许多线程,为了方便管理,可以对线程按照性质分组,分组的结果就是线程组

PS:三者关系,一个进程可以包含多个线程组,一个线程组可以包含多个线程
并发执行和顺序执行:

  • 并发执行:多个线程同时执行
    image

  • 顺序执行:多个线程依次执行(选中测试计划,勾选独立运行每个线程组)
    image

两个特殊线程组

tearUp线程组:最优先执行线程组
tearDown线程组:最后执行线程组

http请求默认值

对于一个线程组内的多个线程,可能存在相同的线程设置项,比如协议、IP地址、端口、编码格式等,此时可以添加一个http请求默认值组件,来实现对复用内容的封装

image

信息头管理器

有的接口是新增数据的请求,这类请求提交的数据是json格式的,需要声明提交数据的内容类型

image

image

参数化

当提交的数据量较大,怎么提交?每测试一次就修改一次吗?
参数化定义:动态的获取、设置或生成数据,是一种由程序驱动代替人工驱动的数据设计方案,提高脚本的编写效率以及编写质量
以下四种方式实现参数化:

  1. 用户定义的变量
  2. CSV数据文件设置
  3. 用户参数
  4. 函数

一、用户定义的变量

调用格式:${变量名}
image

二、CSV数据文件设置

CSV:逗号分隔值,是一种简洁且常见的数据存储格式,存储语法如下图所示
实现步骤:

  1. 使用CSV文件存储测试数据
  2. 编写被复用的学院新增脚本模板(注意:编码集使用UTF-8无BOM格式)
  3. 关联脚本与数据(将文件数据导入脚本)
    image
    image
    注意设置好之后,要将线程组设置中的循环次数设置为永远,这样才能遍历读取完csv数据中的每一行

三、用户参数

这种参数化的方法实际应用不多,原因是用户参数的数据和编写的脚本必须是放置在一起的,不能实现数据的分离和单独维护。
案例:

  1. 编写被复用的学院新增脚本模板
  2. 使用用户参数存储测试数据
  3. 将数据导入脚本模板
  4. 设置执行次数
    image
    image

四、函数实现参数化

用于参数化常用的几个函数:

  1. _counter计数器函数
    1. TRUE(每个用户都有自己的计数器)
    2. FALSE(所有用户共用一个计数器)

这里我遇到一个问题,我的counter函数是从2开始计数,每次递增2,使用的JMeter版本是5.6.2,后来使用5.0版本的JMeter,就是从1开始计数,每次递增1

image
image

  1. _Random随机数函数
    1. 参数1:取值范围最小值(包含)
    2. 参数2:取值范围最大值(包含)
  2. time获取当前时间的函数
    1. 无参:获取的是距离1970/01/0100:00:00的毫秒值
    2. 参数1:yyyy-MM-dd hh:mm:ss格式化成年\月_日时分秒格式

在JMeter中使用函数助手添加函数:

image

连接数据库

JMeter直连数据库:

  1. JMeter不具备直连数据库功能,所以需要添加jar包到ClassPath
  2. 添加JDBC Connection Configuration配置元件,配置数据库连接池的选项
    1. 数据池名称
    2. 数据库URL
    3. JDBC Driver class
    4. 账号密码(有就填,没有不填)
  3. 添加JDBC Request,选择Query类型,编写SQL

断言

步骤:

  1. 编写测试脚本
  2. 为被判断的取样器添加断言组件
  3. 直接运行,查看结果,如果断言通过,没有提示,如果断言失败,给出错误信息

断言可以让JMeter代替人工判断响应结果是否符合预期,断言一般分为以下几种:

  1. 响应断言:断言状态码和响应体

image

  1. 大小断言:判断响应内容的字节长度

image

  1. 断言持续时间:判断响应时间

image

注意这里有一个json断言需要补充

进阶

能掌握JMeter的逻辑控制器
能掌握JMeter的关联操作
能掌握JMeter跨越线程组关联
能掌握JMeter高并发场景的设置
能掌握JMeter高频率场景的设置
能知道JMeter的分布式原理

JMeter元件的作用域与执行顺序

image
image

逻辑控制器

通过参数化可以实现单个接口的功能测试,而接口测试过程中,除了单个接口的功能测试之外,还会测试接口业务实现,所谓业务,就是一套完整的业务逻辑或流程,这就必须要使用到逻辑控制和关联。

IF控制器

需求1:测试计划中定义一个http请求访问传智播客官网,但是该请求不是无条件执行的,声明一个用户定义的变量,如果变量是itcast才执行,否则就不执行

  1. 搭框架,测试计划,线程组,结果树,声明一个用户定义的变量
  2. 核心:添加if控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)
    image
    image

forEach控制器

需求2:有一组关键字[hello,python,测试](使用用户定义的变量存储)要依次取出,并在百度搜索

  1. 搭框架,测试计划,线程组,结果树,声明一个用户定义的变量,存储一组数据
  2. 添加forEach控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)
  3. 百度搜索关键字

循环逻辑控制器

需求3:循环访问学生管理系统10次

  1. 搭框架,测试计划,线程组,结果树
  2. 添加循环控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系)

关联操作

某一个请求的响应结果和下一个请求的数据有关系,这就是关联

xpath提取器

需求:两个http请求,请求A访问传智播客官网,请求B访问百度,请求A将传智播客官网源码中的title标签的值取出,传递给请求B,在请求B中作为关键字搜索这个title值
步骤:

  1. 搭框架,编写两个请求,传智播客+百度搜索
  2. 核心:取出传智播客页面源码的title值
  3. 传递给百度:${变量名}的方式传值

正则表达式提取器

跨越线程组关联

变量作用域局限于当前线程组,其他线程组不可以直接调用。可以将请求A中提取的结果导出到公共空间(可以被不同线程组共享),请求B再从公开空间调用该变量,相当于全局变量。
想要实现跨越线程组变量的引用,可以使用函数助手中的两个内置函数实现:

  1. setProperty生成设置全局变量的脚本
  2. 添加BeanShell取样器粘贴上边的脚本
  3. property函数生成引用变量的脚本,粘贴到想要引用的位置即可

高并发设置

JMeter中内置才定时器,可以实现时间模式相关的性能测试
需求1:同一时刻100个同学去访问学生管理系统的查询所有学院信息功能统计高并发情况下平均响应时间以及错误率(高并发)
1、搭框架,测试计划,线程组,取样器,结果树(局限性),指定线程组的线程数属性值为100
2、添加定时器synchronizing timer(集合点组件)
3、运行并查看结果查看:聚合报告组件,可以对结果汇总分析

高频率设置

需求2:-个用户以20QPS(==20次/s)的频率访问学生管理系统服务器,持续15秒,统计服务器的平均响应时间

QPS:Query per Seconds每秒查询数(查询率),每秒访问多少次服务器

1、搭框架:测试计划>>>线程组>>>取样器>>>聚合报告,根据题干计算数据:循环次数=访问频率持续时间
2、添加QPS访问频率控制的相关组件(常数吞吐量计时器):每分钟访问次数=访问频率
60

分布式原理(了解)

多台机器协作,以集群的方式完成测试任务,可以提高测试效率
分布式角色划分:

  • 控制机:负责任务分配
  • 执行机:负责任务实现

工作流程:

  1. 控制机制定测试任务,下发到执行机
  2. 执行机执行任务并将结果返回给控制机
  3. 控制机做结果汇总
    image
    环境搭建:
    1、不同的测试机上安装Jmeter
    2、配置基础环境(统一操作系统、JDK、Jmeter.)
    3、核心:控制机如何与执行机通信?关键点:端口号
    4、控制机中设置执行机的P
    %JMETER HOME%/bin/jmeter.properties-->remote hosts:=执行机A的lP:端口号,执行机B的IP:端口号
    image
    image.png
    在运行之前,启动jmeter.bat,使其处于待命效果

监听器

聚合报告

image.png

实战

接口测试流程:

  1. 制定测试计划,分配任务
  2. 从API文档中提取接口清单:对API文档简化,提高测试效率,主要是提取三要素

三要素:请求地址、请求方式、请求数据

  1. 设计测试用例并且参数化覆盖测试用例
  2. 编写脚本实现,并导入设计的测试数据
  3. 对于自动化接口脚本的设计,每次更新都要保证之前的代码没有受到影响,所以要把最基本的增删改查功能设计一套自动化执行的脚本,每次更新后可以启动一下脚本进行回归
  4. 测试结果汇总,提交缺陷

在实际的工作中,根据实际需求来决定是否进行性能测试
生成测试报告:
jmeter -n -t 脚本文件 -l 日志文件 -e -o 目录
-n:无图形化运行
-t:被运行的脚本
-l:将运行的信息写入日志文件
-e:生成测试报告
-o:制定报告输出目录

JMeter聚合报告中的时间单位是毫秒

posted @ 2024-05-03 03:24  爱老的虎油  阅读(8)  评论(0编辑  收藏  举报