пятница, 15 июня 2012 г.

setUp Thread Group и tearDown Thread Group

Относительно недавно передо мной стояла неободимость выполнить перед основным тест-планом ряд дейтсвий и сделать тоже самое в конце. Самого простого решения я почему-то сразу не заметил и начал копать недра JMeter'а. Но в итоге решение оказалось настолько элементарным.)))
setUp Thread Group (Add -> Threads (Users) -> setUp Thread Group) и tearDown Thread Group (Add -> Threads (Users) -> tearDown Thread Group) - это два элемента по умолчанию входящие в состав JMeter'а. Первый выполянет действия перед выполнением основного тест-плана, второй в конце.
Один из примеров использования групп - это снятие снапшота с базы данных в начале выполнения тестов и в конце с сохранением номеров данных снапшотов для формирования AWR отчета.
Что такое AWR и как это сделать? Вот отличная статья.

понедельник, 14 мая 2012 г.

JMeter-Plugins. Часть 2: Stepping Thread Group

Stepping Thread Group - еще один кастомный Thread Group от JMeter-Plugins. Он не имеет бесконечного количества планировщиков, как Ultimate Thread Group, но имеет более гибкий алгоритм планирования в отличие от стандартного Thread Group.

Для Stepping Thread Group мы можем указать следующее:

  • количество пользователей;
  • задержку перед стартом;
  • активирование определенного количества в пользователей с заданным интервалом;
  • время работы после активирования всех пользователей;
  • завершение работы определенного количества в пользователей с заданным интервалом.
И аналогично Ultimate Thread Group нам отображается превью графика нашей нагрузки.


пятница, 4 мая 2012 г.

JMeter-Plugins. Часть 1: Ultimate Thread Group

Допустим, вам для тестирования производительности нужно сэмулировать реальную работу той или иной системы. При этом вам необходимо учесть время старта работы пользователей, скорость их наплыва, пики работы в течение дня, перерывы, окончание работы пользоватей. Силами стандартных Thread Group это реализовать достаточно сложно. Но с такой задачей мы легко можем справиться при помощи Ultimate Thread Group, которая входит в состав JMeter-Plugins.

В стандартном Thread Group мы можем указать только количество пользователей, время разгона и количество повторов. Так же есть один планировщик запуска.

Что мы имеем в Ultimate Thread Group. Неограниченое количество планировщиков запуска для каждого из которых мы можем указать:

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


четверг, 3 мая 2012 г.

JMeter JDBC

JDBC Request предназначен для запросов к различным базам данных.
Перед использованием этого запроса необходимо в наш тест-план добавить JDBC Connection Cofiguration (Add -> Config Element -> JDBC Connection Configuration), с него и начнем. Это конфигурационный элемент, который используется для подключения к базе данных.


"Variable Name" - это имя, используемое в JDBC Request для изпользования данного соединения.
Различные базы данных и JDBC-драйверы требуют различных настроек. В документации Apache JMeter описаны возможные параметры подключения. Файл JDBC-драйвера необходимо положить в папку "lib" корневого каталога JMeter.

Если JMeter  выдал "No suitable driver" - это означает, что он либо не нашел JDBC Driver, либо драйвер был найден, но строка подключени содержит ошибку. Если база данных не работает или недоступна, то мы получим "java.net.ConnetcExeption".


После настройки нашего соединения добавляем JDBC Request (Add -> Sampler -> JDBC Request).



В Variable Name запроса указываем имя созданного JDBC Connection Configuration, указываем тип за проса в Query Type и в SQL Query пишем сам запрос.

Parameters Value и Parameters Type - значения и типы переменных, которые необходимо использовать, если запрос вызывается с параметрами. И значения, и типы указываются списком через запятую.

