пятница, 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 мы всегда будем получать новое значение.

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

Авторизация

Хотелось бы описать несколько возможных вариантов авторизации...

Если речь идет об авторизации, то в первую очередь стоит добавить HTTP Cookie Manager (Add -> Config Element -> HTTP Cookie Manager), которой стоит использовать всегда, когда речь идет о сессиях пользователя. В настройках данного элемента устанавливаем параметр Cookie Policy = compatibility. Чтобы куки очищались при каждом запуске не забудьте включить опцию "Clear cookies each iteration".



1. Самый простой способо - это авторизация встроенный в  JMeter HTTP Authorization Manager (Add -> Config Elements -> HTTP Autorization Manager), в котором все в принципе понятно: указываем url обязательно с http://, Username и Password.



2. Второй способ - это HTTP Request (Add -> Sampler -> HTTP Request). Дабовляем в него два параметра Username и Password.


Если вы используете для авторизации HTTP Request, то самый надежный способ - это записать сценарий при помощи HTTP Proxy Server, о котором я расскажу чуть позже.


3. Если мы эмулируем действия нескольких пользователей, имеющих свой собственный логин и пароль, то HTTP Autorization Manager или HTTP Request с явно заданными логином и паролем уже не подойдут.
Для начала в нашем HTTP Request'е авторизации вместо конктретных значений вписываем две переменные ${login} и ${pass}.



Где будут храниться значения этих переменных? Есть два варианта: при помощи  User Parameters или в CSV файле. Первый вариант предназначен для небольшого количества пользовательских параметров и в этом пункте речь пойдет именно о нем.

Добавляем User Parameters ( Add -> Pre Proccesors -> User Parameters). По умолчанию там один пользователь без параметров. Добавим еще два (Add User). Потом добавим два параметра login и pass. Указываем значения этих параметров для каждого пользователя.


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


4. Теперь рассмотрим следующий случай: мы имеем тестовый стенд с N-ым количеством пользователей вида login1, login2 ... loginN. Все эти пользователи имеют один и тот же пароль.

Как реализовать авторизацию в этом случае? При помощи метод __counter. Берем тот же User Parametrs и оставляем одного пользователя. Указываем наш пароль, а вместо логина пишем login${__counter(FALSE,)}.


Теперь мы будем получать каждый раз нового пользователя с префиксом login и суффиксом, который стартует с 1 и при каждом обращении увеличивается на 1. Параметр FALSE в методе означает, что этот счетчик глобальный. Если мы поменяем его на TRUE, то этот счетчик будет независимым для каждого пользователя. Для авторизации нужен именно глобальный счетчик.


5. В предыдущем варианте есть пара минусов. Допустим, у нас в рамках тест-плана  должен авторизоваться 101 пользователь, а в системе их только 100. Наш __counter этого не знает и  после 100 пользователей на второй круг не пойдет, а попытается авторизоваться 101-ым пользоватлем. Или наши пользователи имеют формат login001, login 002 ... loginNNN

В этой ситуации нам может помочь элемент Counter (Add -> Config Element -> Counter). Это уже не метод, а отдельный элемент.

Добавляем Counter и указываем в нем следующие параметры:
  • стартовое значение (Start)
  • шаг счетчика (Increment)
  • максимальное значение (Maximum)
  • формат (Number Format) (значение формата может состоять только из нулей, указывающих разрядность, или же с содержанием символов как перед нулями так и после)
  • имя переменной, которое мы потом будет использовать в HTTP Request авторизации (Reference Name)
Параметр "Track Counter Independently for each User" включет независимость счетчика аналагично методу __counter, параметр "Reset counter on each Thread Group Iteration"- сбрасывает счетчик каждую итерацию, что может быть полезно в Loop Controller.

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


Теперь мы правим наш HTTP Request авторизации. В поле  Username вписываем префикс нашего логина и переменную, объявленную в счетчике, и получится login${Id}. В поле Password вписываем наш пароль, общий для всех пользователей.


В том случае, если вы используете все время один и тот же префикс, то можно вынести его Counter в параметр Number Format.

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

just JMeter

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

Буду стараться излогать тут личные изыскания в процессе изучения этого инструмента.


Для первоначального знакомства с JMeter есть масса статей в уже имеющихся блогах, авторы которых в большинстве случаев этими статьями и заканчивали. Вот пример одной из наиболее удачных стартовых статей, прочитав которую вы будете иметь общее представление о JMeter.

Так же есть документация jmeter apache, в которой есть, в принципе, все. Осталось только научиться этим пользоваться.)

Много полезных советов можно найти на форуме software-testing в разделе тестирование производительности.