Я успешно использовал следующую схему с любым количеством тестовых пользователей:
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());
}
Все вместе это будет выглядеть так:
Извините, если ответ слишком перегружен.
Надеюсь, это поможет.