一、性能基础知识
1.性能测试的基本概念
1)性能测试:利用自动化脚本或者工具对北侧系统添加一定的负载进行测试,观察系统的性能指标是否满足用户需求或者得到相关性能指标,并进行性能优化工作。
性能测试的目的:不完全是为了找bug,而是为了验证系统是否满足用户的需求挥着做出系统的性能瓶颈、性能指标
性能测试手段:工具
jmeter:基于线程
loadrunner:基于线程
locust:基于协程;python第三方库,只能用于压测
2)负载:用户层面--用户、电脑ip;代码层面--线程、进程、协程
3)宕机:死机
4)性能指标:
①响应时间RT(response time):反应了服务器处理请求的快慢(服务器处理速度、网络传输、带宽),请求或者某个操作从发出的时间到服务器响应的时间的差值
②服务员使用率:
cpu:计算机做运算,中央处理器(central processing unit)作为计算机系统的运算和控制核心,-是信息处理、程序运行的最终执行单元;关注点:处理队列、使用率;一般建议cpu率在70-80%;
disk:硬盘,固态硬盘--通过电信号存储数据;机械硬盘--通过接卸的方式把数据存储到磁盘上面
network:网络带宽(带宽、网卡设备),影响到数据传输;关注点:把吞吐量进行单位换算
memory:内存,临时存放数据(变量、对象);当计算机重启、掉电后数据不存在;虚拟内存(linux:swap分区):把硬盘挪用一部分出来当着内存使用;大小:一般是物理内存的2倍;物理内存运行速度大约是机械硬盘的100倍;
③TPS(transtraction per secong)每秒事务数:反应服务器处理的能力,单位时间内服务器处理事务的数;
计算公式:用户数/(等待时间+响应时间RT)
行业TPS参考值:
金融:1000-50000tps
保险:100-10000tps
电商/大型互联网:10000-10000000tps
小型互联网:500-10000tps
制造业:10-5000tps
计算方式和实例:
④QPS(query per second):每秒查询数,针对数据库而言,反应服务器处理的能力
⑤FPS(frame per second):每秒发送帧数,针对游戏测试,反应服务器处理的能力
⑥吞吐量(throughtput):单位时间内服务器处理请求的量
量:可以是氢气数(请求数/s),也可以是字节数(bytes/s),字节数/s居多
TO:throughtput out服务器返回的量(响应)
TI:throughtput in进入服务器的量(请求)
⑦HPS(hits per second):每秒点击数,反应客户端向服务器发送请求的能力;
⑧错误率/成功率:错误率=请求发生错误的数量/总的请求数
一般要求错误率:0.6-5%
⑨并发数:用于并发操作用户数量
计算:
方式1:估算,最大在线用户数8-12%
方式2:公式估算
方式3:通过tps计算得到
⑩pv(page view):页面浏览量,只要浏览某个页面就会统计
uv(unique visitor):独立访客,通过客户端的cookies实现,即同一页面,客户端多次点击只计算一次,访问量不累计;
ip:即客户端使用同一个ip访问多次只计算一次,访问量不累计。
5)慢sql:sql运行很慢
6)并发:多用户在某个时间点(集合点)一起做同一个操作
并行:多个操作一起运行
7)集合点:用于并发操作,多个用户为了实现并发,在某个点进行集合,等到一起再去做相同的操作;
8)吞吐量:反应服务器处理请求的能力,系统单位时间内处理了多少字节的请求
9)性能脚本术语:实现性能测试脚本都会用到这些概念
参数化=》
关联=》后置处理器
集合点=》同步定时器
事务=》事务逻辑控制器
模拟用户真是场景:
①定时器(固定定时器、高斯定时器)
②获取HTML资源
检查点=》断言:针对接口、关键性的业务做断言,目的是为了得到错误率
2.被测对象
代码:代码+多线程
web(协议请求):代码、工具+多线程
app、c/s:服务器--代码、工具+多线程;客户端--工具;考虑app、c/s程序载体(手机、pc)
3.核心技术
1)多线程/多进程/多协程,模拟多用户(负载)
2)尽可能模拟用户真实场景:
①访问系统
②前端相关静态资源
③思考时间(等待时间):固定思考时间、随机思考时间
3)基于协议
①http、https、websocket等
②python脚本:requests库
4.为什么做性能测试
1)在一定负载下长时间运行,系统是否可以正常处理请求;
2)有些bug必须在大压力条件下才会被发现:内存泄漏、慢sql、线程池处理、多线程回收(垃圾回收机制)
3)性能指标是否满足需求(需求规格说明书里面有一定的需求)
①承载压力有多大
②在大压力情况下成功率必须是多少,错误率不能超过某个值
③响应时间
④并发用户数
5)节约服务器资源开销,降低成本
服务器资源:cpu、memory、disk、network(网络带宽)
6)性能测试是测试六大类型里面必测项之一
5.分类
1)负载测试(load testing)
概念:在一定的软硬件以及为网络环境下,向系统改变负载方式,增加负载观察系统的性能指标,是否存在性能瓶颈;
目的:得到最佳用户数、最大用户数
场景:拱型场景
标准的负载模型(如何找最佳用户数、最大用户数)
最佳用户数:系统的各项性能指标都属处于相对最优的情况
2)压力测试(stress testing)
概念:在一定的软硬件以及网络环境下,向北侧系统添加大量的负载(最佳用户数、最大用户数)进行长时间运行观察性能指标得到性能瓶颈
目的:找到性能瓶颈
场景:门型场景
3)容量测试(volume testing)
概念:在一定的软硬件以及网络环境下,向被测系统的存储设备构造大量的不通过数据,添加一定的负载进行长时间运行,观察性能指标
目的:得到存储设备容量,慢sql(存储设备:数据库、文件服务-专门用于存储系统文件,最终数据都写入磁盘处)
场景:
4)并发测试
概念:在一定的软硬件以及网络环境下,向被测系统某个功能模块一次性添加大量的负载,并长时间运行,观察系统的性能指标
目的:看系统是否存在慢sql、线程锁(线程池)、锁表
集合点:
5)基准测试
概念:在一定的软硬件以及网络环境下,向被测系统添加单个或者多个负载进行性能测试,验证性能测试环境、性能测试脚本是否存在问题。
目的:验证性能测试环境、性能测试脚本,得到基础数据
6)稳定性测试
概念:在一定的软硬件以及网络环境下,向被测系统添加一定的负载并模拟用户真实操作并长时间(3*24 7*24)运行,观察系统性能指标;
目的:稳定性(尽可能模拟用户真实的场景:环境、操作、长时间)、慢sql、内存泄漏、宕机
需求:7*24、2*24程序中断=>接下来是跑7*24还是5*24=>7*24
内存泄漏=>内存消耗接近100%,程序会中断(oom复位:out of memory内存溢出)
7)配置测试(configration testing)
概念:在一定的负载下,通过调整软件、硬件环境让被测系统性能指标最优配置;
目的:得出被测系统软件、硬件最佳配置
软件:tomcat(内存:jvm内存、线程数)、redis(缓存数据库)、mysql(是否启动缓存,主要针对查询)
硬件:服务器(使用多少台服务器、cpu、memory、disk、network)
6.怎么做性能测试
关注点:
1)被测系统是否满足用户的性能需求;
2)被测系统的性能指标;
3)被测系统支撑的最佳用户数和最大业务量;
4)系统是否存在慢sql;
5)被测系统的内存、线程资源是否得到合理的回收、利用;
6)被测系统是否能够支持长时间运行;
7)被测系统出现性能问题后导致奔溃,是否可以恢复;
流程:
1)需求分析:
①分析被测系统有没有必要进行性能测试(非所有系统都要进行性能测试)--使用用户数大、客户(甲方)要求、系统数据量大(慢sql)、可能存在并发的情况;
②分析被测系统那些功能、模块需要进行性能测试;
③需要数据(被测数据和指标数据)支撑:
老产品:测试数据可以来自于运维、前端开发(埋点:数据采集的方法通常由前端完成);每个功能模块的用户访问量以及访问用户发展趋势;得出系统现阶段、未来的某个时间点的用户体量;
新产品:市场调研、参考同类竞品
常见的性能场景:
①能力验证:在要求平均响应时间小于2秒的前提下,如何判断系统是否能够支持50万用户/天的访问量;基准测试、负载测试、压力测试(可选);
②规划能力:某某系统计划在一年内获取用户量达到100万,系统到时候能否支持这么多用户量?如果不能支持如何调整系统的配置;基准测试、负载测试、配置测试;
③性能调优:某某系统上线运行一段时间后响应速度越来越慢(服务器、开发的被测系统),此时应该如何处理;基准测试、负载测试、配置测试;
④缺陷发现:某些缺陷只有在高负载的情况下才能暴露出来,如线程锁或内存泄漏;并发测试、压力测试、稳定性测试;
2)设计:
性能测试方案:
①测试目的:
②测试范围:
③组织架构:
④测试环境:性能测试环境和系统测试环境完全不一样,性能测试环境接近真实环境;如果性能测试环境无法达到真实环境,如何开展性能测试?
⑤测试准备:测试数据准备
⑥测试设计:业务场景分析--根据业务需求去设计场景,根据场景选择测试类型;业务建模--系统一般情况用户访问量最大的时间段,二八原则中80%的业务量集中在20%的时间段内并关注20%的时间段;漏斗模型
⑦确定测试类型:基准、压力、并发、稳定性、配置等
⑧测试工具:jmeter、loadrunner
⑨测试启动/暂停/再启动的准则:
3)实现:
脚本实现:
①基于协议脚本调试:
单用户单迭代:一个线程只循环一次
单用户多迭代:一个线程循环多次
多用户单迭代:多个线程循环一次
多用户多迭代:多个线程循环多次
②根据场景、业务模型选择对应工具实现性能测试脚本
③模拟用户真实场景:构造多用户、模拟用户的界面访问(除开接口、html请求之外的js、图片、css等请求,即获取前端界面静态资源)、思考时间(等待时间)、模拟并发数、参数化(随机选择)、带宽(网络带宽)、数据库容量(稳定性、容量测试)、是否使用缓存(mysql自带缓存、redis:内存数据库,NoSQL非关系型数据库)、请求数据大小、发送请求的客户端和web服务不能在同一台电脑上
4)执行:
①搭建性能测试环境:被测系统的测试环境、测试监控工具的环境(全链路监控工具pinpoint)
②测试数据准备
③执行性能测试脚本:收集性能测试结果(数据、图表)
5)性能结果分析:
①根据执行阶段的数据结果进行性能分析,得出性能指标结果,找出性能瓶颈
②如果存在性能瓶颈,待开发优化后,再次运行、分析
③出性能测试报告:测试目的、测试结果、测试结果分析过程、风险说明
二、性能测试工具之jmeter
1.初识
开源免费、java语言开发,基于多线程,默认(jvm内存设置)可以模拟虚拟用户数300-500个,最大达到一千多;支持跨平台(可以在windows、linux等多个平台运行);支持分布式执行;
2.jmeter安装、环境配置以及安装包:
1).环境变量配置:
2).以下为jmeter和jdk安装包,其中直接安装jdk文件并配置环境变量后直接打开Apache-jmeter。bat文件即可直接使用(永久免费)
链接:https://pan.baidu.com/s/1DZn7tWjtLzO1K-IBm5yAbA
提取码:pxuo
3. jmeter的常见组件
http组件运行顺序:按照组件的类型进行运行,同类型的组件按照位置的先后顺序运行;组件运行顺序是配置元件-前置处理器-定时器-取样器-后置处理器-断言-监听器;
jmeter核心组件:测试计划、线程组、监听器、配置元件
1)线程(用户):
setup线程组:前置
teardown线程组:后置
死循环:持续30s运行
2)取样器
①http请求:
http请求进行文件上传:
②调试取样器:显示变量取值
3)监听器
①查看结果树:查看当前线程组所有http请求的结果
②聚合报告:收集性能测试数据;总览数据(以功能请求/事务为维度)
③用表格查看结果:
明细数据:每发送一次收集一次数据
4)断言
如果针对具体的http请求的断言只需要通过http请求的右键添加;如果是线程全局断言是针对全局有效,一般断言放在对应的请求之后;
5)配置元件
①参数化(常见4种方式):是一种常见的应用
在jmeter里面变量的引用:${变量名}
第一种:用户定义变量(配置元件):适用于单用户参数
用户定义的变量在http请求出使用
第二种:用户参数(前置处理器):针对多用户,不同用户取值不同,超出后循环取值
其中用户数与线程数需配置一致
第三种:csv文件(配置文件):
操作步骤:准备csv文件--添加‘CSV数据文件设置’组件
第四种:函数助手(函数助手对话框):
入口:
语法:${函数名(参数1,参数2,.......参数n)},其中多个参数可以直接拼接在一起,以下以手机号码为例
②HTTP信息头管理器
用于管理http协议请求头部信息
③http请求默认值:用于添加http请求基本请求数据(协议、host/域名、端口号、编码格式)
④http cookie 管理器:全局管理cookie信息
需要勾选反复清除Cookie
⑤JDBC:
java database conection使用Java连接数据库,目的就是操作数据库
学习内容:使用对应的jar包操作mysql数据库
实现步骤:
第一步:准备操作对应数据库的jar包,操作mysql数据库的jar包:mysql-connector-java-5.1.16.jar;
第二步:把第一步中准备好的jar包放在jmeter安装目录下/lib/ext目录下;
第三步:如果jmeter处于运行状态,则重启,否则启动;
第四步:连接数据库,在配置元件处的JDBC Connection Configuration
url数据库说明:
也可将数据库的用户名和密码放在url中
第五步:操作数据库
参数的引用和数据库传参操作:
数据库基本操作传参方二:
单个结果值获取:
多个结果值获取:
6)后置处理器:作用是关联
①正则表达式提取器
关联:把请求(接口)的响应数据结果进行提取,以供后续请求使用;关联接口(接口)
正则表达式提取器:提取之前保证
正则表达式python实例1:
import re string='woniuxy123 woniuxy12 woniuxy321 woniu1' rest=re.search('woniuxy(.*?) woniuxy(.*?) woniuxy(.*?) ',string) # rest1=re.search('won',string)#带上子字符串从父字符串进行查找,遇到第一个成功的值就返回,如果后面遇到该字符串则不会返回 # rest2=re.match('won',string)#从子字符串开始查找,看父字符串是否以won开头,如果是就会匹配成功,如果不是则匹配失败 # rest3=re.findall('won',string)#子字符串从父字符串进行查找返回所有查找的数值 # print(rest1) # print(rest2) # print(rest3) print(rest) print(rest.group()) # print(rest.group(0))#group()和group(0)是一样的 print(rest.group(1))#去取正则表达式的第1个分组 print(rest.group(2))#去取正则表达式的第2个分组 print(rest.group(3))#去取正则表达式的第3个分组
正则表达式jmeter实例2:其中模板$1$和$2$就跟上面python中的group(1)和group(2)用法一致
②Json提取器:
JsonPath表达式:总是以与XPath表达式结合使用XML文档相同的方式引用JSON结构。JsonPath中的“跟成员对象”始终称为$,无论是对象还是数组.
JsonPath表达式的点表示法:$.store.book[0]title
JsonPath表达式的括号表示法:$[store"]['book'][0]['title']
json返回值提取方式:其中大括号表示一个节点
json返回值提取实例1:
json返回值提取实例2:
json返回值提取实例3:
import re,jsonpath string={ "code":True, "use_time":0.7159986495972, "data":{ "name":"admin", "path":"path", "useID":"1", "role":"1", "config":{ "sizeMax":"0", "sizeUse":1024 }, "groupInfo":{ "1":"write" }, "createTime":1575648872, "staus":1, "lastLogin":1626149394 } } # result=jsonpath.jsonpath(string,'$.data.name') result=jsonpath.jsonpath(string,'$..name') print(result)
JsonPath操作符:
提取单个值:
提取多个值:
③json断言
方式一:期望值为具体值
方式二:期望值为正则表达式
正则表达式工具网址:在线正则表达式测试
三、实战部署phpwind
1.phpwind项目部署
1)解压得到项目包;=》upload
2)把第一步得到的解压包放在www(phpstudy)、htdocs(xampp)
3)启动apache服务器
4)浏览器输入URL地址:http://ip:port/项目名=》
2.phpwind项目实例进行性能测试
防灌水机制修改:
1)登录:
登录后跳转的页面:
2) 正则表达式:进行参数verify、fid提取
提取verify:
提取fid:
3)发帖:
4)发帖:参数化处理verify、fid
5)发帖:正则表达式提取rest后在发帖请求处进行使用,注意以下模板中如果存在多个正则提取使用时则模板为$1$$2$,即一个变量去接收两个值
四、性能测试脚本实现
1.脚本录制:badboy、fiddler、浏览器代理设置+jmeter(下图 )
使用badboy录制脚本修改后模拟用户操作场景如下:
1)随机回帖:
①首页获取:得到回帖的reply_fid
②随机选择模块:选择回帖板块时将reply_fid设置为变量:
③随机选择帖子:使用正则表达式提起tid
④随机选择帖子:将tid变量传入,注意不能选择自动重定向
⑤回帖:参数使用变量进行处理
⑥点击回复:选择帖子进行回复,并将fid取值为变量
⑦回帖:断言
2.定时器(3大定时器)
1)固定定时器:
那个请求发送前需要等待就放在对应的请求之下;如果定时器和http请求统计的话,所有有的http请求都会等待
2)高斯随机定时器
3)同步定时器(集合点-并发)
超时时间:默认值为0则表示没有设置超时时间
获取静态资源:
3.逻辑控制器
1)if控制器:判断条件可以借助于函数_jexl3和 _groovy(无法使用逻辑运算)
csv文件获取变量id,username,pwd
登录:使用变量username,pwd
函数助手:生成取值为偶数的变量jexl3
函数助手:生成取值为偶数的变量groovy
if控制器:输入对应的表达式以及满足该表达式后执行的请求拖动在在if控制器下
2)循环控制器:控制代码结果,满足性能测试场景需要;循环次数勾选永远则表示是死循环,输入数字就表示把控制器下面的代码循环运行对应的次数
3)事务控制器:对应的请求需放置在事务控制器下
4)吞吐量控制器
五、完整的性能测试过程
性能测试场景(漏斗模型):登录之后,发帖:回帖:看帖=1:2:7
1.测试方案:
1)目的:基于当前软件、硬件、网络环境得到最佳、最大用户数,找出性能瓶颈;
2)测试范围:登录、发帖、回帖、看帖
3)数据准备:用户数、帖子数
4)业务建模:
①登录之后,发帖:回帖:看帖=1:2:7;
②可以考虑登录的并发操作
③测试类型:基准、负载、压力、并发
2.性能测试脚本实现
3.性能测试(执行)
4.性能分析
1)图表
①自带图表(用不上)
②第三方库插件图表:
3Basic Graphs:3个基础图像插件
5Additional Graphs:5个辅助图像插件、Custom Thread Groups、线程组插件
指标关系图:Distribution/Percentile Graphs、KPI vs KPI Graphs
PerfMon(Servers Performance Monitoring ):服务器性能自研监控插件、需要结合serverAgent使用
③插件安装:
下载网址Install :: JMeter-Plugins.org或者准备jmeter-plugins-manager-1.3jar
注意JMeter-Plugins-Manager与JMeter 2.12版本不兼容,需要JMeter 3.x或更高版本
将文件jmeter-plugins-manager-1.3jar放在jmeter安装目录/lib/ext下如果jmeter处于运行状态则重启生效,并打开jmeter可以看到工具栏-选项-plugins manage(插件管理),进入插件
插件安装
验证:
方式1:查看jmter插件安装选项install plugins
方式2:在组件中去寻找
常见图表:
命令执行&测试报告
5.命令行执行
1)基础命令执行:
①帮助命令jmet-h进入jmeter安装目录的bin目录下=》输入jmeter-h
②jmeter.bat(Windows)/jmeter.sh(Linux) -n -t test-file[-p property-file] [-l results-file] [-j log-file]
即jmeter.bat(Windows)/jmeter.sh(Linux) -n -t jmeter脚本的绝对路径
2)保存测试数据:
即jmeter.bat -n -t jmeter测试脚本绝对路径 -l 存放测试结果数据文件(csv文件)的绝对路径
3)生成测试报告:
创建报告文件夹reporter后根据result.csv文件生成reporter文件夹下的测试报告
jmeter.bat -n -t jmeter测试脚本绝对路径 -l 运行数据结果(csv文件) -e -o 报告目录(文件夹)
4)可以和CI(持续集成)/CD(持续部署)进行结合
6.分布式执行
【需求】如果使用jmeter模拟几十个虚拟用户?
可以通过分布式解决
分布式初识:
master:主机
slave:奴隶机
原理:
工作过程:
1)master和slave建立后:master和slave之间能够ping通,可以发送请求。传递数据
2)当master启动时,master就把当前的这个“脚本”发送给对应的slave;
3)slave接收到脚本后利用本地jmeter工具执行脚本;执行完成后把测试结果数据返回给master;
4)master接受对应slave的结果数据,并进行展示;
【说明】master所在的电脑也可以作为slave。
部署:
【前提条件】建议把jmeter加入系统环境变量里面
JMETER_HOME:D:\LEARN\Jmeter\apache-jmeter-2.12
PATH:%JMETER_HOME%/bin
1)准备master和slave,保证master和slave相互间能够ping通(目的:发送请求、传输数据);
2)修改master的配置:
①在bin目录下修改jmeter.properties配置文件的
第一步:添加slave
ip:port:ip-slave的ip地址,port-建立连接的端口号,默认是1099
第二步:禁用ssl(https)
3)把master上的jmeter复制slave里面;并进行响应的配置修改:jmeter目录下bin里面的jmeter-server:此处的ip地址为slave
4)启动:
第一步:启动slave bin下的jmeter.bat(windows)、jmeter-server(linux启动方式:sh jmeter-server;./jmeter-server的路径)
windows:
linux:
第二步:在master上启动jmeter(jmeter.bat、ApacheJMeter.jar)
5)验证执行
第一步:工具栏-运行-远程启动:可以看到master中jmeter.properties配置的slave的ip地址和对应的端口号
第二步:单个slave调试:工具栏-运行-远程启动-选择某个slave
第三步:全部运行:工具栏-运行-远程启动全部
【注意事项】
1)master和slave必须相互ping通;
2)master和slave上的jmeter版本必须相同;
以内master和slave收集数据中脚本
3)master和slave必须关闭防火墙
4)如果master、slave上有类似vmware这样的虚拟软件虚拟出来的虚拟网卡,需要对这些虚拟网卡禁用;
5)jmeter脚本里面如果引用了csv文件,则需要保证slave在相同路径下有相同的csv文件
6)jmeter脚本里面服务器名称或ip地址不能使用127.0.0.1或localhost;
六、jmeter高阶之beanshell
1.初识
beanshell是什么:
beanshell是一种完全符合java语言规范的脚本语言,并且又拥有自己的一些语法和方法;
beanshell是一种松散类型的脚本语言;
beanshell是用java写成的,一个小型的、免费的、可以下载、嵌入式的java源代码解释器,具备对象脚本的特性;
beanshell可以执行标准java语句和表达式以及另外自身的一些脚本命令和语法
基本语法:
beanshell语法类似于java,但不等于java;
java( beanshell)强类型语言,python弱类型语言;
强类型语言:变量必须先声明再使用;声明时必须指定数据类型
特征:
1)变量必须先声明再使用;建议声明时必须指定数据类型;
2)针对字符串必须使用双引号
3)代码以英文的分号或者大括号结束;
2.为什么学习
jmeter组件存在局限;部分功能无法通过组件实现,所以就考虑使用jmeter自主开发脚本插件beanshell实现;
3.beanshell基本语法
1)数据类型(8种基本数据):
①6种数字:byte、整型、短整型、长整型、单精度浮点型、双精度
②字符串
③bool
④数组
代码如下:
//声明字符串
String str="class83";
log.error(str);
//声明整型
int num=1;
log.error(""+num);
//声明单精度浮点型
float f_float=1.234;
log.error(""+f_float);
//声明双精度浮点型
double d_num=1.234569;
log.error(""+d_num);
//声明bool类型
boolean bool=true;
log.error("bool类型"+bool);
//声明数组:数组相当于python中的列表
List mylist=new ArrayList();//声明了一个数组变量
log.error("空数组>>"+mylist);
//向数组里面添加值
mylist.add(str);
mylist.add(num);
mylist.add(f_float);
mylist.add(d_num);
mylist.add(bool);
log.error("添加数据之后的数组>>"+mylist);
2)控制结构:
①分支结构(if)
//分支结构if
/*
【语法】
if(bool表达式){
bool表达式为true运行的代码块
}else{
bool表达式为false运行的代码块
}
*/
num=1
if(num1==1){
log.error("测试通过");
}else{
log.error("测试失败")
}
②循环结构(for 、while)
//循环结构for while
/*
【for循环】
for(循环变量声明;循环条件(布尔表达式);循环变量更新){
满足循环条件是运行的代码
}
*/
//for(int i=0;i<=5;i++){//i++相当于python里面的i+=1
// log.error(""+i);
//}
//【需求】当i是偶数时输出,否则不做任何操作
for(int i=0;i<=5;i++){//i++相当于python里面的i+=1
if(i%2==0){
log.error("偶数"+i);
}
}
③顺序结构
3)内置方法/对象
①log:打印输出内容;只能打印输出字符串;如果是其它的数据类型需要转换一下
log.error():打印错误信息
log.warn():打印警告信息
log.info():打印详细信息
log.debug():打印调试信息
log.trace():
②var:获取、声明、修改jmeter变量的
vars.get():获取jmeter变量
vars.put():声明、修改jmeter变量
③prev:获取取样器的响应结果
rest=prev.getResponeDataAsString()
④Failure:如果断言失败Failure=true,如果断言成功Failure=false
⑤FailureMessage:断言失败后的提示信息,等同于“断言失败自定义消息”
⑥props:修改配置信息
⑦ctx:上下文
4)其他
快捷键:注释/取消注释:ctrl+/
5)运算符:
逻辑与:&&
逻辑或: ||
逻辑非:!
4.beanshell组件
1)beanshell取样器
2)beanshell前置处理程序
3)beanshell定时器
4)beanshell后置处理程序
5)beanshell断言
需要使用beanshell的prev、Failure、FailureMessage和判断分支
断言有三种方式:
①equals():恒等
②contains():包含
rest.contains(预期结果)
③matches():正则匹配
rest.matches(正则表达式)
6)beanshell监听器
5.应用场景
1) json数据处理:操作步骤如下
①引入包:
添加jar包和目录,准备org.json.jar解压之后放在jmeter安装目录下/lib/ext之下
②导包
③代码实现
实例:
登录json处理:
用户查询json处理:
数据库断言处理:
2)引用java代码运行
①java代码形式(3种)
xx.java:java源码文件
xx.class:基于java源码文件进行了编译
xx.jar:打包jar包(等同于war包)
②代码执行
第一步:java源码(注意:文件名和java代码里面的类名必须相同)
第二步:编译之后class文件:
环境准备:保证jdk环境的变量时ok的
①利用java的源码进行编译,命名javac java源码文件的绝对路径
javac取决于classpath
②代码实现
引用class文件:“addClassPath(class文件的目录)”
调用:
引包:import Hash
代码实现:
第三步:打包之后jar包文件
操作步骤:
①打包jar包文件:命名“jar cvf Hash.jar 被打包的java对应编码的class文件”
②引入jar包:测试计划-浏览-选择jar路径
③导包
④调用