草庐IT

Jmeter场景组合测试——多个线程组的设计方案

测试开发Kevin 2023-10-17 原文

我们绝大多数同学在使用jmeter进行性能测试时都会在一个线程组中完成测试工作,今天我来重点讲解一下jmeter多个线程组在测试中的应用,这也是关于jmeter性能测试面试过程中的进阶问题,希望能够帮到大家来解决工作中不同的测试需求。

线程组中的线程执行顺序是什么?

首先大家需要明确一件事儿,在jmeter中,对于同一个线程组中的一个线程来说,请求是顺序执行的。下图中,对于线程1来说,在每次循环时,请求1、请求2和请求3是顺序执行的。

在这里大家需要确认一个问题?参考上图,如果多线程并发(例如10个线程),能够保证10个线程都先执行请求1,然后执行请求2,最后到请求3吗?答案是:正常情况保证不了,因为多线程执行是无序的,每个线程执行的速度也不同,这样会出现:线程1执行了请求1、请求2和请求3,线程2刚刚执行了请求1,线程3还没执行任何请求的情况。但是通过加集合点(synchronizing timer)的方式可以,关于集合点的使用这里不会重点介绍。

如何对不同的请求完成集中压测?

例如,我们需要实现一个需求:10个并发分别对请求1、请求2、请求3进行压测,并连续执行100次?

答案是使用多线程组,例如设计三个线程组,然后把请求1、请求2、请求3分别放到三个线程组中,在每个线程组中分别设置线程数是10,循环次数是100,设计方法如下:

那么如何保证在某段时间内只对某一个请求进行并发测试呢?即如何实现在某时间段a只对线程组1进行并发操作,某时间段b只对线程组2进行并发操作?

实现方法也很简单,在测试计划中勾选“独立运行每个线程组”即可,如下图,这样就保证了各个线程组独立运行,不会出现线程组并发运行的情况


线程组之间需要有一定的时间间隔该如何处理?

例如想在线程组1运行完成1分钟以后才运行程组2,这个需求该如何实现呢?

首先,大家有没有想过为什么要有这个需求呢?比如我们要对不同的接口进行测试,然后在后台进行监控,如果设置了时间间隔,就可以很清晰的看到在测试不同的接口时的资源利用率的变化情况。例如:接口1占用cpu资源平均为30%,接口2占用cpu资源平均为32% ,如果没有时间间隔,就很难区分二者在cpu上的消耗情况了,但是加上时间间隔以后在二者之间就会出现cpu使用率明显下降的一段区间,如下图所示:

有的同学可能会使用固定定时器,通过在不同的线程组之间加固定定时器来实现这个需求,如下图所示:



但是实际情况是,上图这种设计方式是无效的,会出现:在线程组1中10个并发执行一次,就会等待1分钟的情况!大家可以亲自验证一下。

所以正确的方法是通过线程组的调度器来实现,如下图:

我们设置您需要的启动延迟时间,然后设置持续时间,这个值可以预估大一些,例如100秒,因为如果上面的循环次数设置为5, 那么执行完5次循环后,该线程组就会停止运行(即使运行时间没有到100秒)

多个线程组设计方案的实际应用

前面讲了那么多,实际工作中多个线程组的设计方案有哪些呢?

场景1:多个线程组顺序运行

典型的应用,就是依次测试单个接口的处理能力。简单的说:10个接口10并发,循环执行100次。

我们就可以把这10个接口分别放到10个线程组中,然后每个线程组都是10并发和循环执行100次,在测试计划中勾选“独立运行每个线程组”即可。

场景2:多个线程组并行运行(适合多场景同时运行)

典型的应用,系统中同时运行多个场景。简单的说:有5个场景(每个场景都包含多个接口)10并发,循环执行100次。

我们就可以把这5个场景分别放到5个线程组中,然后每个线程组都是10并发和循环执行100次,在测试计划中勾选“独立运行每个线程组”即可(默认选项)。


有关Jmeter场景组合测试——多个线程组的设计方案的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  3. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  4. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  5. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  6. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  7. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  8. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  9. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  10. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

随机推荐