代码之家  ›  专栏  ›  技术社区  ›  Guerric P

如何以编程方式构建foreach输入?

  •  0
  • Guerric P  · 技术社区  · 5 年前

    我写了一个习惯 JSR223 PostProcessor 为了消除重复 JSON Extractor 数组,然后为 ForEach Controller

    import java.util.stream.Collectors;
    
    def previousValuesMatchNrAsString = vars.get("distinctServiceIds_matchNr");
    def previousValuesMatchNr = previousValuesMatchNrAsString ? previousValuesMatchNrAsString.toInteger() : 0;
    for(i = 1; i <= previousValuesMatchNr; i++) {
        vars.remove("distinctServiceIds_" + i);
    }
    vars.remove("distinctServiceIds_ALL");
    vars.remove("distinctServiceIds_matchNr");
    
    def values = vars.get("serviceIds_ALL").split(",");
    def newValues = Arrays.stream(values).distinct().collect(Collectors.toList());
    def newValuesCount = newValues.size();
    def joinesNewValues = String.join(",", newValues);
    vars.put("distinctServiceIds_ALL", joinesNewValues);
    newValues.eachWithIndex { var, idx -> vars.put("distinctServiceIds_" + (idx + 1), var) };
    vars.put("distinctServiceIds_matchNr", newValuesCount.toString());
    

    我必须先清除变量,因为 JSR223后处理器 遇到另一个 Foreach控制器 ,然后我必须填充 distinctServiceIds_ALL ,请 distinctServiceIds_matchNr 以及所有索引变量以便使用 distinctServiceIds 作为我的“输入变量前缀” Foreach控制器 .

    虽然这是可行的,但对我来说,它似乎非常简单,我想知道是否有一些groovy函数,或者其他什么东西来完成所有这些工作。

    0 回复  |  直到 5 年前
        1
  •  0
  •   daggett    5 年前

    在groovy中定义了许多其他方法

    只要vars包含类型 JMeterVariables 要删除旧的var,可以从迭代器收集所需的条目,并为每个条目调用remove。

    迭代器的扩展groovy方法可以在中找到 groovy docs

    vars.getIterator().findAll{ it.getKey().startsWith('distinctServiceIds_') }.each{
        vars.remove(it.getKey())
    }
    

    因为groovy,它可以简化为:

    vars.iterator.findAll{ it.key.startsWith('distinctServiceIds_') }.each{
        vars.remove(it.key)
    }
    

    与其他通用类型相同:列表、映射等

    收集唯一值并转换为地图:

    def values = [111,222,333,444,444,444,444]
    def valMap = values.unique().indexed().collectEntries{k,v-> ['distinctServiceIds_'+(k+1),v] }
    vars.putAll(valMap)
    

    所以,检查一下 groovy jdk extension documentation