groovy 如何发送具有不同有效负载元素数量的请求,同时在脚本结束时达到所有元素的所需平均值?

2nbm6dog  于 2022-11-21  发布在  其他
关注(0)|答案(2)|浏览(86)

我 需要 在 定义 的 持续 时间 内 连续 生成 相同 的 HTTP 请求 , 但 请求 体 中 的 对象 数量 随机 变化( 在 1 - 99 范围 内 ) ,我 的 要求 是 , 在 脚本 结束 时 , 我 应该 计算 出 3 个 这样 的 对象 的 平均 值 。( 在 并发 重 负载 下 ) , 然后 在 运行 时 影响 这些 对象 的 创建 , 以便 在 脚本 持续 时间 结束 时 达到 目标 3 。
在 Jmeter 中 , 我 有 一 个 HTTP 请求 采样 器 , 它 包含 一些 静态 XML 主体 和 一些 变量 , 这些 变量 用于 保存 我 插入 动态 生成 的 数据 的 位置 。 我 有 一 个 JSR223 预 处理 器 作为 动态 数据 生成 的 子 元素 。 该 预 处理 器 的 代码 可以 基于 int 参数 生成 一 个 或 多 个 XML 节点 。 如果 我 说 我 想 创建 2 个 XML 节点 ,我 将 这个 参数 设置 为 2 , 可以 创建 1 个 或 99 个 这样 的 节点 , 然后 在 每个 请求 中 , 将 这个 XML 节点 插入 到 HTTP 请求 采样 器 的 主体 有效 负载 中 的 变量 place 中 。
我 称 之 为 XML 节点 的 例子 。 在 这个 例子 中 , 我 有 3 个 这样 的 节点 。 一 个 节点 在 标记 之间 :

<object a='false' b='false' pReqID='ID00001'>
    <al ad='2021-09-20' alc='bla' bla='2021-09-20T11:00:00.000Z' sn='AB8912' />
    <doc docType='P' docId='555551555' name='Braiden' date='12/31/2022' />
  </object>
  <object a='false' b='false' pReqID='ID00002'>
    <al ad='2021-09-20' alc='bla' bla='2021-09-20T11:00:00.000Z' sn='AB8912' />
    <doc docType='P' docId='100000001' name='Dominique' date='12/10/2024' />
  </object>
  <object a='false' b='false' pReqID='ID00003'>
    <al ad='2021-09-20' alc='bla' bla='2021-09-20T11:00:00.000Z' sn='AB8912' />
    <doc docType='P' docId='100000002' name='Joyce' date='11/15/2025' />
  </object>

中 的 每 一 个
我 的 需要 是 每次 生成 的 HTTP 请求 的 主体 中 都 有 不同 的 XML 节点 , 但是 在 脚本 结束 时 , 我 应该 得到 一 个 计算 出 的 数字 3 。
我 知道 我 可以 执行 一 个 介于 1 和 99 之间 的 随机 函数 , 以便 在 每次 运行 时 在 HTTP 请求 正文 中 生成 随机 节点 , 但 我 不 知道 如何 在 脚本 运行 时 控制 平均 节点 数 , 这样 , 在 脚本 结束 时 , 我 将 以 大量 已 发送 的 样本 结束 , 而 这些 样本 的 正文 应 具有 介于 1 和 99 之间 的 不同 内容 节点 ,但 平均 计算 结果 应为 3 。
例如 , 假设 我 用 2 个 线程 和 5 个 循环 发送 同一 个 HTTP 请求 , 总共 发送 了 10 次 , 但 在 这 10 次 中 , 请求 的 主体 包含 1 、 2 、 3 、 4 、 5 、 6 、 7 、 8 、 9 和 10 个 XML 节点 ,但是 我 不 知道 如何 根据 我 对 JMeter 的 要求 来 测量 和 控制/影响 这个 结果 。
JMeter 如何 检查 平均 值 并 控制/影响 每个 请求 上 的 节点 生成 , 以便 在 脚本 运行 了 一定 的 持续 时间 ( 2 小时 ) 后 , 平均 值 变成 我 想要 的 值 ?

vqlkdk9b

vqlkdk9b1#

我认为这是不可能的,因为你不知道在2小时内会发生多少次迭代,你可以得到非常接近3次的迭代,但是如果调用次数波动,平均值也会波动。
如果您从2小时执行切换到固定迭代次数,您可以:

nextGaussian() * desiredStandardDeviation + desiredMean
3zwjbxry

3zwjbxry2#

我找到了一个解决这个问题的方法如下:
1.我定义了一个包含100个数字的数组,如果用来计算平均值,则会给予一个数字3
def payloadElementsCount = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 10, 20, 30, 99]
1.我得到线程数,并使用模运算符得到每个线程数除以100的余数
(1)将所有的线程都分配给一个线程。
定义元素配置= t编号%100
例如:

1%100 = 1
2%100 = 2
50%100 = 50
99%100 = 99
100%100 = 0
101%100 = 1
etc

这样,每次线程执行JSR223采样器中的代码时,我都会得到从0到99的潜在元素数。
然后,我可以使用这个潜在的元素数作为索引,从我定义的数组中获取一个值,并将该值赋给requiredElements值,该值最终将决定当前样本将生成多少个元素。
示例:

  • 当线程号为99时,我将得到99作为索引,并根据我定义的数组

有效负载元素计数[99] = 99

  • 当线程数为98时,我将得到98作为索引,并根据我定义的数组

有效负载元素计数[98] = 30
因为我的数组中只有100个数字,而且我事先知道它们的平均值是3,那么每100个样本(请求)的平均值将是3。

def requiredElements = payloadElementsCount[elementsConfiguration]

也许这能帮到某人。

相关问题