jmeter-初识组件

发布时间 2024-01-12 12:25:22作者: 成己达人

5.初识组件
5.1.十大常用组件-按执行顺序
5.1.1测试计划
父节点,是所有组件的容器。可以在测试计划包含多个线程组,每个线程组下面可以包含多个组件。工作组成一个脚本,一个jmx文件。
1.用户定义的变量:用来定义全局的变量值,在测试计划下任何地方都能引用${变量名}该处定位的变量。
考虑放在此处的变量特点:
(1)不会因为环境的改变而改变的变量值,能使脚本能够兼容各个环境。比如用户名密码等变量会因为环境不一样而改变的就不建议放在此处定义,如果放在了此处,就会出现每次在不同环境执行脚本都要翻阅项目资料修改用户名密码等繁琐的操作
(2)注意点:由于直接在测试计划面板的【用户定义的变量】与在测试计划下新建【配置元件】->【用户定义的变量】完全等价,建议存放在此处的变量可以使用【配置元件】->【用户定义的变量】来替代,通过一次性新建好项目所有环境的变量信息,后面执行脚本的时候只需要控制各个环境的【用户定义的变量】的“禁用”与“启用”即可。建议如下方案:
2.独立运行每个线程组:
(1)未勾选:有多个线程组时,其随机启动执行,
(2)勾选后:多个线程组时,等待前一个线程组执行完成后才开始下一个线程组,即顺序执行。注意点:只影响同个优先级下的线程组的随机执行顺序,不影响整体的顺序,如:必定会先执行setUp线程组、再执行普通线程组、再执行tearDown线程组。

3.主线程结束后运行tearDown线程组
当线程组结束运行后,继续运行tearDown线程组。即使强制停止测试,tearDown线程组也会继续运行。
4.函数测试模式
勾选此项,并且监听器处配置了保存数据到一个文件,会将jmeter每次请求的结果都保存到文件中,很耗费性能,不建议勾选
5.添加目录或jar包到Classpath
可以在此处添加jar文件或目录,但是删除条目需要重新启动jmeter后生效。
5.1.2.线程组-默认线程组
对线程的统一管理,压力测试控制虚拟用户的数量和用户的加压方式,接口测试一般设置单用户。
接口类型不仅支持Rest、SOAP,也可扩展WebSocket、Socket等。无论你用Jmeter做哪种测试,哪种接口类型,哪种网络协议,你都必须添加使用Jmeter线程组,线程组在Jmeter中占据主导地位,它是任何一个测试计划的起点,所有的逻辑控制器、采样器、处理器、报告等都必须放在线程组之下,也就是说你若使用Jmeter做接口测试或性能测试那么,线程组是必不可少的。
•线程组:是对线程的统一调度和管理,线程组是测试计划的开始点,在一个测试计划中的所有元件都必须在某个线程组下;
•线程:一个线程就是一个“虚拟用户”;
•请求:一个线程组里面有若干个请求。
说明:此处讲解jmeter默认的线程组。在后续章节专门讲解性能测试的扩展线程组。
5.1.2.1.thread group(线程组)
这个就是我们通常添加运行的线程。通俗来讲一个线程组,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户


