Jmeter
项目环境搭建
python3.5以上
搭建图书管理项目
运行
pip install -r requirements.txt -i https://pypi.douban.com/simple
运行 python run_server.py
API接口清单
一、查询
1.1学院-查询所有
请求方法:GET
请求地址:http://127.0.0.1:8000/api/departments/
1.2学院-查询指定
请求方法:GET
请求地址:http://127.0.0.1:8000/api/departments/T02/
(注:T02为学院ID;)
1.3根据指定参数进行学院-List-$dep_id_list的相关查询
请求方法:GET
请求地址:http://127.0.0.1:8000/api/departments/?$dep_id_list=T01,T02,T03
(注:$dep_id_list:为参数名称;T01,T02,T03为:学院ID;)
1.4学院-List-$master_name_list查询
请求方法:GET
请求地址:http://127.0.0.1:8000/api/departments/?$master_name_list=Java-Master,Test-Master
(注:$master_name_list:为参数名称;Java-Master,Test-Master为:院长名称;)
1.5学院-模糊
请求方法:GET
请求地址:http://127.0.0.1:8000/api/departments/?blur=1&dep_name=C
(注:blur:为开启模糊查询参数1为开启;dep_name:为参数名称;C:学院名称包含字符;)
1.6学院-组合
请求方法:GET
请求地址:http://127.0.0.1:8000/api/departments/?slogan=Here is Slogan&master_name=Test-Master&dep_name=Test学院
(注:dep_name:学院名称;master_name:为院长名称;slogan:学院口号;三个条件可随意组合或单独使用)
二、新增
2.1学院-新增
1) 请求方法:POST
2) 请求地址:http://127.0.0.1:8000/api/departments/
3) 请求JOSN报文:
4) 调用传入的json串如下(可新增多条,之间用,隔开):
{
"data": [
{
"dep_id":"T01",
"dep_name":"Test学院",
"master_name":"Test-Master",
"slogan":"Here is Slogan"
}
]
}
5) 新增成功返回报文:
{
"already_exist": {
"results": [],
"count": 0
},
"create_success": {
"results": [
{
"dep_id": "T02",
"dep_name": "Java学院",
"master_name": "Java-Master",
"slogan": "java"
}
],
"count": 1
}
}
6) 新增失败id已存在-返回报文:
{
"already_exist": {
"results": [
{
"dep_id": "T01",
"dep_name": "Test学院",
"master_name": "Test-Master",
"slogan": "Here is Slogan"
}
],
"count": 1
},
"create_success": {
"results": [],
"count": 0
}
}
7) 新增失败json格式错误:
{
"status_code": 400,
"detail": "请求体参数格式错误。"
}
三、更新
3.1学院-更新
1). 请求方法:PUT
2). 请求地址:http://127.0.0.1:8000/api/departments/T03/
(注:1:为学院ID)
3). 请求JOSN报文:
{
"data": [
{
"dep_id": "T03",
"dep_name": "C++/学院",
"master_name": "C++-Master",
"slogan": "Here is Slogan"
}
]
}
4). 修改成功返回:
{
"dep_id": "T03",
"dep_name": "C++/学院",
"master_name": "C++-Master",
"slogan": "Here is Slogan"
}
四、删除
4.1学院-删除单个
请求方法:DELETE
请求地址:http://127.0.0.1:8000/api/departments/T03/
(注:10为学院ID)
4.2学院-删除多个
请求方法:DELETE
请求地址:http://127.0.0.1:8000/api/departments/?$dep_id_list=8,9,11
(注:$dep_id_list:为参数名称;8,9,11:为学院ID)
Jmeter基本使用
概述
JMeter最初是由Apache软件基金会的Stefano Mazzocchi编写和开发的, 所以Jmeter也称为“Apache JMeter”,它是一个开源的,100%基于Java的应用程序,带有图形界面。
主要功能
1. web自动化测试
2. 接口测试
3. 性能测试
4. 压力测试
5. 通过jdbc进行数据库测试
6. java测试
Jmeter下载与安装
http://jmeter.apache.org/download_jmeter.cgi
解压文件到任意目录,避免在一个有空格的路径安装Jmeter
启动JMeter
进入bin目录
双击 ApacheJMeter.jar文件(最常用);
双击 Jmeter.bat文件(有黑窗口并且不能关闭,是服务端);
linux 下启动Jmeter == meter.sh
Jmeter常用目录文件
Bin目录(存放可执行文件和配置文件)
Jmeter.bat:windows系统中JMeter的启动文件
ApacheJMeter.jar Java环境下的JMeter启动文件
Jmeter.log:日志文件
Jmeter.sh:linux系统中JMeter的启动文件
Jmeter.properties:系统配置文件
Jmeter-server.bat:windows分布式测试要用到的服务器配置
Jmeter-server:linux分布式测试要用到的服务器配置
docs目录
是JMeter的java Doc,可打开api\index.html页面来查看
printable_docs目录
usermanual子目录下的内容是JMeter的用户手册文档,其中usermanual下component_reference.html是最常用到的核心元件帮助文档
lib文件夹
一般放插件
Jmeter 基本使用
主界面布局
JMeter的主界面布局分为标题栏、菜单栏、工具栏、树形标签栏和内容栏
组件
Jmeter中功能点称为组件
元件
相同类似功能组件的集合称之为元件
常用的八大元件
逻辑控制器
配置元件: 包含java默认值、http请求默认值、http表头管理器等等
定时器(Timer): 包含同步定时器、泊松随时时间等
前置(预)处理器: jdbc 预处理器、html链接解析器,用户参数等
采样器(Sampler): 包含http请求、jdbc请求、邮件请求等
后置处理器: 包含jdbc后处理器、xpath抽取器、正则表达式抽取器等
断言
监听器: 包含图表结果、查看结果树、汇总报告等
基本使用
以学院查询执行100次为例
1. 添加【测试计划】
测试计划的名称栏目修改名字
2. 基于添加的测试计划添加【线程组】,循环次数设置为100次
3. 在【取样器】中基于线程组添加HTTP请求
名称 使用有意义的名称
设置请求
协议 http或者是https ,默认值为http
服务器名称或ip
端口 默认值为80
HTTP请求
路径
内容编码 默认值为iso8859;一般设置【UTF-8】
[参数] 查询字符串
[消息体数据] 可传递JSON报文
4. 在【监听器】基于线程组添加【察看结果树】
5. 在【监听器】基于线程组添加【聚合报告】
Jmeter 八大元件
test plan和thread group不属于元件
控制器(Controllers)
取样器(Sampler)
常用的sampler
1) HTTP请求
2) JDBC Request
3) Debug Sampler
JMeter属性 True or False 全局变量
JMeter变量 True or False
系统属性 True or False
逻辑控制器
控制Sampler节点发送请求的逻辑顺序控制器
If Controller
Swith Controller
Loop Controller
Random Controller
。。。
组织和控制Sampler节点
Transaction Controller
Throughput Controller
。。。
监听器
监听器是对测试结果进行处理和可视化展示的一系列组件
常用的组件
1) 察看结果树
2) 聚合报告
3) 断言结果
定(计)时器
设置操作之间的等待时间. 等待时间是性能测试中常用的控制客户端QPS的手段
常用的组件
1) Synchronizing Timer
2) 常数吞吐量定时器
配置元件(config Element)
设置相关请求的静态配置.不用每次都重复配置
常用的组件
1) CSV Data Set Config
2) HTTP请求默认值
3) HTTP信息头管理器
4) 计数器
CSV Data Set Config
设置CSV数据文件
文件名 如:d:/a.txt
文件编码 一般设置utf-8
变量名称 读取参数后保存的变量名称,用西文逗号分隔
忽略首行 比如csv文件又标题头可选为True
分隔符 文件中使用的分隔符号(一般用逗号)
是否允许带引号 默认false,选项选为“true”的时候对全角字符的处理出现乱码
遇到文件结束符再次循环
遇到文件结束符停止线程
线程共享模式 参数文件的作用域
参数化引用格式:${参数名}
{
"data": [
{
"dep_id":"${dep_id}",
"dep_name":"${dep_name}",
"master_name":"${master_name}",
"slogan":"${slogan}"
}
]
}
HTTP信息头管理器
添加Content-Type:application/json;charset=utf-8的请求头,可在线程组前添加
HTTP请求默认值
为HTTP Sample 提供默认值
计数器
可放入While控制器中
参数
Starting value
递增
Maximum value
引用格式
是够勾选与每用户独立的跟踪计数器
前置处理器(Per Processors)
在实际请求发出前对即将的请求进行特殊处理
常用的组件
1) 用户参数
2) HTTP URL重写修饰符
后置处理器(Post Processors)
对sampler发出请求后得到服务器响应进行处理.一般用来提取响应的特定数据
常用的组件
1) 正则表达式提取器
2) XPath Extractor
3) JSON提取器
断言(Assertions)
用于检查测试中得到的响应数据是否符合预期, 一般用来设置检查点,用以保证性能测试过程中的数据交互与预期一致
常用的组件
1) 响应断言
2) JSON断言
3) 大小断言
元件作用域及执行顺序
在jmeter中,元件的作用域是靠test plan的树形结构中元件的父子关系来确定
1)sampler不与其他元件相互作用,因此不存在作用域问题
2)Logic Controller只对其子节点中的sampler和Logic Controller作用
3)除sampler和Logic Controller外的其他元件,如果是某个sampler的子节点,则该元件仅对其父节点作用
4)除sampler和Logic Controller外的其他元件,如果其父节点不是sampler,则其作用域是该元件父节点下的其他所有后带节点(包括子节点,子节点的子节点等)
在同一个作用域范围内,测试计划中的元件按照一下顺序执行:
1.配置元件
2.前置处理器
3.定时器
4.取样器
5.后置处理器
6.断言
7.监听器
Pre-porcessors、Post-porcessors和Assirtions等元件仅对Sampler作用,如在它们作用域内没有任何Sampler,则不会被执行
jmeter核心
参数化
参数化就是动态的获取或设置数据
CSV Data Set Config
设置CSV数据文件
文件名 如:d:/a.txt
文件编码 一般设置utf-8
变量名称 读取参数后保存的变量名称,用西文逗号分隔
忽略首行 比如csv文件又标题头可选为True
分隔符 文件中使用的分隔符号(一般用逗号)
是否允许带引号 默认false,选项选为“true”的时候对全角字符的处理出现乱码
遇到文件结束符再次循环
遇到文件结束符停止线程
线程共享模式 参数文件的作用域
所有线程 所有线程共享文件读取位置指针
当前线程组 当前线程组共享文件读取位置指针
当前线程 每个线程会从文件开头读取
参数化引用格式:${参数名}
{
"data": [
{
"dep_id":"${dep_id}",
"dep_name":"${dep_name}",
"master_name":"${master_name}",
"slogan":"${slogan}"
}
]
}
用户定义变量(User Defined Variables)
可根据需求自定义相应的变量,一般做全局变量使用
配置元件->用户定义的变量
参数化引用格式:${参数名}
用户参数(User Parameters)
参数设置方式,用户可设置参数名称以及参数值
前置处理器-->用户参数
添加变量
添加用户:每个线程为每一个用户,即线程组的线程数
参数化引用格式:${参数名}
用户参数和CSV Data Set Config(所有线程)的区别
用户参数是每个线程为每一个用户,即线程组的线程数,跟线程的循环次数没关系。
CSV Data Set Config(所有线程)只跟所有线程的循环次数有关系。
当线程组有n个线程,且循环次数为1的时候可以相互转换
函数
函数是完成某个指定功能代码的封装
函数助手对话框
菜单-工具->函数助手对话框
数据库
添加数据库jar包, 添加数据库驱动
测试计划-添加jar包到ClassPath,选中数据库驱动jar包
配置连接信息
JDBC Connection Configuration
Variable Name 数据库池名称-DBC请求时引用
Connection Pool Configuration 连接池配置
Max Number of Connections 最大连接数
Max Wait 最大等待时间毫秒
Auto Commit 自动提交
。。。
Database Connection Configuration 数据库连接配置
Database URL jdbc:sqlite:数据库db文件路径
JDBC Driver class org.sqlite.JDBC(sqlite驱动包内sqlite驱动的路径位置)
Username 连接数据库用户名
Password 数据库密码
发送sql语句请求
添加JDBC Request
Variable Name of Pool declared in JDBC Connection COnfiguration 添加配置的连接配置变量名
SQL Query 选择查询的类型
Select Statement
Update Statement
Callable Statement
。。。
Variable names 保存sql语句返回结果的变量名,可写多个变量名,西文逗号隔开
变量名_# 变量名获取的个数,即记录数
变量名_n 第几个变量,也就是返回第几条记录
如:
select count(*) from departments
Variable names 为 count
引用为num=${count_1}
通过察看结果树查看执行sql语句响应数据
通过Debug Sampler获取执行sql语句后的数据
sqlite
sqlite-jdbc-3.21.0.jar
Database URL jdbc:sqlite:数据库db文件路径
JDBC Driver class org.sqlite.JDBC
mysql
mysql-connector-java-5.1.35-bin.jar
Database URL jdbc:mysql://192.168.40.10:3306/mysql
JDBC Driver class com.mysql.jdbc.Driver
MySQL 报错: “Host ‘xxx‘ is not allowed to connect to this MySQL server"解决
use mysql;
select host, user from user;
update user set host = '%' where user = 'your_username';
flush privileges;
oracle(待测试)
ojdbc14.jar
Database URL jdbc:oracle:thin:@192.168.40.10:1521/orcl
JDBC Driver class oracle.jdbc.OracleDriver
oracle docker部署
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
docker run -d -it -p 1521:1521 --name oracle11g --restart=always registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
关联
一个请求响应的结果要作为另一个请求提交的数据(关联是后置处理器的一部分)
选中取样器-右键添加后置处理器中的一种
正则表达式提取器
Apply to
Main Sample only 之作用与范围的sample
要检查的相应字段
主体
Body(unescaped)
Body as a Document
信息头
Request Headers
URL
响应URL
响应信息
引用名称
要引用的参数名称,如填写title,则可用${title}引用它
正则表达式
制定规则的公式 ():括起来的部分就是要提取的数据。
1) .:匹配任何字符串。
2) +:一次或多次。
3) ?:在找到第一个匹配项后停止。
4) *:匹配规则内所有字符串
模板
$$格式;$1$表示解析到的第1个值;如果匹配有2个值,第二个值$2$,以此例推
匹配数字
-1代表全部取值,0代表随机取值, 1代表取第一个值
缺省值
没找到的时候的缺省值
XPath Extractor
适合于需要提取的文本
Apply to
Main Sample only 之作用与范围的sample
XML Parsing Options
Use Tidy
当需要处理的页面是HTML格式时,必须选中该选项。
引用名称
要引用的参数名称,如填写title,则可用${title}引用它
XPath query
制定规则的公式 ():括起来的部分就是要提取的数据。
1) .:匹配任何字符串。
2) +:一次或多次。
3) ?:在找到第一个匹配项后停止。
4) *:匹配规则内所有字符串
匹配数字
0代表随机取值,1代表取第一个值,-1代表取全部值
缺省值
没找到的时候的缺省值
JSON提取器
适合返回json的处理
Apply to
Main Sample only 之作用与范围的sample
Names of created variables
定义引用提取值的变量名,后面接口中使用${变量名}引用
Json Path expressions
填写JSON Path表达式,用来提取某个值
JSONPath表达式类似于XPath表达式。它们以美元符号($)开头,表示JSON文档的根
基本的JSONPath表达式:
$
$.store.book[*]
$.store.book[0].title
$.store.book[*].title
$.store.*
Match No.(0 for Random)
表示取值是第几个匹配结果,因为有可能XPath表达式会匹配到多个值。0表示随机,-1表示全部,1代表第一个,2代表第二个
Compute concatenation var(suffix_All)
勾选此项后,如果匹配到多个结果,JMeter会使用,将他们连接起来,存储在的变量中,会自动命名为_ALL
缺省值
没找到的时候的缺省值
断言
断言就是判断程序响应数据是否达到预期结果
选中取样器-右键添加断言中的一种
响应断言
Apply to
Main Sample only 之作用与范围的sample
测试字段
响应文本 *
响应代码 *
响应消息
响应头
。。。
模式匹配规则
包括
匹配
相等
字符串 *
否
或者
测试模式
添加测试模式
JSON断言
Assert JSON PATH exists
用于断言的JSON元素的路径(JSONPath)
Additionally assert value
是否额外验证根据JSONPath提取的
不勾选,验证JSONPath能否在JSON文档中找到路径
勾选,验证根据JSONPath提取值是否预期
Match as regular expression
不勾选,预期值不能使用正则表达式表示
勾选,预期值可以使用正则表达式表示
Expected Value
预期值 支持脚本语言写法
Expect null
还需要勾选“Additionally assert value”
勾选,验证提取的值为null
Invert assertion
若勾选,表示对断言结果取反
如 检测返回得code字段是否为200:
Assert JSON PATH exists
$.code
Additionally assert value
勾选
Match as regular expression
不勾选
Expected Value
200
Expect null
不勾选
Invert assertion
不勾选
大小断言
判断返回内容的大小, 包含: 全部响应、响应头部、响应主体、响应报文等等
Apply to
Main Sample only 之作用与范围的sample
响应字段大小
完整响应 *
响应头
响应的消息体
响应代码
响应消息
Size to Assert
字节大小+比较类型(=,!=,>,<,<=,>=)
断言持续时间
Apply to
Main Sample only 之作用与范围的sample
断言持续时间(毫秒)
集合点(同步定时器)
阻塞线程,直到指定的线程数量到达后,再一起释放,模拟并发
需求:对接口进行n个用户【同时】请求访问操作
选中取样器-右键添加定时器中的同步定时器
模拟用户组的数量设置为n
线程组线程数设置为n,循环次数设置为1
同步定时器
模拟用户组的数量
集合多少用户后再执行请求
超时时间(毫秒)
设置为0,无限等待,直到达到集合点设置的线程数
设置指定时长,如果到达指定时长,集合点数量未到达,集合多少用户释放多少用户数量
注意:
集合点只对一个请求起作用,如果针对指定请求起作用,放到该请求内
集合点对多个请求起作用,放到与请求平级同一层次
每秒请求数设置(常数吞吐量定时器)
常数吞吐量定时器可以方便的控制给定的取样器发送请求的吞吐量
需求:对接口进行每秒n个用户【同时】请求持续t秒
线程组设置
线程数 n
循环次数 t
选中取样器-右键添加定时器中的常数吞吐量定时器
2种方式(1比较稳定)
1
基于计算吞吐量-只有此线程
目标吞吐量-60
2
基于计算吞吐量-所有活动线程
目标吞吐量-n*60
如果需要无线循环,将线程组循环次数改为永远即可
参数介绍---
常数吞吐量定时器
目标吞吐量(每分钟样本量)
根据基于计算吞吐量填入
基于计算吞吐量
只有此线程
控制每个线程的吞吐量,选择这种模式时,总的吞吐量为设置的目标吞吐量乘以该线程的数量
所有活动线程
设置的目标吞吐量将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理的时间后再次运行。活跃线程指同一时刻同时运行的线程。
所有活动线程(共享)
与所有活动线程的选项基本相同。唯一区别是,每个活跃线程都会在所有活跃线程上一次运行结束后等待合理的时间后再次运行。
当前线程组的所有活动线程
设置的目标吞吐量将分配在当前线程组的每一个活跃线程上,当测试计划中只有一个线程组时,该选项和所有活动线程选项的效果完全相同。
当前线程组的所有活动线程(共享)
与当前线程组的所有活动线程基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程的上一次运行结束后等待合理的时间后再次运行。
每秒请求数设置(准确的吞吐量定时器)
准确的吞吐量定时器也可以方便的控制给定的取样器发送请求的吞吐量
需求:对接口进行每秒n个用户【同时】请求持续t秒
线程组设置
线程数 n
循环次数 t
选中取样器-右键添加定时器中的准确的吞吐量定时器
目标吞吐量(每个吞吐期间的样本)
n * t
吞吐量周期(秒)
t
测试持续时间(秒)
t
如果需要无线循环,将线程组循环次数改为永远即可
参数介绍---
准确的吞吐量定时器
目标吞吐量(每个吞吐期间的样本)
根据吞吐量周期要完成多少总并发填入
吞吐量周期(秒)
测试持续时间(秒)
函数
可以被认为是特殊值,可以填充测试树任何采集器或其他元素的字段
函数调用格式
有参数 ${__functionName(var1,var2,var3)}
无参数 ${__functionName}
如果函数参数包含逗号,请确保使用“ \” 转义,否则JMeter会将其视为参数分隔符
函数助手对话框
菜单-工具->函数助手对话框
常用的函数
_CSVRead函数 ${__CSVRead(path,0)}
参数1 csv文件路径
参数2 取第几列,从0开始
特点
不同的线程数才会影响取值变化,比较耗费资源
即同一个线程多次循环使用的是同一个值
_counter函数 ${__counter(FALSE,)}
参数1 TRUE,每个用户有自己的计数器;FALSE,使用全局计数器
_Random函数 ${__Random(1,6,)}
最大值和最小值整数
_time函数 ${__time(MM-dd hh:mm:ss,)}
参数1 格式化字符 09-24 03:43:20
_setProperty函数 ${__setProperty(depid,${depid},)}
把指定数据(必须是参数引用或静态数据)设置成全局变量
BeanShell执行${__setProperty(depid,${depid},)}
_property函数 ${__property(depid,,)}
获取Jmeter属性值
BeanShell取样器
支持java语法
把指定数据设置成全局变量
props.put("depid1", a);
获取全局变量
props.get("depid1");
打印
log.info();
。。。
分布式
一台电脑作为控制机(Controller),其它电脑做为执行机(Agent),控制机会把脚本发送到每台执行机上,执行机拿到脚本后就开始执行,执行机会把结果回传给控制机,控制机会收集所有执行机的信息并汇总
控制节
Jmeter.properties(bin目录)
remote_hosts=127.0.0.1:1099,127.0.0.1:1100
server.rmi.ssl.disable=true
根据执行机数量配置脚本线程数
并发1000,2个执行机,则线程数填500合适
启动
远程启动
远程全部启动
远程停止
远程停止所有
远程关闭
远程关闭所有
远程退出 将jmeter-server退出
远程退出所有 将jmeter-server退出
执行机
Jmeter.properties(bin目录)
server_Port=1099 默认1099
server.rmi.ssl.disable=true
启动分布式监听
windows jmeter-server.bat
linux ./jmeter-server -Djava.rmi.server.hostname=192.168.40.10
注意:
如果使用csv进行参数化,那么需要把参数文件在每台执行机上拷一份且路径需要设置成一样的
每台机器上安装的Jmeter版本和插件最好都一致,否则会出一些意外的问题
执行机上Jmeter也许需要配置JDK环境变量;
逻辑控制器
只对其子节点的sampler有效
控制类
如果(If)控制器
条件成真,则执行控制器下所有取样器
Expresson(must evalution to true or false)
如 ${__jexl3("${web}"=="百度",)}
ForEach控制器
ForEach控制器一般和用户定义的变量一起使用,在用户自定义变量中读取一系列相关的变量
用户定义的变量-变量格式如
web_1 百度
web_2 淘宝
web_3 京东
参数
输入变量前缀
开始循环字段(不包含)
结束循环字段(含)
输出变量名称 用于循环中使用 ${变量名}
是否勾选数字之间加上下划线
交替控制器
交替控制,该控制器包含的所有取样器,步骤交错执行在每个循环中
参数
是否忽略子控制模块
interleace across thraeds
不勾选 不同线程交替,Sample不会交替;同一线程不同循环,Sample会交替
勾选 不同线程交替,Sample会交替;同一线程不同循环,Sample会交替(推荐)
循环控制器
指定循环控制器内取样器的执行次数
循环次数
n或者永远
仅一次控制器
该控制器下取样器只执行1次
主要是在循环中使用,保证取样器只执行一次
随机控制器
随机执行其下的所某个请求
不同线程交替和同一线程不同循环都会随机,始终随机
随机顺序控制器
对控制器下所有采样器,随机产生1个执行顺序,进行执行
不同线程交替和同一线程不同循环产生1个执行顺序,进行执行
与随机控制器不同点
随机控制器-随机执行其下的1个请求
随机顺序控制器-随机执行其下的全部请求
While Controller 控制器
循环执行控制器内所有采样器,直到条件为假时,停止循环,可与计数器配合
Condition(function or variable)
如 ${__jexl3(${index}<${count})} index为计数器引用变量
当为LAST时和为空时-不探究
Switch Controller控制器
通过给该控制器中的value赋值,来指定运行哪个取样器
Switch Value
可为采样器名称;执行采样器名称相应的请求
可为索引 整数值 第一个为0
为空 默认为执行第一个
吞吐量控制器(了解)
吞吐量控制器(Throughput Controller)用来控制其下元件的执行次数,并无控制吞吐量的功能。
作用:控制其下的子节点的执行次数与负载比例分配
参数
Total Executions:按照次数来执行
percent Executions:按照百分比来执行
Per User:线程数,当选Total Executions时,是线程数;当选percent Executions时,是线程数*循环次数
分组类
简单控制器
只做分组使用,犹如打隔断
事务控制器
生成一个额外的采样器来测量其下测试元素的总体时间
这个时间包含该控制器范围内的所有处理时间,而不仅仅是采样器的
可通过聚合报告查看结果
可以添加多个sample,看他们事务的吞吐量等指标
图形监视器扩展插件
在客户端Jmeter工具中查看服务器(CPU、内存、网络、磁盘)的使用信息
客户端(JMeter)
下载插件
https://jmeter-plugins.org/downloads/old/
将ext目录下的文件粘贴到Jmeter的Lib目录下面的ext目录
服务端
下载性能监控插件
https://jmeter-plugins.org/wiki/PerfMonAgent/
添加监听器-jp@gc - PerfMon Metrics Collector
添加监控指标
Host/IP
Port
Metric to collect
CPU
Memory
Disk I/O
...
所有数据写入一个文件 可指定文件
解压到服务器任意目录
启动
Windows startAgent.bat
Linux startAgent.sh
默认4444(4444为启动服务器监听服务程序时的端口号)
API文档解析
href节点
作用:href节:为资源的请求地址;
(请求资源集合时的请求地址要与**href相符**)
items节点
作用:为服务器响应数据时返回的资源属性;
(请求接口时,返回的资源属性要与items里的属性相符)
Links节点
作用:为在当下资源下能连接到的直属下一资源
(比如:A资源直接包含或关联着B、C两个资源,如果访问到A资源时,Links应定为到B和C)
templates节点
作用:为新增和更新资源时所需要的属性
(新增和更新资源时所需要的JSON报文属性)
queries节点
作用:为资源支持的查询列表参数名和查询条件
(资源支持哪些属性可以list查询;支持做查询条件的属性)
error节点
出现错误时,返回的报文格式和属性
功能脚本设计
每个接口为一个线程组,例如:(查询所有、查询指定、新增、更新、删除)
学生信息-功能脚本
HTTP信息头管理器
HTTP请求默认值
学院-查询所有
学院-查询指定
学院查询-List-$dep_id_list
学院查询-List-$dep_name_list
学院查询-List-$master_name_list
学院查询-List-$slogan_list
学院查询-模糊
学院查询-组合
学院-新增
学院-更新
学院-删除单个
学院-删除多个
查看结果树
为独立运行每个线程组,需要勾选独立运行每个线程组,即一个线程组结束后才会运行下一个线程组
接口用例设计
用例设计原则
覆盖所有的必选参数
组合可选参数
参数边界值
如果参数的取值范围是枚举变量,需要覆盖所有枚举值
空数据
包含特殊的字符
越界的数据
错误的数据
测试数据分类
正向:(根据测试用例覆盖面设计正向测试数据)
逆向: (根据测试用例覆盖面设计逆向测试数据)
正向方法
传入所有可传属性,且格式正确
传入必填属性,且格式正确
逆向方法
为空校验
为空格校验
前后含空格校验
超长校验
类型校验
含特殊字符校验
删除引用校验
唯一不重复属性校验
自动化脚本设计
后台程序更新/发布新版之前需要验证下之前的功能是否能用
自动化脚本设计原则
每个测试用例都是独立的
测试用例都是可重复运行的
测试数据与业务相分离(测试数据包括参数接口数据/ 测试执行所需要的系统数据)
测试完成后,要删除不必要的测试数据。
参考https://blog.csdn.net/NHB456789/article/details/140150024
数据驱动ddt
CSV数据驱动+HTTP取样器
csv数据 如
序号 用例标题 请求方式 接口地址 参数输入 期望返回
都可以作为变量在jmeter中使用
如参数输入需要用到jmeter的变量,csv中参数输入可以包含${变量}形式,jmeter使用${__eval(${参数输入})}
测试结果校验
响应断言+CSV数据驱动(期望返回)
接口依赖处理
将需要依赖的接口作为前置操作
如果csv数据上传参数需要依赖的接口返回值,可使用${__eval(${参数输入})}
公共数据管理
自定义变量或者默认HTTP请求默认值以及HTTP信息管理器
多接口批量执行
一个接口一个测试片段,通过模块控制器运行
性能脚本设计
新增、更新、删除:使用固定数值,比如新增100条,更新100条,删除100条
查询:采用虚拟用户数和持续时间配合(比如,100用户,持续查询600秒)
参数化
参数化尽量避免采用从外部读取参数,使用固定参数+函数形式( 如:${__counter(TRUE,)})
察看结果树
必须清除单个接口内察看结果树
(如不去掉,非常占用测试机自身性能)
报告
性能报告可根据实际需求选择,建议保留添加聚合报告
线程组
增删改查每一个功能点,都需建立单独线程组,而避免在同一个线程组内添加
多个HTTP请求完成增删改查(一便参数化对单个请求做压测和并发)
分布式
如并发数量大,采用分布式测试
聚合报告参数
Label
Samples 用同一个请求取样器,发送请求的数量
Average 请求的平均响应时间
Median 中位数。50%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第50%的值。
90% Line 90%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第90%的值。
Min 针对同一请求取样器,请求样本的最小响应时间
Max 针对同一请求取样器,请求样本的最大响应时间
Error % 出现错误的请求样本的百分比
Throughput 吞吐量
Received KB/sec 收到的千字节每秒的吞吐量测试。
Kb/sec - 发送的千字节每秒的吞吐量测试
术语
QPS
Query Per Second每秒查询率。是一台查询服务器每秒能够处理的查询次数。
可通过常数吞吐量定时器实现
响应时间(RT)
响应时间是指系统对请求作出响应的时间
吞吐量(Throughput)
单位时间内服务器处理的客户端请求数量
通常情况下,吞吐量用“请求数/秒”或者“页面数/秒”来衡量。
从业务角度来看,吞吐量也可以用“业务数/小时”、“业务数/天”、“访问人数/天”、“页面访问量/天”来衡量。
从网络角度来看,还可以用“字节数/小时”、“字节数/天”等来衡量网络的流量
并发用户数
多个用户同一时间操作同一业务
并发用户数的时候一般结合集合点(Synchronizing Timer)一起使用;
生成HTML报告
命令行生成
生成结果文件
jmeter -n -t 测试文件 -l 运行结果文件
-n :以非GUI形式运行Jmeter
-t :source.jmx 脚本路径
-l :运行结果保存路径(.jtl)
生成结果文件和HTML报告
jmeter -n -t 测试文件 -l 运行结果文件 -e -o 报告目录
-n :以非GUI形式运行Jmeter
-t :source.jmx 脚本路径
-l :运行结果保存路径(.jtl)
-e :在测试结束后生成HTML报告
-o :指定用于生成HTML报告的目标目录
通过结果文件生成HTML报告
jmeter -g 运行结果文件 -o 报告目录
-g :指定结果文件(.jtl)
-o :指定用于生成HTML报告的目标目录
GUI生成(通过结果文件生成HTML报告)
菜单-工具-Generate HTML report
填写results file
填写user.properties 在bin目录下
填写ouput directory
报告解读
报告分为3个部分
Dashboard:提供了整体的概览信息,显示了关于测试结果的总体摘要。
Charts:提供了关于性能指标的图表,如吞吐量、响应时间、活跃用户数等。
Custom Graphs:允许根据自己的需求创建和显示自定义的图表。
Jmeter其他功能点
Jmeter FTP
可以根据FTP服务器进行上传和下载文件(上传、下载需要权限)
线程组->取样器->FTP请求
上传
须填写
服务器名称
远程文件
本地文件
需勾选 put
下载
须填写
服务器名称
远程文件
本地文件
需勾选 get
Jmeter test fragment
测试片段元素是控制器上的一个种特殊的线程组,它在测试树上与线程组处于一个层级
把单独功能脚本封装起来,待需要使用的时候,直接引用;类似于python中的函数或模块
测试片段被引用执行两种方式
模块控制器可以引用执行测试片段
选中要运行的模块即可
Include Controller控制器也可以引用和执行片段
此处是填写jmx文件名(并不是将测试片段另存为jmx,而是将测试片段下的内容右键保存测试片段为jmx)
Jmeter非测试元件
HTTP镜像服务器
测试计划->非测试元件->HTTP镜像服务器
在本地临时搭建一个HTTP服务器,该服务器把接收到的请求原样返,这样就可以看到发送出的请求的具体内容,以供调试
HTTP(S)测试脚本记录器(HTTP代理服务器)
不太好用
监听浏览器代理,记录基于代理浏览器所有的请求,并以Jmeter可执行的脚本格式保存
属性显示
测试计划->非测试元件->属性显示
以GUI图形界面显示Jmeter配置属性或者系统属性
Jmeter ip欺骗
添加CSV Data Set Config(所有线程),获取csv中的ip到如ip变量(前提是本机配置了这些ip)
HTTP取样器中高级设置配置客户端实现,配置原地址为${ip}