Обновите значение параметра для каждого вхождения для одного и того же запроса в JMeter - PullRequest
0 голосов
/ 05 июля 2018

Я готовлю данные для отправки как часть HTTP-запроса, поэтому подготовка данных выполняется в препроцессоре BeanShell.

При изменении размера запроса мне нужно передать переменную длину JSON. Я создаю тело JSON для цикла for, но параметры не меняются, например:

try{
    int[] po = {20, 30, 40, 50, 75};
    int rNum = getRandom(0,4);

    String name="${name}";
    String _class="${_class}";
    StringBuilder msgBody = new StringBuilder();
    msgBody.append("{\"name\":\"")
    .append(name)
    .append("\", \"class\":\"")
    .append(_class)
    .append("\", \"marks\":[");
    for (int i=0;i<po\"[rNum];i++)
    {   
        msgBody.append("{ \"subject\":\"${__P(marks${line_offset})}\"," },");
     }
     int length=msgBody.length()-1;
     log.info(String.valueOf(length));
    msgBody.setLength(length);
    msgBody.append("] }");
    vars.put("json",msgBody.toString());
}

${__P(marks${line_offset})} остается неизменным внутри цикла.

Как включить изменение внутри цикла?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Почему вы ожидаете, что это изменится? Свойства JMeter: global для всей JVM и общие для всех потоков. Поэтому ${__P(marks${line_offset})} всегда будет иметь одно и то же значение, если вы не установите его в другом месте Согласно документации :

Свойства не совпадают с переменными. Переменные являются локальными для потока; свойства являются общими для всех потоков

Еще несколько вещей, которые нужно проверить / исправить:

  1. Как правило, ваш скрипт не будет работать в своем текущем состоянии, так как он полон ошибок, например:

    int[] po\" = {20, 30, 40, 50, 75}; // won't compile due to \"
    String class="${class}"; // won't compile as "class" is a reserved keyword
    etc.
    

    В следующий раз, когда вы столкнетесь с проблемой, укажите точный код

  2. Начиная с JMeter 3.1 рекомендуется использовать JSR223 Test Elements и язык Groovy в основном для сценариев, поскольку Производительность Groovy намного лучше по сравнению с Beanshell . В частности, в вашем случае вы можете получить выгоду от использования JsonBuilder и / или JsonOutput

  3. Согласно JSR223 Sampler Документация - предположительно основная причина вашей проблемы:

    JMeter обрабатывает ссылки на функции и переменные перед передачей поля скрипта интерпретатору, , поэтому ссылки будут разрешены только один раз . Ссылки на переменные и функции в файлах сценария будут дословно передаваться интерпретатору, что может вызвать синтаксическую ошибку. Чтобы использовать переменные времени выполнения, пожалуйста, используйте соответствующие методы props, например,

    props.get("START.HMS");

    props.put("PROP1","1234");

0 голосов
/ 05 июля 2018

В скриптах используйте props вместо функции и vars вместо переменной

  props.get("marks" + vars.get("line_offset"));
...