在采样器失败后要自行的动作:
1、continue继续:继续执行接下来的操作;
2、Start Next Thread Loop启动下一进程循环:开始下一次循环;
3、stop Thread停止线程:停止线程,退出该线程(不再执行此线程的操作);
4、stop Test停止测试:等待当前执行的采样器结束后,结束整个测试;
5、Stop Test Now立即停止测试:马上停止测试;
线程属性:
1、Number of Threads(users):线程数,相当于模拟的用户数量;
2、Ramp-up Period(in seconds):达到指定线程需要的时间,例如线程数为100,时间设定为10s,那么就是10s加载 100个线程,每秒启动的线程数=100/10=10;
3、Loop Count循环次数/永远:如果填具体的数值,就是循环对应的次数;如果选择“Forever永远”,则一直执行下去,直到手动停止;
4、Delay Thread creation until needed:延迟线程创建,直到需要才创建。
5、Same user on each iteration:表示每个迭代都用相同的线程,即线程复用。这个得从老版本讲起,在以前 3.x 和 4.x 版本的 JMeter 中,是没有这个选项的。创建好 1 个线程后,每次迭代都是用这个线程,直到测试结束。它的影响就是,比如登录,加了 HTTP Cookie 管理器以后,单个线程多次迭代(注意不是多个线程哦)登录用的都是相同的 Cookie。5.x 版本加入了这个选项,可以控制每次迭代是否创建新的线程。同时在 HTTP Cookie 管理器也增加了一个选项,控制是否清除旧 Cookie。默认这个 Same user on each iteration 的选项是勾选的。因为销毁和创建线程本身就会占用资源,可能会影响性能测试结果。
6、Delay Thread creation until needed:延迟线程创建,知道需要时才创建。
7、调度器:勾选后,调度器配置项设置生效,可设置场景持续执行时间、延迟启动时间、启动时间、结束时间。
持续时间:场景持续执行的时间
启动延迟:延迟多久执行
Delay Thread creation until needed解释:JMeter allocates all threads at the test start unless the Thread Group option "Delay Thread creation until needed" is selected.
In some cases where a test has a very large number of threads the CPU can spike to 100% and kill the server process if the delay thread creation option is not selected.
When selected, JMeter will allocate threads according to the ramp up times. Otherwise all threads are allocated to the JVM process the moment the test is started, regardless of ramp up time.
This has no relation to whether or not the threads are allowed to begin sending samples. That always depends on ramp-up time and and test plan timers.
翻译:JMeter在测试开始时分配所有线程,除非选择了线程组选项“延迟线程创建直到需要”。
在测试具有大量线程的某些情况下,如果不选择延迟线程创建选项,CPU可能会飙升至100%并终止服务器进程。
选中后,JMeter将根据斜坡上升时间分配线程。否则,在测试开始的那一刻,所有线程都被分配给JVM进程,而不考虑提升时间。
这与是否允许线程开始发送样本无关。这始终取决于启动时间和测试计划计时器。
线程的生命周期,帮助理解:
NEW:创建未启动,已经实例化,只是没有开始运行线程的Run方法
RUNNABLE:就绪状态,线程对象创建后,其他线程调用了对象的start()方法,该状态的线程位于可运行线程池中,已经准备好了只等获取CPU的使用权,然后开始运行
RUNNING:运行状态,就绪状态的线程获取了CPU使用权执行程序代码
BLOCKED:阻塞状态,线程由于某些原因放弃CPU使用权,暂时停止运行,比如IO等待导致的线程处于BLOCKED状态;直到线程进入就绪状态,才有机会变成运行状态
(1)等待阻塞:运行的线程执行wait()方法,线程进入等待池中
(2)同步阻塞:运行的线程再获取对象的同步锁时,若该同步锁被别的线程占用,也就是资源争用失败,该线程放入锁池中
(3)其他阻塞:运行的线程执行sleep()或者join()方法,或者发出了I/O请求时,该线程置为阻塞状态,当sleep()状态超时,join()等待线程终止或者超时,或者I/O处理完毕时,线程重新转入就绪状态
DEAD:死亡状态,执行完毕或者异常退出,线程生命周期就结束了
再看看下Delay Thread creation until needed是否勾选的区别:
勾选:设置的Number of Threads数量线程将在Ramp-Up Period时间内启动并且运行,比如图中2秒内10个线程,那么每隔1秒就启动5个线程,并运行(RUNNING状态)我们请求的Sampler
不勾选:启动了所有线程(NEW状态),但是不立即运行Sampler,而是按照Ramp-Up Period时间来运行,比如图中一开始10个线程就全部就绪了,但是每隔1秒只有5个线程来运行请求的Sampler


5.1.2.2.setup thread group(前置线程组)
一种特殊类型的ThreadGroup,可用于执行预测试操作。类似LoadRunner的init,测试开始前进行初始化的工作。
不同的是执行顺序---它会在普通线程组执行之前被触发。
应用场景举例:
A、测试数据库操作功能时,用于执行打开数据库连接的操作。
B、测试用户购物功能时,用于执行用户的注册、登录等操作。
C、测试前的数据初始化操作。
5.1.2.3.teardown thread group(后置线程组)
一种特殊类型的ThreadGroup的,可用于执行测试后的动作。这些线程的行为完全像一个正常的线程组元件。不同的是,线程执行测试结束后执行此线程组;类似LoadRunnner的end,测试结束时进行回收工作。不同的是执行顺序---它会在普通线程组执行之后被触发。
应用场景举例:
A、测试数据库操作功能时,用于执行关闭数据库连接的操作。
B、测试用户购物功能时,用于执行用户的注销、登出等操作。
C、测试后的数据销毁操作。比如:闭环测试。