Как программно построить вход ForEach? - PullRequest
0 голосов
/ 20 июня 2019

Я написал пользовательский 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 PostProcessor встречается с другим ForEach Controller, а затем мне нужно заполнить distinctServiceIds_ALL, distinctServiceIds_matchNr и все индексированные переменные, чтобы использовать distinctServiceIds в качестве "префикса входной переменной" для моего ForEach Controller.

Хотя это работает, мне это кажется очень хакерским, и мне интересно, есть ли какая-нибудь функция Groovy или что-то еще, чтобы выполнить всю эту работу.

1 Ответ

0 голосов
/ 21 июня 2019

Есть много дополнительных методов, определенных в Groovy

как только vars содержит тип JMeterVariables , чтобы удалить старые vars, вы можете собрать необходимые записи из итератора и вызвать 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 расширение документации

...