Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Сохранение ответов сервера в файл в LoadRunner


(Максим Таран) #1

Кто, когда-либо проводил тестирование на LoadRunner отлично знает, что с отладкой у этого средства (впрочем, как и у других продуктов HP) не всё гладко. Допустим посмотреть, а что же конкретно передаётся между сервером и LR штатными средствами можно двумя способами.

  1. Thumbnails mode. В этом режиме наш скрипт превращается в дерево шагов а справа отображается информация, которую мы отсылаем и ответ, полученный на неё. С первого взгляда всё красиво, но… Очень нестабильно - вываливается приложение, причём таким образом, что продолжает держать скрипт на стороне ALM. Соответственно редактировать его нельзя, пока не пройдёт таймаут для освобождения скрипта, что очень не быстро.
  2. Включить расширенное легирование в Run-Time settings. В таком случае мы получаем информацию по обмену в лог-файле после выполнения скрипта. Но это представлено в таком виде, что пользоваться практически не реально из-за двух моментов. В лог страницы пишуться точно также, как происходил обмен, то есть кусками (chunk). Соответственно, чтобы получить готовую страницу приходиться весь лог открывать в каком-нибудь редакторе. Вырезать все “чанки”, вырезать номера строчек лога (которые тоже, зачем-то, пишутся в лог в явном виде), и только после этого можем сохранить информацию как HTML или XML-файл.

При этом, про отладку первым способом в многопоточном режиме, естественно, речи не идёт. :slight_smile:
Есть ещё один способ посмотреть что же передаётся в процессе работы - это Fiddler. Вещь шикарная. Имеющая много плюшек, типа меток, поиск по регулярным выражениям, сравнение, сохранение сессий и прочая, прочая. К тебе этой заметке отношения сейчас не имеет. Но, опять же, в многопоточном режиме не работает.

Что же делать. Как получить информацию при нагрузке. Для этого делаем следующее:

  1. Создаём параметр скрипта типа Iteration и называем параметр точно так же. :slight_smile:

  2. Перед каждым запросом к серверу в скрипте вставляем следующую конструкцию:

    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”.

  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.


Обновление портала automated-testing.info