【问题标题】:Temporarily removing an argument from a JMeter HTTP Request从 JMeter HTTP 请求中临时删除参数
【发布时间】:2025-11-21 15:40:01
【问题描述】:

我的场景是我在循环中发送 HTTP 请求,其中参数值基于 JMeter 变量。当第一次进入循环时,我可能有此时未设置的变量,因此它们为空,因此我想从 HTTP 请求中删除参数。我可以使用下面的代码成功地做到这一点。但是,在以后的循环迭代中,这个变量现在可以有一个值,我想包括我之前删除的参数。所以我的问题是,我怎样才能暂时从我的 HTTP 请求中删除参数?

我有一个 JMeter 测试计划摘录,根据:

  • 当控制器
    • 一些逻辑
    • HTTP 请求
      • JSR223 预处理器(常规)

我的 HTTP 请求有以下参数:

名称值

输入A ${A}

输入B ${B}

我的预处理器脚本如下所示:

  for (Iterator iterator = sampler.getArguments().iterator();
      prop = iterator.next();
      String value = prop.getStringValue();
      if (value.contains('\${')) {
          iterator.remove();
      }
   }

【问题讨论】:

  • 我正在尝试通过一个简单的邮寄电话解决您的解决方案,但它对我不起作用。我错过了什么吗?我实际上正在使用来自 CSV 的参数运行 api 测试,我的目标是在参数值为空字符串时为参数提供空字符串,并在我提供像“nullValue”这样的字符串时删除参数。 JSON body { "ID" : "nullValue" } 脚本:for (Iterator iterator = sampler.getArguments().iterator(); prop = iterator.next(); String value = prop.getStringValue(); if (value. contains('nullValue')) { iterator.remove(); } }

标签: jmeter


【解决方案1】:
  1. 最快、最简单且正确的解决方案是使用__evalVar() JMeter 函数,例如:

    因此,如果未定义 ${A} 变量 - inputA 参数将发送一个空值,并且这些参数将被行为良好的应用程序忽略。请参阅How to Use JMeter Functions 系列指南以开始使用 JMeter 函数

  2. 我记得回答过类似here 的问题,它假设使用Beanshell 检查变量是否为空

  3. 如果由于某些原因第 1 点和第 2 点不适用,这里是完全删除参数的正确代码:

    import org.apache.jmeter.config.Arguments;
    
    Arguments args = sampler.getArguments();
    Iterator it = args.iterator();
    
    while (it.hasNext()) {
        def argument = it.next();
        if (argument.getStringValue().contains('${')) {
            args.removeArgument(argument.getName());
        }
    }
    

【讨论】:

  • 很遗憾,对于(1),应用程序实际上并没有忽略空白值。至于(2)和(3),问题仍然存在,一旦我删除了参数,我就不能在循环的后面使用它。假设我将遍历循环 2 次。第一次 vars.get(“A”) = null,我将删除参数。第二次 vars.get(“A”) = foo,现在我不能应用这个值。至于(3),使用这段代码,我会遇到 java.util.ConcurrentModificationException。也许我可以在修改它们之前将参数保存在 bsh.shared 中,然后将它们设置回后处理器中。我下次试试这个。
  • 然后换一种方式:最初发出不带参数的空白请求,如果关联的变量值存在,则有条件地添加参数。
【解决方案2】:

解决此问题的方法可能是克隆采样器参数对象并将其设置为采样器。

    import org.apache.jmeter.config.Arguments;
    Arguments arguments = sampler.getArguments().clone();
    sampler.setArguments(arguments);
    for (Iterator iterator = sampler.getArguments().iterator();
        prop = iterator.next();
        String value = prop.getStringValue();
        if (value.contains('\${')) {
            iterator.remove();
        }
    }

【讨论】: