2013-03-19 3 views
0

У меня есть случай, когда конкретный API нужно вызывать только один раз для инициализации. После этого потоки могут вызывать другие методы. В vuser_init.c, у меня есть это:Можно ли инициализировать Loadrunner Vuser как singleton?

static volatile int initOnlyOnce = 0; 
static volatile int initComplete = 0; 
int iStatus; 

if (1!=initOnlyOnce) { 
     initOnlyOnce =1; 
     lr_output_message("Before, initComplete = %d", initComplete); 
     iStatus = Initialize(); // product API call 
     initComplete = 1; 
     lr_output_message("After, initComplete = %d", initComplete); 
     if (1 != iStatus) { 
      lr_error_message("Initialize returns %d on %s.",iStatus,szLoadGenerator); 
      srand(time(NULL)); 
     } 
    } 

При запуске сценария, первый поток печатает оба, т.е.

Before, initComplete = 0 

следует

After, initComplete = 1 

и остальное тест выполняется в этой ветке, правильно. Однако следующий поток выходит из строя с ошибкой «Ошибка - память: Исключение ACCESS_VIOLATION получено», потому что он выполнил последующий метод без завершения инициализации или initComplete равен 0. Журналы для каждого из других потоков имеют «Before, initComplete = 0 "в качестве последней строки. Так как я определил эти переменные как статические, летучий, я ожидал, что

initOnlyOnce = 1 

сразу после того, как первый поток называют его и в дальнейшем этот блок кода не будет введен снова. Однако, похоже, что Vugen не то же самое, что нить. Каждый vuser_init.c не зависит от других запусков Vugens, поэтому состояние не является общим, хотя переменные объявляются статическими волатильными.

Есть ли обходной путь? По сути, я хочу, чтобы одиночный предшественник vuser_init.

ответ

1

я бы просто использовать переменный виртуальный номер пользователя и проверить, если номер был 1.

PCODE (в INIT)

Если (Значение виртуального пользователя переменной == 1) { Запустить код инициализации; }

Итак, вам нужно создать переменную, а затем, возможно, назначить одного виртуального пользователя только для обработки инициализации, а затем выйти. Поместите этого пользователя в группу самостоятельно, а затем, возможно, даже выйдите до того, как начнут запускаться другие пользователи.

Вы можете добавить другие функции, которые планируется запустить перед VUSER_INIT(), если хотите. Добавьте функции в список функций справа, затем перейдите в настройку времени выполнения и планируйте свою функцию для запуска один раз, перед vuser_init().

+0

Спасибо за подсказку. Я создал две группы и добавил их к сценарию на контроллере. Для инициализации я назначил 1% vusers (1 из 100), а остальное для фактического прогона. Когда я запускаю его таким образом, я получаю сообщение о том, что какая-то функция отсутствует во второй группе, что вызывает недоумение. Но, умный ли LR сначала запустить мою группу init, а затем следующую? – Jai

+0

Вы можете добавить свой собственный init перед инициализацией vuser. Кроме того, вы можете добавить логику, чтобы запускать ее только для одного пользователя на основе номера виртуального пользователя. –

1

Способ, которым LoadRunner запускает виртуальных пользователей, не так-то просто понять, и гораздо меньше того, от чего вы должны зависеть.

В большинстве случаев vu работает как потоки под особым процессом MMDRV. Процесс MMDRV выполняет около 50 потоков, а затем двигатель LR запускает другой процесс MMDRV, который снова запускает 50 потоков. (Вы также можете запускать VUsers как процесс, посмотрите настройки времени выполнения).

Также, если у вас есть LoadGenerators в вашем тесте, они выполняются на разных компьютерах и не имеют способа узнать, сколько vusers запущено на других машинах.

Как заявил Джеймс, используя VUserID, поскольку «проверка» - лучший вариант здесь, если вы хотите сделать это в коде. Чтобы получить VUserID в качестве нового параметра под названием «VUserID» и выберите тип как VUserID. Затем вы можете использовать это с lr_eval_string("{VUserID}"), как и любой другой параметр.

Другой вариант запускает сценарий в режиме, в котором сначала выполняется один скрипт, а затем остальные.

Смежные вопросы