顶层是测试计划
线程组
开启线程组是测试的前提
第二个:多少秒内启动完10个线程
简单测试就是三个设置为1
逻辑控制器
在线程组底下添加逻辑控制器
if控制器用得最多,如id=1的用户去浏览xx商品,其他去浏览其他商品
接着在if控制器底下添加sampler - http请求,这就意味着只有if条件满足,这个http请求才会发出去
为了定义if条件,添加配置元件
添加一个自定义变量:
修改if控制器:定义判断逻辑
再点击顶部这里的开始
查看结果树中就能看到请求结果了。
条件不满足的话,点击开始,查看结果树中是什么都没有的
配置管理
上个小节中看到通过配置元件来配置自定义常量,还可以配置http请求头、cookie等。
jdbc连接:
设置对应连接的变量名字,其他配置默认
接着添加一个jdbc sampler
设置为之前的jdbc变量名,以及要执行的sql语句
然后再添加一个查看结果树,来获取sql执行结果。
以上创建的都是基于线程组下创建的
前置处理器
对即将发出的请求做特殊处理
添加一个用户参数前置处理器
然后再添加一个beanShell Sampler
使用java输出之前的变量
添加查看结果树,并运行
但是里面看不到输出结果1.
启动jmeter时,还会启动一个命令行,是输出到那里了,
这里更类似于字符串替换,如果var对应的值是中文,这里就输出System.out.println(中文)
命令行中是没有输出结果的,因为上面代码执行报错de
定时器
用于设置操作与操作之间的等待时间,常用于控制QPS,用于模拟用户的操作。定时器容易掩盖某些性能问题,所以用的不多。
在sampler底下添加定时器
这样,当前sampler执行时,就会具有定时的特性了
没有定时器时,sampler是马上执行的
Sampler
用于模拟各种请求,记录响应信息。
BeanShell:自己写Java代码实现自定义操作,Jmeter安装目录里面有个lib目录,就是默认引用了这些 jar包
自己写java代码如果要引用外部jar包,在测试计划中配置:
debug sampler:可以输出当前测试的变量,如自定义的配置信息,用于调试信息
后置处理器
实现关联,对sampler发出请求后拿到的响应进行处理,一般用于提取特定数据
如使用正则表达式提取某个响应结果中的数据
指定title为名字,获取结果中的正则表达式匹配结果,被括号包裹
后续的Sampler引用这个提取结果时,使用${title}来引用提取后的数据
断言
在Sampler底下添加,用于检测得到的数据是否符合预期结果
以子串的形式来匹配响应文本
在查看结果树中就能看到断言结果了
当断言通过时,向下是没办法展开结果的,只有失败才有
功能性验证用断言比较多,高并发测试时一般不用,因为不能保证请求是成功的
监听器
对测试结果进行处理和可视化展示,如查看结果树。
聚合报告:请求的汇总信息,如平均请求时间、吞吐量等
函数助手
下面每个用户的意思就是每个线程
配置好两个值,再点击生成
上面有点类似于文档,对应的函数有两个参数,以及生成调用方式。
在beanShell Sampler中调用:
当线程组中配置线程数不是1时,true和false才能体现出差别
函数助手中有好几个函数,表现出来的效果和线程组中的线程数以及循环次数有关
分布式
配置文件在安装目录的bin目录下
在master中配置slave的ip和端口
重启master的jmeter,就有远程启动的选项了
在salve中指定端口为1099
然后再启动slave中的jmeter-server
效果就是本地的jmeter可以控制远程的jemeter-server来发送请求,并且获取远程请求的结果,就不用耗费本地资源了
数据驱动
从数据文件中读取测试数据,可以理解为更高级的参数化
测试数据与测试代码分离、数据控制过程
能减少测试代码(但要求代码能力高),便于用例的修改和维护,只改数据文件即可
适合:
复杂的业务流程、根据业务场景分流、符合条件的并发场景
用户操作流程:
具体的操作对应的用户分布是根据实际的统计数据来的,如80%的用户先登录等
推荐使用数据库来作为参数数据源:能多台机器共享、数据取数简单,数据是结构化的
Jmeter数据驱动测试:数据库参数化 + 逻辑控制器(用于操作分流)
参数表
连接数据库:添加配置元件中的jdbc配置
添加一个sampler jdbc request,用于从数据库中读取性别数据到sex变量中
添加一个debug sampler和查看结果树:发现从数据库中取出的数据的命名规律:
sex_#的值就是数组的长度,即表中的记录数量
有了数据的命名规律,就可以用来使用了,添加一个if控制器
一个条件判断就需要一个if控制器
然后在这些条件控制器底下添加满足条件时的sampler
以上使用的变量是sex_1 但是待测试的数据有4个,不可能每个变量都要写两个对应的控制器
解决办法A,使用csv:
csv内容如下,可以从数据库中导出id来实现:
将变量名设置为id
jdbc查询时,使用这个id
再将线程组的线程数设置为4
理解:4个线程对应运行4次,每次取出csv中的一行,生成id值,再执行sql,查出对应的性别赋值给sex_1,然后两个if控制对sex_1进行判断,执行对应的请求。
解决办法B:
要解决问题,怎么样使if控制器循环起来,而且不读取固定的变量名
思路:一个线程循环4次,每次都要计数,计数可以使用函数助手中的计数器,也可以使用配置元件中的计数器
前面的debuger sampler中可以看到sex_#变量就是4,添加一个计数器,并制定最大值
控制器中使用函数助手__V对计数器的值进行字符串拼接,即控制器中判断的变量就是动态的了,与计数器的值相关
接着再创建一个循环控制器
设置一个线程运行一次
两种解决方法的区别:前面是4个线程运行一次,后面是一个线程运行一次
实际模拟用户操作时应该用第一种,因为不同线程模拟不同用户
多协议接口测试
http
http sampler中会有响应数据中文乱码问题,解决:jmeter.properties中有个encoding编码,指定为UTF-8,然后再重启jmeter即可
http sampler上传文件
https:默认端口是443
ftp:默认端口21和20
ftp使用两个并行的tcp连接:控制连接21和数据连接20
linux中使用vsftpd来部署ftp服务
添加一个ftp sampler,来下载一个文件到本地
运行结果:
扩展组件的开发
demo
创建一个maven工程,添加依赖,
版本最好与本地的jmeter版本一致
工程里写一个类
使用mvn clean package,把生成的jar包,放入 jmeter目录中
重启jmeter,接着创建一个java 请求sampler
可选的类就是我们之前创建的类了,一运行,就会执行上面的输出语句了
其他
除了以上继承类,还可以实现接口
前三个方法:初始化方法、主逻辑方法、收尾
最后一个:当以下列表一选择,对应的类的getDefaultParameter方法就会执行(对应的输出语句输出结果会出现在jemeter一起启动的控制台中)
这个函数用于设置面板底下的参数配置
设置参数
效果
初始化方法里获取用户输入的参数
主逻辑方法中返回结果,就能在查看结果树方法中展示了
效果
自定义函数
多加一个function依赖
包名必须是funtions,以及要继承一个类
测试
效果:
列表一展示出来,就会执行第三个方法
一选中之后,就会执行第四个方法,因为以上返回了null,所以会出现一个空指针异常
简单实现
效果
可见,这个列表是对应多个参数时的描述
先检查参数个数是否符合预期,再接收参数
主逻辑,转化参数,返回处理结果
测试