четверг, 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 в разделе тестирование производительности.