【场景构造】并发抢答场景
发布日期:2021-06-30 21:35:45 浏览次数:2 分类:技术文章

本文共 1874 字,大约阅读时间需要 6 分钟。

在做一个项目的性能测试时,涉及抢答场景,大致的场景故事为:

教师出一道题,班级中所有学生进行抢答,抢答后教师关闭抢答
那如何使用jmeter构建多个角色处理不同但相关的事情呢?

首先按照时间顺序简化一下整个事务的流程:

  1. 教师 - 登陆
  2. 教师 - 开始上课
  3. 学生 - 登陆
  4. 学生 - 加入课堂
  5. 教师 - 发起抢答
  6. 学生 - 抢答
  7. 教师 - 关闭抢答

不同线程组

不同角色使用不同线程组发起请求

难点:

  1. 如何教师角色的线程组执行后,学生角色的线程组再执行
  2. 即使解决问题1但是如何循环多次同步执行

由于问题2解决成本大而且造成执行事务复杂化,故该方案不可行

计数器判断

在同一个线程组中,通过变量控制不同线程的执行角色

通过计数器控制器

在这里插入图片描述

方式

  • 计数器使用时所有用户即所有线程都共享的方式
  • 计数器叠加累计,假设50学生 1教师,每执行51次即所有线程都执行了一次,即可设置获取到count%51==0的线程为教师用户

问题

  • 51个线程中当老师的那个线程是随机的,故需要所有的账号角色都允许为教师和学生
  • 需要教师账号开启上课后所有学生加入课堂,需要每次循环都执行所有流程
  • 不同线程执行整个事务流所有接口的时间差异比较大,可能某次循环中一些线程执行了多次而有些线程并未执行,这样导致并不是51个账号

线程num判断

因为每个线程都有线程id,且为数字,故可以在方案二基础上使用线程id __threadNum 做为判断

在这里插入图片描述
这样改进后还有哪些问题呢?

线程间变量共享

如何做到不同的线程之间共享抢答id的变量,因为抢答id是有__threadNum == 0的线程执行的,创建抢答id后所有的其他线程均需要使用到该抢答id

jmeter提供的__setProperty 方法可以将变量共享给不同的线程以及不同的线程组,通过 BeanShell 处理程序 即可

在这里插入图片描述

${
__setProperty(rushanswer07_interactionId,${
interactionId},)};

如何使用该变量呢?

${
__property(rushanswer07_interactionId,,)}

变量共享的问题解决

集合点

其实还存在一个很严重的问题,还是不同线程间不能同步的问题,具体是什么呢?

即假设教师的线程执行速度很快,教师发起抢答后快速结束抢答,接着再次结束抢答,但是部分线程是拿到上一次的抢答id进行抢答,这样直接无效执行

这样同时导致一个问题,就是完全达不到抢答的效果,抢答即所有用户在同一时刻点都对抢答题进行抢答

怎么解决这个问题?

这时候需要引入一个集合点的概念,何为集合点?

可以简单得理解为一种控制虚拟用户行为的机制,该机制可以达到在一定时间范围内将一定数量的虚拟用户阻挡在一个操作行为点前的位置进行互相等待,在条件(达到虚拟用户数量或超时)到达后唤醒全部等待中的虚拟用户,从而达到使得一定数量的虚拟用户可以同时进入下一个操作行为点的目的

那如何使用jmeter达到集合点的效果呢?

同步定时器

在这里插入图片描述
可以看出,同步定时器中的两个参数,模拟用户组的数量和超时时间
模拟用户组的数量即集合点中阻挡等待线程达到这个数量时才能进入下一个操作行为,超过时间即是一种预防某些线程挂掉等容错的补充

在学生抢答前设置同步定时器,所有学生全部准备就绪后,并发发起抢答,基本模拟真实的并发操作

循环遍历

到这里其实还有一个问题,抢答是学生行为,发起抢答和关闭抢答是教师行为,问题点在哪里呢?

模拟教师用户的线程在执行发起抢答后,判断不需要执行抢答行为,快速执行了关闭抢答的请求,这样就导致大部分学生还未答题时,该抢答题已经被教师关闭了抢答

怎么处理这个问题呢?

简单粗暴低端的做法就是教师在发起抢答后sleep一段时间,但是这个sleep的时间长度就比较尴尬了。设置长了影响发起的请求量,设置长度较短时依旧出现上面的问题

可以使用上面的计数器结合while循环判断

每个学生执行抢答后执行后置处理,则递增1

在这里插入图片描述

int count1 = Integer.parseInt(vars.get("count"));vars.put("count",String.valueOf(count1+1));

教师在执行结束抢答前循环判断是否所有学生均已答题

在这里插入图片描述
当count即答题人数小于50时就一直循环执行,加上一个if判断,如果count==50则执行关闭抢到请求,则可以实现50个学生均已答题才关闭抢答操作

ok,抢答并发场景构造成功

整个请求组件如下:

在这里插入图片描述

转载地址:https://lluozh.blog.csdn.net/article/details/109636493 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【appium】linux环境安装部署
下一篇:【jar】Java Runtime recognizes class file versions up to 52.0

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月09日 06时45分48秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章