Проблема с логикой в ​​скрипте LoadRunner

Я написал сценарий потока приложений на основе веб-протокола, в котором мне нужно выбрать 20 отчетов для загрузки. Идентификаторы ReportID отображаются в запросе. Я настраиваю запрос таким образом, чтобы запрос собирал 20 отчетов (ReportID), которые являются либо EXCEL, либо CSV (ReportOutput), а статус — успех (ReportStatus). Я успешно захватил параметры LR через традиционный "wsrp" с Ord = All, и вот моя логика

int i;
int count=0;
char ro_buffer[25],rs_buffer[25];
lr_save_string("","R_buffer");

for(i=0;i<=atoi(lr_eval_string("{ReportID_count}");i++)
{
sprintf(RO_buffer,"%s",lr_paramarr_idx(ReportOutput,i))
sprintf(RS_buffer,"%s",lr_paramarr_idx(ReportStatus,i))
if((lr_eval_string(ro_buffer)=="EXCEL" || lr_eval_string(ro_buffer) =="CSV") && lr_eval_string(rs_buffer)=="S")
{
count++;
if(count>20) break;
lr_param_sprintf("R_buffer","%s%s%2c",lr_eval_string("{R_buffer}"),lr_paramarr_idx(ReportID,i));
 }
}

В приведенном выше коде vugen не выполняет код внутри блока if, даже если условие удовлетворяет, то есть когда формат вывода отчета — «EXCEL» или «CSV», а состояние отчета — «S». Даже из ответа сервера я вижу, что значения успешно выводятся в соответствии с блоком if. Я также использовал синтаксис lr_param_sprintf вместо sprintf, но ситуация точно такая же. Но бесполезно. Не могу понять, что такое недостающая точка.... Нужна помощь в этом..


person Narasimhan    schedule 11.06.2015    source источник


Ответы (2)


Четыре вопроса.

  1. Как инженер по производительности, выйдите за пределы цикла for, чтобы один раз преобразовать строку в целое число. Мы должны использовать передовые методы повышения производительности, как и любой другой разработчик.

  2. Строка, которую вы создаете с помощью sprintf(), не включает фигурные скобки "{%s}", необходимые для lr_eval_string("{paramname}");

  3. У вас есть ro_buffer в вашем оценочном выражении, но выражение sprintf() использует RO_buffer (обратите внимание на верхний регистр). Переменные чувствительны к регистру в C

  4. Ваше выражение не будет работать для сравнения двух строк. Взгляните на strcmp() - Сравнение строк.....

person James Pulley    schedule 12.06.2015
comment
Спасибо, Джеймс, я пропустил strcmp(). Что касается пункта № 3, это была опечатка, vugen выдал бы ошибку компилятора. Пункт № 2 - я не использовал фигурные скобки, но это сработало :) И я не понял вашего пункта № 1, что вы имеете в виду, говоря о том, что вы должны выйти за пределы цикла for, чтобы один раз преобразовать строку в целое число? - person Narasimhan; 15.06.2015
comment
Sting to int стоит дорого. Приведите его один раз к целочисленному типу данных вне цикла и сохраните его в переменной, такой как int looplimit. Затем для вашего цикла оцените цикл с ограничением вместо того, чтобы всегда переделывать из строки в int для оценки в начале цикла. Сохраняйте фигурные скобки, это облегчит вам жизнь. - person James Pulley; 15.06.2015
comment
Хорошо понял. Спасибо за это. - person Narasimhan; 15.06.2015

Вам нужен код, который выглядит примерно так:

int i;
int count=0;
char ro_buffer[25],rs_buffer[25];
lr_save_string("","R_buffer");

for(i=0;i<=lr_eval_int("{ReportID_count}");i++)
{
    if (((strcmp(lr_paramarr_idx("ReportOutput",i),"EXCEL")) == 0) & ((strcmp(lr_paramarr_idx("ReportOutput",i),"CSV")) == 0) & ((strcmp(lr_paramarr_idx("ReportStatus",i),"S")) == 0)) {
        count++;
        if(count>20) break;
        lr_param_sprintf("R_buffer","%s%s%2c",lr_eval_string("{R_buffer}"),lr_paramarr_idx(ReportID,i));
    }
}

Я вообще не проверял это. Вы можете быть осторожны с индексом для ReportOutput, ReportStatus и ReportID, который может не совпадать в зависимости от вашего регулярного выражения. Вам может понадобиться новый индекс «i» или два.

person Michael Galos    schedule 14.06.2015
comment
Спасибо, Майк, я только что использовал sprintf, так что даже более низкие версии будут совместимы со скриптом. - person Narasimhan; 15.06.2015