понедельник, 19 апреля 2010 г.

Jmeter: генерируем тестовые данные в тест плане

Сложно представить нагрузочный тест без тестовых данных. Наверное, самый распространенный пример тестовых данных это комбинации "login name/password" в нагрузочном тесте.

В Jmeter к созданию->использованию тестовых данных можно подойти с двух сторон a) создавать данные непосредственно в самом скрипте(тест плане) б) создавать данные вне скрипта - внешнее хранилище данных(обычно csv файл) и потом использовать данные из него. Окончательное решение о том, какой подход целесообразнее использовать зависит от тестового сценария, а также от того каким образом вы будете создавать данные. Однако, как показывает практика 90% тестовых данных можно сгенерировать в скрипте Jmeter.

Пример 1 - генерация уникальных комбинаций login name/password:

Типичный нагрузочный тест начинается с авторизации виртуальных пользователей в системе. Допустим, мне нужно парамметризировать login name/password для 100 виртуальных пользователей. Я могу создать комбинации login/password в csv файле и потом вытягивать их оттуда, а могу сгенерировать нужные пары значений в самом тест плане. Для этого я создам в тестируемом приложении пользователей и их пароли следуя определенному шаблону: vuser1/password1, vuser2/password2.... vuser100/password100. И логин и пароль имеют одинаковый корень у всех пользователей, а изменяется только цифровое окончание, которое я буду называть ID. В скрипте Jmeter я добавлю конфигурационный элемент Counter, который я буду использовать для генерации ID для виртуальных пользователей:


Для каждого нового потока Counter(ID) будет увеличиваться на величину шага, тоесть на единицу. Для первого потока ID=1, для второго 2 и.т.д в свою очередь эти же значения будут подставляться в месте логина и я получу в итоге вход в систему 100 уникальных пользователей:


Пример 2 - поиск данных по случайному ключу(слову, символу, цифре и.т.д):

Как поступать если в тестовом сценарии нужно выполнять поиск по разным ключевым словам? а если поисковых комбинаций несколько, а, возможно, десятки или сотни?. В этом случае создание тестовых данных в скрипте Jmeter выглядит неплохой альтернативой. Допустим у меня есть группа потоков(thread group) в которой я покрываю сценарии поиска данных по ключевым словам. Для простоты пусть ключевых слов будет только 5 и это имена компаний, например: HP, SONY, IBM, DELL, Google. Ключевые слова для всех поисковых запросов в скрипте должны определяться случайным(random) образом из 5 заданных. Реализация параметризации "серчей" может быть реализована используя следующий подход: a) создаем массив из ключевых слов б)передаем этот массив "в скрипт"(поток) в) по случайному принципу выбираем ключевое слово из этого массива и делаем подстановку в нужном месте. Все три шага я выполню используя BeanShell_PreProcessor.

Реализация пунктов a) и б):
Добавляем в thread group Simple controller именуем его как "Test data initialization". В него "чайлдами" добавляем BeanShell_PreProcessor и Test Action:



BeanShell_PreProcessor нельзя использовать, как отдельный компонент поэтому я его использую в связке с Test Action. Как видно из рисунка в BeanShell_PreProcessor проиходит инициализация массива из ключевых слов и передача его в поток в виде обьекта. После того как объект(массив)передан в поток я фактически могу использовать его в любом месте потока. Я могу "взять" этот объект перед каждым поисковым запросом, выбрать случайное значение и подставить его в запрос, опять же используя BeanShell_PreProcessor. Выглядит этот процесс как показано на рисунке(реализация пункта в):



В итоге получаю случайное имя компании для каждого поискового запроса в тех местах где мне это нужно.

Подведем итоги. Очевидными плюсами данного подхода есть его гибкость, отсутствие внешнего хранилища данных, несложная отладка скрипта. Основным же недостатком - использование дополнительных ресурсов генератора нагрузки: оперативной памяти(инициализация массива во всех потоках) и процессорного времени. В целом этот подход нужно использовать осторожно учитывая его недостатки.

1 комментарий: