目录
0、测试计划
-
测试计划是用来描述一个性能测试的顺序与动作,它包含了若干测试组件以及若干个线程组
-
我们通常说的所有测试元素在JMeter中都属于某一个测试计划
-
测试计划可以添加除了【取样器和控制器】以外的所有组件
-
测试计划中也是可以添加自定义变量的
1、线程组
-
线程组概述:
- 线程组是一个元件
-
线程组是加到测试计划下的,是任何一个测试计划的开始点
-
在一个测试计划中,所有的请求或者说取样器都必须在某个线程组之下。
-
所有的任务都要基于线程组。
-
所以测试计划下至少要有一个线程组。
-
一个线程组可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。
-
线程组可以有多个,多个线程组可以并行或者串行运行
- 默认情况下,是并行执行的
-
可以设置串行运行
- 设置的方式: 测试计划 ---> 勾选”独立运行每个线程组"
-
- 默认情况下,是并行执行的
-
取样器【请求】和逻辑控制器必须依赖线程组才能运行
-
线程组下可以添加其他元件
-
-
1)名称
-
2)注释
-
3)取样器错误后要执行的动作
- 继续
- 发生错误后没有关系,继续执行就好了
-
我们在压测中是允许一定的错误率的
-
启动下一进程循环
- 发生错误后,我这个线程后面的请求就不执行了,重新启动新的一个线程,或者说迭代
-
比如我设置了线程数为1,循环次数为2,当循环第一次的时候,出了问题,那么第一次后面的请求就不执行了,转而执行第二次循环
-
停止线程
- 一般不会设置成这样
-
这样就停止了线程,可能导致后面测试的时候,线程越来越少,负载就不够了,测试就没有意义了。
-
停止测试
- 把当前线程执行完了后就停止测试了,要把当前的处理完。
-
立即停止测试
- 粗暴的停止,直接就停了,正在处理的都不处理了。
- 继续
-
4)线程数:
- 相当于并发用户数
-
每个线程在测试计划独立运行,互相之间不会干扰
-
多个线程用于模仿对服务器的并发访问,比如配置线程数为10,就表示模拟10个用户对接口发起请求
-
默认是1
-
如果你要对服务器有相应的负载,需要多设置线程数,因为它代表的是用户数
-
而不是说在循环次数里面去多设置值
- 虽然说看起来发送的请求都是 线程数 * 循环次数
-
但是对服务器的负载是不一样的!
-
-
5)Ramp-Up时间(秒)
- 在多少秒内启动这么多并发数
-
比如线程数配置为100,Ramp-Up时间配置为10,就表示10s内启动100个线程,平均下来就是每1s启动10个线程
-
如果不配置Ramp-Up 时间,或者配置为了0,表示立即启动所有线程
-
6)循环次数
- 设置线程组下面的元件执行的次数
-
表示重复执行几次的意思
-
比如线程数为x,循环次数为y,那么总共会执行x * y次
-
7)Same user on each iteration
- 一般用在有cookie的场景
-
每次迭代用同一个用户
-
iteration,迭代,其实就相当于循环次数
-
在jmeter里面,可以理解为一个线程就是一个用户
-
就是选择每次运行是否使用同一个cookie
- 【选中】每次循环都用的是第一次的cookie,不用更新;可以理解为每次循环都是同一个用户
-
【不选中】每次循环都用的是新的cookie,那么就是说每次循环都是新的用户
-
不好举例子,没法举例子
-
8)延迟创建线程直到需要
- 当启动线程发送请求时,才分配资源:
- 如果暂未启动该线程,则不分配
-
你这样设置,对于压测其实也没有意义了,你没有达到那个对server的负载量是不!
-
其实我们做压测还要注意控制,希望在同一时刻来进行同时发请求的【当然这个可以通过控制器来实现】
-
如果不勾选,在jmeter点击运行时,立即分配
-
使用不多,无法观察效果,了解即可。
- 当启动线程发送请求时,才分配资源:
-
9)调度器
- 需要勾选后,才能选择下面的选项,来设置启动延迟来实现线程的延迟启动;
- 持续时间(秒)
- 设置jmeter脚本的持续运行时间
-
如果脚本的运行时间小于这个持续时间,那么必须勾选循环次数为永远才看得到效果【持续运行的效果】
- 因为脚本都运行完了,就停止了,无所谓持续运行时间这个说法了
-
如果同时设置有循环次数,那么谁先到达谁先生效
-
- 设置jmeter脚本的持续运行时间
-
启动延迟(秒)
- 设置jemter脚本延迟启动的时间
-
点击启动后,如果启动时间已经达到,但是还没有到启动延迟那么多秒,这个时候,启动延迟的时间会生效,覆盖掉启动时间;说白了就是要等到那么多时间后,再运行脚本
-
默认不勾选,表示立即启动线程
- 持续时间(秒)
- 需要勾选后,才能选择下面的选项,来设置启动延迟来实现线程的延迟启动;
2、一些设置再谈
-
表示10秒内启动100个线程数
- 意味着每秒启动10个线程数
-
如果这个Ramp-Up时间值设置得很少,线程数又设置得很大的时候,意味着刚开始执行时会对服务器产生很大的负载,这个需要自己考虑下如何设置合理
-
点了永远 就会一直循环执行,除非手动停止
-
循环次数如果填了,就是循环对应的次数
- 比如上面线程数100,循环次数填10,那么就是相当于要执行 100 * 10 = 1000次
-
Delay thread creation until needed【延迟创建线程直到需要】
- 默认情况下,测试开始的时候,所有线程都被创建完了
-
如果勾选了此选项,那么表示线程只会在合适的需要用到的时候创建
3、线程组的分类
-
线程组
- 普通的线程组
-
线程组中的每个线程都可以理解为是一个虚拟用户
-
setup 线程组
- 在普通线程组之前做一些环境的初始化工作
- 比如
- 创建用户
-
进行数据库的连接
-
进行数据的准备等
- 比如
- 在普通线程组之前做一些环境的初始化工作
-
teardown 线程组
- 在普通线程组之后做一些环境的清理工作
-
比如
- 删除测试用户
-
进行数据库的关闭
-
测试环境的清理工作等
-
- 在普通线程组之后做一些环境的清理工作
4、调度器
-
需要勾选才会生效
-
持续时间:
- 线程组持续运行多少时间,以秒为单位
-
启动延迟
- 线程组在多久后才开始运行,以秒为单位
5、取样器错误后要执行的动作
-
继续
- 继续执行
-
启动下一进程循环
- 开始下一次循环
-
停止线程
- 停止该线程,不再执行该线程的操作
-
停止测试
- 等待当前执行的采样器结束后,结束整个测试
-
立即停止测试
- 粗暴的直接停止整个测试
6、线程号
-
可以通过函数助手生成
7、线程启动分析
-
10s内加载100个线程,可以添加监听器Active Threads Over Time
- 因为接口请求执行得太快,所以,没有达到活跃线程数100,有的就已经释放了
-
1s内直接启动100个线程
8、是否为同一个用户的分析
-
我们可以通过接口返回的sessionid来判断是否是同一个用户
-
比如korei系统登录
- 登录后,会在reponse headers里面设置一个jsessionid,来判断后续操作是否是同一个用户
-
我们通过接口分析,也能看到
- 登录后,会在reponse headers里面设置一个jsessionid,来判断后续操作是否是同一个用户
-
示例脚本:
-
-
当没有添加cookie管理器的时候,Same user on each iteration勾不勾选都一样
- 如未勾选:
-
勾选:
- 如未勾选:
-
那如果添加上cookie管理器,效果就不一样了
- 勾选,且cookie管理器没有勾选清除缓存的情况:
- 才会一样【korei的接口要重定向,无法演示,理论上是这样】
- 勾选,且cookie管理器没有勾选清除缓存的情况:
9、线程组之间抢占资源
-
除了setup、teardown之外,其他的线程组,谁先运行,谁后运行,不太确定
- 因为它们要抢资源,谁先抢到,谁先运行
-
那如何解决这种顺序问题呢,可以在测试计划下面勾选
- [x]独立运行每个线程组(例如在一个组运行结束后)
10、线程组内线程会抢占资源
-
在普通线程组内,如果线程数大于1,那么线程会抢占资源
-
-
这个没办法按顺序来,就默认这样就ok了,知道就行。
11、JMeter发送的请求如何抓包
-
在请求里面选择高级,配置代理
-
-
然后再使用抓包软件抓包,如charles(MacOS), fiddler(Windows)