首页 > 解决方案 > JMeter IF条件检查

问题描述

在客户端脚本中,第一个用户在日历中为第二个用户创建事件,第二个用户接受/拒绝它们。

我想排除事件创建过程中可能出现的错误,并检查是否在第二个用户尝试使用基于事件请求模板构建的 xpath 接受它之前创建了事件请求,例如:

EventRequest_SubjectN
(N 是事件请求在一个周期内的迭代次数,因此如果事件请求 N 不是由第一个用户创建的,则事件 N 的第二个用户操作失败)。

在这些操作之间是两个用户的另一个操作,因此我不能使用 ${JMeterThread.last_sample_ok}。

是否有此功能的任何模拟,但对于几个步骤前的必要/特定操作,而不是最后一个示例?

在这种情况下,组织 IF 条件的最佳方法是什么?

我考虑在第一个用户事件请求 N 之后添加 BeanShell PostProcessor,代码如下:

var rc = prev.getResponseCode(); 如果(rc.equals(“200”)){

vars.put('EventRequest_Subject_${N}', 'EventRequest_Subject_${N}'); }

并为第二个用户的 IF 控制器中的 EventRequest_Subject_${N} 使用非空条件。

但它不能以这种方式工作。我哪里错了?

UPD。解决方案:

尝试了3种方法:

  1. 如果创建了 Event_RequestN - 放入变量特定值,然后在使用 Event_RequestN 进行第二次用户操作之前在 IF 条件下使用它;

  2. 在使用 Event_RequestN 的第二个用户操作之前添加具有特定断言的操作,并在 IF 条件下使用 ${JMeterThread.last_sample_ok};

  3. 在使用 Event_RequestN 的第二个用户操作之前添加使用 xpath 提取器的操作,并在 IF 条件下使用 ${_ isVarDefined(EventRequest_Subject ${N}_FOUND)};

并最终将第 3 个变体作为最佳实践。

标签: if-statementjmeterclient-side

解决方案


  1. 不要使用 Beanshell,因为 JMeter 3.1 你应该使用 JSR223 测试元素和 Groovy 语言编写脚本

  2. 不要将 JMeter 函数或变量内联到脚本中,而是使用基于代码的等效项

  3. 根据JMeter 文档

    属性与变量不同。变量是线程本地的;属性对所有线程都是通用的

    所以如果你想在 2 个线程(虚拟用户)之间共享一条数据,你需要使用props,而不是vars

  4. 使用线程间通信插件更容易实现您的场景


推荐阅读