Кто, когда-либо проводил тестирование на LoadRunner отлично знает, что с отладкой у этого средства (впрочем, как и у других продуктов HP) не всё гладко. Допустим посмотреть, а что же конкретно передаётся между сервером и LR штатными средствами можно двумя способами.
- Thumbnails mode. В этом режиме наш скрипт превращается в дерево шагов а справа отображается информация, которую мы отсылаем и ответ, полученный на неё. С первого взгляда всё красиво, но… Очень нестабильно - вываливается приложение, причём таким образом, что продолжает держать скрипт на стороне ALM. Соответственно редактировать его нельзя, пока не пройдёт таймаут для освобождения скрипта, что очень не быстро.
- Включить расширенное легирование в Run-Time settings. В таком случае мы получаем информацию по обмену в лог-файле после выполнения скрипта. Но это представлено в таком виде, что пользоваться практически не реально из-за двух моментов. В лог страницы пишуться точно также, как происходил обмен, то есть кусками (chunk). Соответственно, чтобы получить готовую страницу приходиться весь лог открывать в каком-нибудь редакторе. Вырезать все “чанки”, вырезать номера строчек лога (которые тоже, зачем-то, пишутся в лог в явном виде), и только после этого можем сохранить информацию как HTML или XML-файл.
При этом, про отладку первым способом в многопоточном режиме, естественно, речи не идёт.
Есть ещё один способ посмотреть что же передаётся в процессе работы - это Fiddler. Вещь шикарная. Имеющая много плюшек, типа меток, поиск по регулярным выражениям, сравнение, сохранение сессий и прочая, прочая. К тебе этой заметке отношения сейчас не имеет. Но, опять же, в многопоточном режиме не работает.
Что же делать. Как получить информацию при нагрузке. Для этого делаем следующее:
-
Создаём параметр скрипта типа Iteration и называем параметр точно так же.
-
Перед каждым запросом к серверу в скрипте вставляем следующую конструкцию:
web_reg_save_param_ex("ParamName=allpage", "LB=", "RB=", "Notfound=warning", SEARCH_FILTERS, "RelFrameID=ALL", "IgnoreRedirections=off", "Scope=Body", "ContentType=text/*l*", LAST);
Таким образом, мы сохраним в переменную allpage
всё содержимое тела http-сообщения при этом только нужного нам типа (в данном случае под фильтр попадают ContentType равные text/html, text/xml, text/plain). При этом необходимо учитывать следующий момент, что в случае, когда на один запрос, возвращается несколько ответов, то все ответы, которые подпадают под фильтр будут сохранены в переменную allpage
.
Но в таком случае это будет ссылкой на массив, по сути. Размер данного массива можно узнать обратившись к переменной allpage_count
(как будет описано далее). Элементы массива располагаются в переменных с именем allpage_n
, где n - порядковый номер элемента, начиная с “1”.
- После запроса передаём его в нашу функцию
printallpage
для сохранения в лог и в файл:
printallpage("Transaction_name");
Далее приводится тело самой функции:
//Функция для перебора массива сохранённых страниц и дальнейшей печати в консоль и в файл
int printallpage(char *tranname){
char allpageid[50]; //имя элемента массива
int elemCnt; //общее количество элементов
int x; //Счётчик
char newname[100]; //новое имя файла/транзакции
elemCnt = atoi(lr_eval_string("{allpage_count}"));
lr_output_message("allpage_count = %d.", elemCnt);
if(elemCnt==0)
return -1;
for (x=1; x<=elemCnt; x++) {
sprintf(allpageid, "{allpage_%d}", x); //получаем новое имя элемента массива
sprintf(newname, "%s.%s_%d", lr_eval_string("{Iteration}"), tranname, x); //генерим новое имя
lr_log_message("%s begin +=+=+==+=+=\n"
"%s\n"
"%s end +=+=+=+=+=",
newname,
lr_eval_string(allpageid),
newname);
savetofile(newname, lr_eval_string(allpageid));
}
return 0;
}
//Функция для сохранения строки в файл
int savetofile(char *tranname, char *content)
{
char filename[256], dirname[] = "c:\\temp\\HTMLS";
long file;
//Create catalog
mkdir(dirname);
sprintf(filename, "%s\\%s.html",dirname, tranname);
lr_output_message("Save response to %s", filename);
// Create a new file
if ((file = fopen(filename, "w+" )) == NULL) {
lr_output_message("Unable to create %s", filename);
return -1;
}
// Write content to file
fprintf(file, "%s", content);
fclose(file);
}
Проделав всё это, мы получаем в логе нормально сформированный html, xml ответ от сервера, который выделяется “+=+=+=+=+=+=+=+=+=+=+=” и словами begin, end. Соответственно можно легко написать парсер, который выдирает из лога страницы и сохраняет в файл (собственно так у меня и было реализовано). Парсер необходим в случае, если невозможно сохранять файлы сразу на сервере. В таком случае мы удаляем или комментируем вызов функции savetofile
в функции printallpage
.