В поле Variables Name мы через запятую вводим список имен переменных, которые будет использовать для  сохранения значений, которые вернул на запрос SELECT. Сохраняются эти значения следующим образом:
Допустим, наш запрос возвращает две колонки и три строки. В Vrariable Names мы вписываем "A, B". В результате выполнения запроса у нас будет созданы несколько перменных: A_# и B_# вернут количество строк (т. е. значение  3), A_1, A_2, A_3, B_1, B_2  и B_3 вернут значения соответствующих ячеек.
Если указан параметр Result  Variable Name, то будет создан объект, содержащий спискок мапов. Каждый мап содержит в себе имя колонки как ключ и данные колонки как значение. Для обращения к полученному объекту используем метод getObject:
columnValue = vars.getObject("resultObject").get(0).get("Column Name"); 

четверг, 19 апреля 2012 г.

Рандомные значения. Часть 2

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

Допустим, нам нужно рандомное значение от 0 до указанного числа: ${__javaScript(Math.floor(Math.random()*(${maxRandom}+1)),myRandom)}.

_javaScript также присутствует в Function Helper Dialog


При помощи яваскрипта можно генерить и более сложные значения:

${__javaScript(
var startDate = new Date();
startDate.setDate(1);
startDate.setMonth(0);
startDate.setYear(1991);
var startDateTime = startDate.getTime();

var endDate = new Date();
endDate.setDate(31);
endDate.setMonth(11);
endDate.setYear(2003);
var endDateTime = endDate.getTime();

var randomDate = new Date();
var randomDateTime = startDateTime+Math.random()*(endDateTime-startDateTime);
randomDate.setTime(randomDateTime);

var rndDate = randomDate.getDate();
var rndMonth = randomDate.getMonth() + 1;
var rndYear = randomDate.getFullYear();

if (rndDate.toString().length == 1)
rndDate = "0" + rndDate;
if (rndMonth.toString().length == 1)
rndMonth = "0" + rndMonth;

rndDate + "/" + rndMonth + "/" + rndYear;)}

В результате мы получим рандомную дату в промежутке между от 01.01.1991 до 31.11.2003


Так же рандомные значения можно получить при помощи, например, BeabShell PreProcessor (Add->PreProcessors->BeanShell PreProcessors.



Тут можно найти один из примеров использования BeanShell PreProcessor.

среда, 18 апреля 2012 г.

Рандомные значения. Часть 1

Есть несколько вариантов генерации случаных значений. Самый просто способ - это использовать встроенные функции JMeter __Random и __RandomString. Первая функция генерирует рандомное значение в указанном диапазоне с в возможностью указания имени переменной для дальнейшего использования сгенерированного значения (${__Random(1,100,myRandom)}). Вторая функция генерирует рандомную строку указанной длины с использованием указанных символов также с возможностью указания имени(${__RandomString(5,abcdefghijk12345,myRandom)}).

В JMeter есть встроенная утилита для генерирования подобных функций (Option->Function Helper Dialog), в которой необходимо выбрать нужный тип, ввести входные значения и нажать кнопку [Generate].



Но у этих функий есть один минус. Если мы в User Defined Variables объявим переменную и в качестве значения укажем __Random или __RandomString, то это рандомное значение сгенерится один раз на весь тест план и для всех пользователей. То есть если  мы запускаем Thread Group для 10 юзеров и каждый обращается к рандомной переменной, то все они получат одно и то же значение. Поэтому для этих целей лучше использовать Random Variable (Add->Config Element->Random Variable).


Добавляем Random Variable и указываем в нем следующие параметры:
  • имя переменной для дальнейшего обращения (Variable Name)
  • формат (Output Format) (значение формата может состоять только из нулей, указывающих разрядность, или же с содержанием символов как перед нулями так и после)
  • минимальное значение (Minimum Value)
  • максимальное значение (Maximum Value)
  • основу для генерации рандомных значений, которой по умолчанию является текущее время в миллисекундах ( Seed for Rundom function)
Параметр "Per Thread (User)": если значение параметра False, то генератор общий для всех Thread Group, если значение True, то генератор свой для каждого пользователя.

И так мы имеем следующую картину:



Теперь при использовании нашей переменной myRandom мы всегда будем получать новое значение.