问题描述
接下来的情况:我需要使用 jmeter 运行性能测试。我已经设置了几个 Graphql 请求,对它们进行了测试,它们运行良好。接下来是流程的想法:
- 用户使用 graphql 突变登录平台,并在响应标头中收到 accesstoken,有效期为一个小时。
- 下一个 graphql 请求必须解析生成的令牌,并使用此令牌执行下一个更改。
- 我们的想法是用 25 万个请求来测试平台,这需要 1 个多小时,正如您可能理解的那样 - 令牌已过期。
我在脚本中做了什么:
- 我创建了 2 个线程组。在第一个中,有一个 Flow is Control 操作元素,它被设置为 3600000 毫秒的暂停持续时间。这意味着它将每小时运行一次登录请求。
- 我正在使用 JSON 提取器抓取令牌,并通过以下命令使用 BeanShell 后处理器对其进行解析:
intersection_A_B = sorted(list(set(listA_ID) & set(listB_ID)))
# Convert Lists to Arrays
np_listA_ID = np.asarray( listA_ID )
np_listB_ID = np.asarray( listB_ID )
# Comparison of two arrays
np_list_ID,listA_ind,listB_ind = np.intersect1d(np_listA_ID,np_listB_ID,assume_unique=False,return_indices=True)
# Keep only Items Needed
np_listA_Var1 = np.asarray( listA_Var1 )
np_listB_Var1 = np.asarray( listB_Var1 )
# Covert Array to List again
listA_ID=listB_ID=np_list_ID.tolist()
listA_Var1 = np_listA_Var1[listA_ind].tolist()
listB_Var1 = np_listB_Var1[listB_ind].tolist()
- 第二个线程组有一个 Graphql 请求来执行对服务器的 250k 请求并使用来自 HTTP 标头的令牌值:
props.put("accesstoken",vars.get("accesstoken"));
一切正常,接受这个事实,我不知道如何设置场景,在第二个线程组完成 250k 请求之后,登录的线程组将完成其运行。 我已经尝试将循环控制器添加到登录,设置为无限,但是一旦第二组将完成 250k 请求 - 运行不会完成,因为登录将永远运行一次。
有什么想法吗?
解决方法
您可以添加 Loop Controller 或 Throughput Controller 并将它们配置为执行这些 250k 请求后跟 Flow Control Action Sampler 配置如下:
到达采样器时 - 它会告诉所有线程组中的所有线程停止。
还要通知 since JMeter 3.1 you're supposed to be using JSR223 Test Elements and Groovy language for scripting 因此现在考虑迁移是有意义的。每小时使用 1 个线程存储一次属性不是您应该担心的事情,但是对于资源密集型任务 Groovy behaves much better(例如它具有 built-in JSON support,因此您可以丢弃 JSON Extractor)