一、json提取token的方式
(在压测过程中经常会使用到提取登陆接口的token,则可以采用json提取器或者是正则表达式的方式。本人比较常用json提取器,若要使用正则可百度)
jmeter官方文档:jmeter.apache.org/usermanual/…
json提取器
- a、登陆接口执行完毕后,在查看结果树中切换成json path tester模式在json path expression中进行调试。可通过调试知道写入的json提取表达式是否正确。如下图
- b、使用在结果树中调试成功的json表达式,写入到json提取器中。如下图
json提取器中的字段说明
- Apply to:应用范围,一般选择默认的,不需要更改
- Names of created variables :接收值的变量名,自定义,多个变量用分号分隔
- JSON Path expression: json path表达式,若是多个变量也是用分号分隔
- Match No.(0 for Random):0表示随机. n取第几个匹配值.-1匹配所有。若只要获取到匹配的第一个值,则填写1
二、token设置为全局
token提取后设置为全局后可用在整个测试计划中
步骤:
- 在登陆接口下新增beanshell后置处理程序
- 通过函数助手setproperty来实现设置为全局变量
- 其他线程组若要使用该变量则再使用函数助手_p即可
函数助手之setproperty用法:如下图
- Name of property:属性名称
- Value of property:属性值
- Return Original Value of property (default false) :是否返回原始值,当设置为true,将返回原始值。一般可不输入
函数助手之_p的用法:如下图
若是其他线程组需要用到token值则添加一个http信息头管理器,并把生成的函数放在http信息头中作为请求的headers
三、处理不同的登陆token依次访问其他接口(线程组)
- 项目背景:登陆账号后该用户访问报名接口、我的页面等
- 要求:每一个登陆的账号都需要去访问报名接口、我的页面接口。如用户一登陆成功后访问其他接口,用户二登陆后再去访问相同的接口 分场景处理。
- 场景一:多个用户访问同一套接口。(即处理不同用户的登陆访问其他线程)
- 场景二:一个用户多次访问同一套接口。(这个只需要把登陆token用在全局,其他接口线程组/循环次数设置*次即可)
步骤:
- 在登陆接口下新增beanshell后置处理程序(把所有登陆的token存入到一个csv文件中)
- 在其他线程组中新增csv数据文件设置(依次读取token文件中的token)
- http信息头管理器中引用文件中的token值
- 新增BeanShell 取样器清除csv文件,防止下一次执行脚本的时候token已经失效问题(我是直接删除csv文件)
在登陆接口下新增beanshell后置处理程序。如下图
脚本如下:(复制进beanshell的时候要注意缩进)
FileWriter fileWriter = new FileWriter(new File("E:\user_token.csv"), true);//文件位置 BufferedWriter writer = new BufferedWriter(fileWriter); writer.append(vars.get("access_token")+","+vars.get("mobile")+"\n");//获取到token及手机号码存入到csv文件中
writer.close();
fileWriter.close();
在新的线程组下(哪些需要用到这些token的就放在哪些线程组下)新增csv数据文件。如下图
注意文件名中的路径、文件编码、变量名称
http信息头管理器引用文件中的token值。如下图
beanshell取样器生成的token文件。如下图
数据清除一般是放在teardown(后置条件中) 脚本如下:
File f = new File("E:\user_token.csv");
f.delete();
四、随机生成姓名
函数助手mock用法,如下图
可随机生成姓名
- 先下载mock包
- 下载完成后将jar包放在jmeter安装目录下的lib/ext文件夹下重启jmeter即可使用mock函数助手
五、导入Python脚本
(百度了很多,有使用jsr223.这个需要导入一个jar包并且Python只支持<2.7版本.我的Python版本是3.7,使用的是beanshell预处理程序)
beanshell预处理程序
脚本如下(直接复制的记得要看下会不会缩进有问题等):
import java.io.BufferedReader; import java.io.InputStreamReader;
// 1. 脚本的路径 String command = "cmd /c python C:\Users\cblink\Desktop\new_ssn.py";
String var; Runtime rt = Runtime.getRuntime(); Process pr = rt.exec(command);
pr.waitFor();
BufferedReader b = new BufferedReader(new InputStreamReader(pr.getInputStream())); String line = ""; StringBuilder response = new StringBuilder(); while ((line = b.readLine()) != null) { response.append(line);
} String response_data = response.toString();
System.out.println(response_data); b.close();
var = response.toString();
// 2. 定义Jmeter中引用的变量名 vars.put("card_id",var);
导入的Python文件(new_ssn.py)代码如图:(主要是用faker库随机生成合法的身份证号码)
五、随机生成的姓名用在同一个线程组(前面的步骤组合使用)
项目预期:在一个线程组中都使用随机生成的同一个姓名。如一个线程组中有接口a、接口b则在接口a中使用到了随机生成的name,则需要把这个接口a的name用在接口b。
步骤:
- beanshell预制处理器执行Python脚本【实现随机生成姓名】脚本如第五点。如下图一
- 添加BeanShell 后置处理程序【设置“姓名”为全局变量】。如图二
- 添加http请求中接口一参数使用${ename}【执行随机生成姓名的Python代码】。如图三
- 添加http请求中接口二参数使用${__P(ename,)} 【取全局变量ename】。如图四
六、响应断言
判断接口返回的数据跟预期数据是否一致,来判断接口是否真的请求成功
一般选择默认的即可。在测试模式中可输入正则匹配、变量等。不一定是断言固定的值
七、jmeter连接数据库
项目预期:连接数据库后在**表中查询出name=**的数据,并获取到name=**的id作为下一个接口的变量
步骤:【先确定jmeter/lib文件下是否有mysql-connector-java-..**.jar包。正常情况下这个包是不需要单独下载的。如果在lib目录下没有这个jar包的话自行百度下载】
- 新增JDBC Connection Configuration(连接数据库配置)
- JDBC Request。输入需要操作数据库的查询语句、获取到数据库中查询结果的id等操作
- http请求,把JDBC Request中的id作为http请求中的变量,进行接口请求
JDBC Connection Configuration
Variable Name Bund to pool:绑定到池的变量名,该变量名需要和JDBC request、JDBC PreProcessor、JDBC PostProcessor中的变量名一致。
字段含义摘自:blog.csdn.net/m0_59856692…
| 字段 | 含义 |
|---|---|
| Max Number of connection | 数据库最大连接数(做性能测试时,建议填 0 如果填了10,则最大连接10个线程) |
| Max Wait(ms) | 数据库链接最长等待时长 |
| Time Between Eviction Runs(ms) | 线程可空闲时间,单位毫秒 如果当前连接池中某个连接在空闲了 time Between Eviction Runs Millis 时间后仍然没有使用,则被物理性的关闭掉 |
| Auto Commit | 默认即可,True:自动提交// False:不自动提交 //Edit(编辑):自己通过jmeter提供的函数设置自动提交sql语句,如:修改数据库时,自动 commit Transaction isolation 事务隔离级别Preinit Pool |
| Transaction Isolation | 事务间隔级别设置(默认即可,default) |
| Preinit Pool | 立即初始化连接池。如果为false则第一个jdbc请求的响应时间会比较长,包含了连接池建立的时间 |
| Init SQL statements separated by new file | 想要插入的sql语句(一般都不写) |
Connection Validation by Pool: 验证连接池是否可响应 Test While Idle:当连接空闲时是否断开 Soft Min Evictable Idle Time(ms):连接在池中处于空闲状态的最短时间 Validation Query:一个简单的查询,用于确定数据库是否仍在响应 默认为jdbc驱动程序的isValid() 方法,适用于许多数据库
Database Connection Configuration: 数据库连接配置
Database URL: 数据库连接 URL(允许执行多条sql)
url格式:jdbc:mysql://host/database
JDBC Request
各参数可参考:www.jianshu.com/p/b890fb953…
若是要使用到查询语句的返回结果时,则需要设置Variable names值
八、计数器
如果需求中需要增加大量的数据且某个字段不能重复则可以使用计数器完成。
若是请求数据库后返回的数据进行循环请求,如连接数据库查询到表a中的id,使用这些id依次进行请求可计数器跟循环控制器结合使用
starting value:输入开始数字。例如1,在执行脚本时就从1开始。
递增:每次迭代增加的值。
maximum value:计数最大值,超过此值重新开始计数
数据格式:可以不输入。例如输入000,那么将从001开始计数。
引用名称:调用参数的名称。接口需要引用该参数时就是使用该名称
与每用户独立的跟踪计数器:默认不勾选,即全局计数器。勾选按照用户进行计数。
在每个线程组迭代上重置计数器: 可选,仅勾选与每用户独立的跟踪计数器时可用;如果勾选,则每次线程组迭代,都会重置计数器的值,当线程组是在一个循环控制器内时比较有用。
如图。使用计数器,引用名称为n时,添加http请求引用${n}这个n则会根据计数器的方式进行一次递增
九、循环控制器
项目需求:用户报名并审核通过后会有报名id,再根据该报名id依次进行打榜
步骤:
- 创建连接数据库操作并在数据库中查询到报名id,取出该报名id(参考前面连接数据库操作即可)
- 添加循环控制器(设置循环值)
- 在循环控制器下新增计数器(依次取出报名id用于http请求)
- 添加http请求(根据报名id依次请求打榜接口)
循环控制器--设置循环次数
当遇到需要循环请求的时候可用,需要设置循环次数。循环次数可以是固定的值也可是一个引用的变量如:${nun}
新增计数器
引用名称中也可是一个引用的变量
http请求
在计数器中的引用名称作为http请求的下标。如果是固定引用则使用{_V(id${num},)},使用函数助手v得到,_v函数:V(变量)函数返回对变量名表达式求值的结果。这可以用来计算嵌套变量引用(目前不支持)。可以跳转到帮助文档中查看使用方法
十、if控制器
有的http请求时需要判断某变量的结果是否符合来决定是否要请求(控制器之外的请求不影响)
项目需求:报名成功之后需要判断该报名结果是否通过,若是通过再使用该id作为点赞参数执行点赞接口
可参考(里面有比较详细的说明):www.cnblogs.com/xyztank/art…
步骤:
- 添加http请求a(http请求下添加json提取器、响应断言)
- 添加if控制器(在if控制器下添加http请求b,如果请求a在if控制器中结果是false则不执行if控制器下的请求)
if控制器
条件有两种写法。推荐第一种
- 第一种:使用函数助手jexl3的方式,在if控制器中警告栏也是有提示。如图一、二
- 第二种:如果json提取器中取出来的值status作为判断条件,则在条件中输入"${status}"==1(表示状态==1,若是ture则执行if控制器下的脚本,false则不执行),一定要取消勾选
Interpret Condition as Variable Expression?选项。 如图三
79
十一、用户定义的变量
用户定义的变量为全局变量,不管是用户定义的变量组件在线程组a下还是说在线程组a外面,用户定义的变量在所有线程中都能被调用
使用如下(为方便查看把参数拼接到了请求名中)
十二、函数助手-csvread使用
导入的文件建议使用txt文档,文档列与列之前使用英文的,分隔开即可
十三、函数助手-random使用
一般用于批量输入手机号码且手机号码不能重复时即可使用_random解决(点击帮助的话会有帮助手册来告诉你使用方法)
十四、逻辑控制器-循环控制器
循环控制器需要使用永远时跟线程组中的调度器配合使用,如果没有开启线程组的调度器及配置,则循环控制器不生效
十五、非gui运行模式
非gui运行模式命令解析
在jmeter中的bin目录下进入cmd页面后输入命令如下(可以直接在jmeter中的bin目录中,cmd+enter键能直接调出cmd窗口):
jmeter -n -t C:\Users\jmeter\apache-jmeter-3.3\bin\painting.jmx -l C:\Users\html\test-01.csv -e -o C:\Users\results
- -n 非gui模式下执行jmeter
- -t 执行测试文件所在的位置
- -l 指定生成测试结果的保存文件,如jtl格式,txt格式
- -e 测试结束后,生成测试报告
- -o 指定测试报告的存放位置
- C:\Users\jmeter\apache-jmeter-3.3\bin\painting.jmx:需要运行的jmeter脚本文件
- C:\Users\html\test-01.csv:生成的表格形式的报告。也可以是jtl格式、txt格式
- C:\Users\results:需要把报告放在的位置(不存在的话会自动帮你新建)
执行成功之后会在jmeter-bin目录下生成results(报告)文件
删除生成的报告文件命令
删除生成的报告文件除手动删除外还可使用命令进行删除。命令如下
- del /s /Q C:\Users\jmeter\apache-jmeter-3.3\bin\result.jtl //删除jtl文件(jtl文件路径要写对)
- rd /s /Q C:\Users\jmeter\apache-jmeter-3.3\bin\report //删除report文件夹
如果手动删除麻烦时,可以写一个.bat文件
把需要执行的命令写进bat文件中,需要的时候执行一下.bat文件即可
- del /s /Q C:\Users\jmeter\apache-jmeter-3.3\bin\result.jtl
- rd /s /Q C:\Users\jmeter\apache-jmeter-3.3\bin\report
html性能测试报告分析
Test and Report informations:测试和报告信息
- APDEX(Application Performance Index):应用程序性能满意度的标准,范围在0-1之间,1表示达到所有用户均满意,越接近1满意度越高
- Requests Summary:请求的通过率(OK)与失败率(KO),百分比显示
- Statistics:数据分析,基本将Summary Report和Aggrerate Report的结果合并
- Errors:错误情况,依据不同的错误类型,将所有错误结果展示
- Charts:用图表的形式展示测试数据,让测试报告更加直观
主要有如下特点:
(1)将测试过程中经常使用的数据,用图表的形式展示,让测试结果更加直观
(2)每个图表数据,有两种展示形式
(3)支持请求样例过滤显示
(4)支持导出PNG图片格式
Over Time Charts:
- Response Times Over Time:每秒钟响应时间,X轴表示的是系统运行的时刻,Y轴表示的是响应时间,F(X,Y)表示系统随着时间的推移,系统的响应时间的变化,可以看出响应时间稳定性
- Bytes Throughput Over Time:字节接收与发送的数量,每秒传输字节吞吐量,表明Jmeter在测试时,随着时间推移发送和接收的字节数
- Latencies Over Time:延迟时间
Throughput:
- Hits Per Second: 每秒点击率
- Codes Per Second:每秒状态码数量
- Transactions Per Second:每秒事务量
- Response Time Vs Request:响应时间点请求的成功与失败数
- Latency Vs Request:延迟时间点请求的成功与失败数
Response Times :
- Response Time Percentiles:响应时间百分比
- Active Threads Over Time:激活线程数
- Time Vs Threads:响应时间用户数, X轴表示的是活动线程数,也就是并发访问的用户数,Y轴表示的是响应时间,F(X,Y)表示在某种并发量的情况下,系统的响应时间是多少
- Response Time Distribution:响应时间分布