JMeter, потоки, использующие динамическое приращенное значение - PullRequest
0 голосов
/ 16 декабря 2011

Я создал функциональный тест JMeter, который по существу:

  1. создает пользователя;
  2. входит в систему с пользователем;
  3. удаляет пользователя.

Теперь мне нужно иметь возможность поточить это и динамически генерировать имя пользователя с префиксом по умолчанию и численно увеличенным суффиксом (т. Е. TestUser_1, TestUser_2, ... и т. Д.).

Я использовал счетчик, и все работало нормально, пока я действительно не увеличил количество потоков / циклов.Когда я это сделал, у меня возник конфликт с прилавком.Некоторые потоки пытались прочитать счетчик, но счетчик уже был увеличен другим потоком.Это привело к попытке удалить только что созданный поток, а затем к входу с помощью только что удаленного потока.

Проект настроен так:

Test Plan
    Thread group
        Counter
        User Defined Variables
        Samplers

Iнадеялся решить эту проблему с помощью счетчика для добавления числа к пользовательским переменным при выполнении потока, но к счетчику нельзя получить доступ к пользовательским переменным.

Любые идеи о том, как я могу решить эту проблему?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

Я успешно использовал следующую схему с любым количеством тестовых пользователей:

1. Генерация с использованием BeanShell Sampler * (например, Sampler ) csv-файл с информацией о тестовом пользователе, например:

testUserName001,testPwd001
testUserName002,testPwd002
. . .
testUserName00N,testPwd00N

с количеством записей, необходимых для прогона теста.
Это делается один раз за "тестовый прогон N пользователей", вотдельная группа потоков, в setUp группа потоков или, может быть, даже в отдельном jmx-скрипте ... без разницы.

Вы можете найти рабочий код бобовой оболочки ниже.


2. Создание тестовых пользователей в тестовом приложении с использованием ранее созданного списка пользователей.
Если вам не нужно создавать в приложении, вы можете пропустить это.

    <b>Thread Group</b>
    Number of Threads = 1   
    Loop Count = 1
        . . .
        <b>While Controller</b>
        Condition = ${__javaScript("${newUserName}"!="",)}  <i>// this will repeat until EOF</i>
            <b>CSV Data Set Config</b>
            Filename = ${__property(user.dir)}${__BeanShell(File.separator,)}${__P(users-list,)}    <i>// path to generated users-list</i>
            Variable Names = newUserName,newUserPwd    <i>// these are test-users details read from file into pointed variables</i>
            Delimiter = '
            Recycle on EOF? = False
            Stop thread on EOF? = True
            Sharing Mode = Current thread group

            <b>[CREATE TEST USERS LOGIC HERE]</b>  <i>// here are actions to create separate user in application</i>
                . . .


3. Выполнение многопользовательской логики.Схема, подобная приведенной выше, но группа потоков выполнена не для 1, а для потоков N.

    <b>Thread Group</b>
    Number of Threads = <b>${__P(usersCount,)}</b>    <i>// set number of users you need to test</i>
    Ramp-Up Period = ${__P(rampUpPeriod,)}  
    Loop Count = X
        . . .
        <b>While Controller</b>
        Condition = ${__javaScript("${newUserName}"!="",)}  <i>// this will repeat until EOF</i>
            <b>CSV Data Set Config</b>
            Filename = ${__property(user.dir)}${__BeanShell(File.separator,)}${__P(users-list,)}    <i>// path to generated users-list</i>
            Variable Names = newUserName,newUserPwd    <i>// these are test-users details read from file into pointed variables</i>
            Delimiter = '
            Recycle on EOF? = False
            Stop thread on EOF? = True
            Sharing Mode = Current thread group

            <b>[TEST LOGIC HERE]</b>  <i>// here are test actions</i>
                . . .


Основная идея заключается в использовании группы потоков + Контроллер + Данные CSVУстановите комбинацию настроек:

3.1.Конфигурация набора данных CSV считывает подробности для каждого тестового пользователя из сгенерированного файла:
.,,а.только один раз - из-за «Остановить поток на EOF? = True»;
.,,б.не блокирует файл для дальнейшего доступа (в других группах потоков, например, если они есть) - из-за «Sharing Mode = Текущая группа потоков»;
.,,с.указанные переменные - «Variable Names = newUserName, newUserPwd» - вы будете использовать в дальнейших тестовых действиях;
3.2.В то время как контроллер заставляет CSV Data Set Config прочитать все записи из сгенерированного файла - из-за определенного условия (до EOF).
3.3.Группа потоков запустит все потоки с определенным нарастанием - или одновременно, если нарастание = 0.


Здесь вы можете взять шаблон сценария для описанной схемы: multiuser.jmx .


Скрипт Beanshell для генерации сведений о тестируемых пользователях выглядит следующим образом и принимает следующие аргументы:
- количество тестовых пользователей
- шаблон имени тестового пользователя («TestUser_» в вашем случае)
- формат имени тестового пользователя (например, 0 - для получения TestUser_1, 00 - для получения TestUser_01, 000- для TestUser_001 и т. д. ... вы можете просто жестко кодироватьэто вообще исключает)
- имя сгенерированного файла.

import java.text.*;
import java.io.*;
import java.util.*;

String [] params = Parameters.split(",");

int count = Integer.valueOf(params[0]);
String testName = params[1];
String nameFormat = params[2];
String usersList = params[3];

StringBuilder contents = new StringBuilder();

try {
    DecimalFormat formatter = new DecimalFormat(nameFormat);
    FileOutputStream fos = new FileOutputStream(System.getProperty("user.dir") + File.separator + usersList);

    for (int i = 1; i <= count; i++) {
        String s = formatter.format(i);
        String testUser = testName + s;
        contents.append(testUser).append(",").append(testUser);

        if (i < count) {
            contents.append("\n");
        }
    }

    byte [] buffer = contents.toString().getBytes();    

    fos.write(buffer);
    fos.close();
}
catch (Exception ex) {
    IsSuccess = false;
    log.error(ex.getMessage());
    System.err.println(ex.getMessage());
}
catch (Throwable thex) {
    System.err.println(thex.getMessage());
}


Все вместе это будет выглядеть так:

enter image description here

Извините, если ответ слишком перегружен.
Надеюсь, это поможет.

1 голос
/ 03 августа 2017

Элемент конфигурации «Пользовательские переменные» не выбирает ссылочную переменную из элемента конфигурации «Счетчик». Я думаю, что это ошибка в JMeter. Я проверил это поведение в версии 3.2. Я добавил элемент «BeanShell Sampler», чтобы обойти эту проблему.

Обратите внимание, что ссылочное имя элемента "Counter" равно INDEX Counter

Переменная RUN_FOLDER устанавливается в комбинацию переменной TESTS_FOLDER и переменной INDEX в "BeanShell Sampler" BeanShell

«Debug Sampler» просто собирает снимок переменных, чтобы я мог видеть их в элементе слушателя «View Results Tree». Обратите внимание, как к переменной RUN_FOLDER добавлено значение переменной INDEX (в нашем случае 5). enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...