Тестируй веб-сайты вместе с Badboy. Часть 2

Я продолжаю рассказ об badboy — инструменте, похожем на большой магнитофон. Badboy запишет ваши действия с веб-сайтом (переходы по страницам, нажатия кнопок). Затем записанную последовательность действий вы сможете "проиграть", чтобы проверить качество реализации сайта и то, как он работает "под нагрузкой".

В прошлый раз я полностью рассказал о том, как выполнить "запись", и том, как после завершения очередного шага сценария проверить корректность его выполнения — например, наличие определенного текста на странице или чему равен цвет некоторого пикселя на странице. Однако для настоящего тестирования всего этого мало. Предположим, мы тестируем форму регистрации на сайте: мы заполняем форму, отправляем ее, проверяем наличие на сформированной странице фразы вроде "Вы успешно зарегистрированы". Увы, но повторный запуск такого сценария должен завершиться неудачно. Даже если новых ошибок в коде сайта не появилось. Почему? Вот, к примеру, поле логин_пользователя — ведь оно должно быть уникальным, не так ли? А разве при повторном запуске сценария то значение, которое мы вводили в форму регистрации, само поменяется? Конечно, нет. Так что перед каждым запуском сценария вы должны либо очищать базу данных сайта, либо изменять значения переменных. Обычно эти два подхода совмещаются: и базу очищаем (для этого неплохо иметь какую-нибудь служебную страницу — например, truncate.php), но и значения полей придется менять. Особенно ярко это проявится при нагрузочном тестировании, когда на сайт будут посылаться одновременно несколько сотен запросов (ведь все они должны быть разными). В badboy изменять параметры запроса можно двумя способами: во-первых, в дереве сценария работает поиск и замена (в диалоговом окне обратите внимание на поле Mask). Дело в том, что простая замена во всем сценарии, например, слова "vasya" на "petya" не всегда хороша: нам нужен механизм более точного указания на то, в каких строках искать некоторое слово. И как раз в поле Mask вы в виде регулярного выражения (с урезанным синтаксисом) задаете шаблон строки. Однако поиск и замена слишком неудобны для частого использования, и поэтому в badboy ввели понятие переменных. Для примера выполните запись отправки html-формы, затем раскройте дерево сценария и вызовите контекстное меню на элементе (поле) формы (см. рис. 1), после чего выберите пункт Add as Variable или Add Linked Variable. В первом случае будет добавлена обычная переменная с именем, равным имени поля формы, значение же переменной вы введете в появившемся диалоговом окне. Визуально значение параметра формы должно измениться и выглядеть как показано на рис. 1, где значения параметров action и user равны, соответственно, "${action}" и "${user}" (для вставки в сценарий переменных нужно использовать именно такой синтаксис — со знаком доллара и фигурными скобками). Отличие команды Add linked variable от просто Add as variable в том, что автоматически будет выполнен поиск в сценарии других параметров для http-запроса, которые имеют такое же значение переменной, затем их значения также будут заменены на только что созданную переменную. И последний вид переменных — Hostname variable (ее вы можете найти в меню tools -> create hostname variable) — позволит вам хранить адрес сервера в виде отдельной переменной, а значит, легко менять адреса всех тестируемых страниц, если веб-приложение будет переезжать с одного сервера на другой. Все созданные вами переменные будут помещены на закладку variables, расположенную в нижней левой части окна badboy. Для редактирования переменных просто используйте двойной клик или контекстное меню на их именах. Теперь попробуйте так сделать и внимательно рассмотрите диалоговое окно свойств переменной. Для хорошего теста веб-приложения было бы неплохо создать список возможных значений некоторой переменной, чтобы не вводить их каждый раз заново при очередной прогонке теста, а выбирать из списка готовых. И badboy это умеет: используйте для этого список Value List (рядом расположенная кнопка Current устанавливает текущее значение переменной). Однако "самую силу" списки значений переменных приобретают только тогда, когда их используют совместно с еще одним механизмом модификации сценария — Increments. Но об этом чуть позже, а пока еще раз вызовите окно настроек переменной и внимательно посмотрите на поля Auto-update with expression.

Предположим такой сценарий тестирования: есть две веб-страницы, которые формируются некоторым скриптом. Для первой из них мы можем послать запрос, используя обычные переменные, а вот для второй — нет. Нам нужно отправить такую переменную, значение которой неизвестно на стадии составления скрипта тестирования — обычно это некоторый кусочек текста, находящийся на предыдущей странице. Например, найти на странице фрагмент текста следующего вида: result=какая-то цифра, извлечь значение этой цифры и послать его во втором запросе как переменную number. Так что, если в окне свойств переменной вы отметите галочку напротив Auto-update with expression, а затем в чуть ниже расположенное поле введете текст регулярного выражения, то это значение будет найдено и присвоено переменной — точнее сказать, переменной будет присвоено значение той части регулярного выражения, которая заключена в круглые скобки. Возвращаясь к старому примеру, регулярное выражение должно выглядеть так: result=(\d+). Недостаток подобного автоматического вычисления в слабом контроле над моментом времени, когда нужно вычислить значение этой переменной (например, это нужно сделать только после получения текста одной-единственной страницы и не делать для других страниц). Я предпочитаю использовать механизм Variable Setter. Если вызвать контекстное меню на дереве сценария, а затем выбрать пункт Add -> Variable Setter, появится диалоговое окно, похожее на встречавшееся вам ранее окно свойств переменной (с таким же полем для ввода регулярного выражения; кроме того, можно указать еще и фрейм, где искать переменную). Гибкость в том, что Variable Setter можно расположить в дереве сценария точно в нужном месте. А вот еще трюк при использовании Variable Setter: предположим, что в рамках одного теста вы загружаете множество страниц, и на какой-то из них должен встретиться фрагмент вида result=число (так же, как и в прошлый раз, я хочу). Во-первых, глупо вставлять такой Variable Setter после каждого из множества запросов (тут вам поможет в свойствах Variable Setter опция cascade to following items). Также я хочу, чтобы значение переменной было присвоено только в том случае, если на странице был найден фрагмент result=число (если вы не отметите опцию Do not overwrite with blank, значение переменной будет утеряно).

А вот еще один пример создания сценария, работающего с переменными, но уже не простыми (распложенными внутри badboy), а хранящимися во внешнем файле — например, excel. Для примера создайте excel-документ с небольшой табличкой из двух-трех колонок, имитирующих некоторые переменные (названия колонок обязательно должны быть). Теперь вернемся в badboy и вызовем меню Tools -> DataSource -> Attach Variable Source. В появившемся диалоговом окне нас спросят тип источника данных (файлы excel, access, dbbase…). Мы, конечно, выберем excel как тип источника данных, затем укажем путь к файлу и лист, на котором находится табличка с информацией. Последний шаг — привязка переменных в excel-файле к параметрам для веб- запроса, после чего для каждой переменной будет создан и заполнен значениями из excel список Value List (при изменении данных в excel badboy автоматически обновляет список значений переменных). Добиться той же функциональности (мне этот способ кажется более логичным и очевидным) можно с помощью инструмента Data Source Item (его вы можете найти на закладке Tools). После того, как перетянете Data Source Item на дерево сценария, вы должны будете (точь-в-точь как в прошлом способе привязки к переменным значений из внешнего файла) указать тип источника данных, имя файла, название листа, имена переменных, которые импортируются из excel-документа. Последний вид переменных — глобальные переменные (в отличие от предыдущих, эти переменные не отображаются на закладке Variables). Они будут передаваться во все скрипты, и их не нужно явно указывать в дереве сценария (см. меню Preferences закладка Variables). Фокус в том, что глобальные переменные не являются частью вашего скрипта тестирования, а являются настройками самого badboy, поэтому будьте осторожны, ведь, изменив одну из таких переменных, вы можете поломать рабочий до этого момента скрипт.

Несмотря на то, что мы рассмотрели несколько способов создания переменных не с одним значением, а с множеством (списком), практической пользы от них нет до тех пор, пока мы не научимся выполнять сценарий тестирования несколько раз, обновляя при этом значение указателя на текущий элемент списка. Для этого используйте контекстное меню на дереве сценария пункт Add -> Increment. В появившемся диалоговом окне необходимо указать, значение какой переменной должно быть увеличено (либо все переменные, либо только одна, выбранная из падающего списка variables to increment). Затем указывается стратегия увеличения: Random Integer, Next List Value, Sequential Integer. В первом случае значение переменной будет равно случайному числу, в третьем — переменная будет принимать последовательные значения 1,2,3… Надо сказать, что в этих двух случаях переменная не обязательно должна быть целым числом — она может быть и строкой. Самое главное — чтобы эта строка заканчивалась на некоторую цифру — например, user1 (тогда в режиме Sequential Integer переменная будет принимать значения user2, user3…). И второй вариант — Next List Value — наиболее интересен для нас: он позволяет перебирать переменной список привязанных к ней значений. Для примера я создал Test и поместил в него Data Source Item, загружающий переменные из excel. Затем внутрь Test был помещен Step, отправляющий веб-запрос с двумя переменными (fio, age), как показано на рис. 2 (я специально отказался от Increment'а). Осталось только найти способ выполнять эту последовательность шагов несколько раз. Для этого вызываем контекстное меню на элементе Step, после чего открываем диалоговое окно его свойств и видим, что в графе Repeat мы можем указать, сколько раз должен выполниться шаг. Это либо фиксированное количество раз, либо столько раз, сколько значений в списке для некоторой переменной (выбираем эту переменную в падающем списке, и еще обязательно отметьте галочки Increment variable automatically и Increment all variables from same data source). Эти галочки нужны для того, чтобы в цикле происходило увеличение выбранной переменной, а также всех остальных переменных, загруженных из одного и того же источника данных (файла excel). Как только мы научились делать циклы для тестов, неплохо было бы создать Assertion, умеющий работать и с циклами, и с переменными (например, excel-файл содержит три колонки цифр — мы посылаем две первые из них на сайт, а результирующая страница должна содержать значение из третьй колонки). Вспоминайте прошлую статью: нельзя просто делать какие-то шаги в сценарии — нужно контролировать, успешно ли они выполнились (именно этим занимается Assertion). Простого "за один клик" решения я не нашел, так что пришлось делать так: создать в сценарии после отправки запроса на сервер, во-первых, элемент Variable Setter. Он должен присвоить значение переменной if_ok по следующей формуле: result=(${thirdcolumn}). Здесь предполагается, что excel-файл содержит третью колонку с именем thirdcolumn, и именно ее значение должно быть помещено на веб-страницу в виде строки result=значение. Для того, чтобы в строке regexp'а я мог использовать badboy-переменные (синтаксис с "$" и фигурными скобками), нужно в свойствах элемента Variable Setter установить значение флажка Parse variable references in expression. Если на странице действительно найдется правильное значение третьей колонки, то переменная if_ok будет не пустой. Поэтому сразу за Variable Setter (последнее действие внутри Step'а) я добавляю Assertion. А в качестве проверяемого условия использую Variable Check (закладка Checks). В свойствах check'а в падающем списке выбирается значение переменной, значение которой нужно проверить (это переменная if_ok), а в поле regexp вводится регулярное выражение, которому должна быть равна эта переменная (я указал ".+", что значит "не пустая строка"). Из чего еще можно составлять сценарий? Снова обратимся к закладке Tools.

1. Cookie Killer (не правда ли, говорящее название?). Итак, Cookie Killer удаляет все cookie, полученные в текущем сеансе. Это очень полезный механизм для тестирования системы авторизации: общепринято, что после успешной авторизации в cookie помещается некий флажок с признаком того, что человек прошел проверку, на основании этого же флажка на сервере ведется сессия. Завершение работы с сайтом может быть выполнено либо с помощью специальной ссылки вида Logout, либо автоматически: авторизация должна быть потеряна спустя некоторое время (например, 15 минут). Естественно, никто не будет создавать такой сценарий теста, в котором целенаправленно создается пауза между несколькими Step'ами в те самые 15 минут (хотя подобная возможность в badboy предусмотрена). Поэтому мы можем имитировать истечение 15 минут (срока давности для cookie) с помощью Cookie Killer.

2. Navigation. В прошлой статье я уже упомянул о том, что badboy может работать в двух режимах записи сценария: имитация отправляемых из браузера запросов и имитация действия с интерфейсом веб-страницы (клики мышью). Элемент navigation как раз и служит для указания на то, какое действие нужно выполнить, и с каким html-элементом (все это можно изменить в настройках элемента Navigation).

3. Save Item или же Send Email. Механизм, позволяющий сохранить некоторую величину в файл (можно либо затирать старое содержимое, либо добавлять информацию в конец файла). Еще информацию можно отправить по почте. Что касается самой информации, то это может быть произвольный кусочек текста Expression (в тексте можно использовать badboy-переменные) или содержимое текущего окна браузера. Может быть полезен и прием с добавлением Save Item в самый конец сценария тестирования, с тем чтобы послать по почте сформированный html-отчет о результатах тестирования (например, при запуске тестов по расписанию — badboy и такое умеет).

4. Mouse Click — этот элемент сценария служит для имитации событий мыши (например, нажатия правой или левой кнопки мыши в заданных координатах). Похож на Mouse Click и такой элемент, как Keys Item — он служит для имитации событий с клавиатурой. Вы можете не просто ввести несколько букв, но и сымитировать более сложное действие — например, нажатие комбинации Alt+F4. Для этого вы вводите в текстовом поле следующую "абракадабру": "{VK_MENU:DOWN}{VK_F4}{VK_MENU:UP}". В документации badboy приводится описание кодов и других специальных клавиш (функциональные, клавиши управления курсором) — все они заключаются в фигурные скобки.

5. Window Control. Служит для закрытия либо активного окна браузера, либо всех всплывающих окон.

6. Screenshot. Позволяет сделать копию экрана и сохранить ее в отдельный файл (к сожалению, нет способа управлять правилами именования файлов так, чтобы называть их "pic1.jpg", "pic2.jpg"…). Если вы будете пользоваться не бесплатной версией badboy, а приобретете лицензию, то, кроме скриншота, можно сохранить картинку, содержащую график времени загрузки страниц сайта (еще этот график можно увидеть на закладке Graph). 7. MessageBox. Важно, что MessageBox не служит для того, чтобы показывать всплывающие окна сообщений — совсем наоборот. Если вы разрабатываете сайт с большим количеством javascript, то, вероятнее всего, ваш код не только вычисляет что-то, но и может потребовать у пользователя ответы на вопросы в форме всплывающего диалогового окна с кнопками OK и Cancel. Более того, javascript может попросить у пользователя ввести некоторое текстовое значение (функция prompt). Как раз для имитации нажатия на одну из кнопок OK и Cancel служит элемент MessageBox. Нужно только поместить MessageBox до (именно до) элемента веб-запроса. В свойствах элемента MessageBox нужно указать время ожидания в секундах до автоматического нажатия на одну из кнопок (какая из двух кнопок также указывается в свойствах), и, самое важное, нужно указать шаблон текста окна с сообщением, на которое будет реагировать данный MessageBox. Если на html-странице появляется несколько диалоговых окон, то просто разместите такое же количество MessageBox (момент в том, что время закрытия окна рассчитывается по порядку, а не одновременно для всех MessageBox). Для имитации работы с prompt простого решения нет — к счастью, в серьезных приложениях прием с prompt считается нерекомендуемым. В следующий раз я завершу рассказ о badboy. Нам осталось рассмотреть методику запуска нескольких тестов одновременно — как будто сайт посещают одновременно несколько человек. Я также расскажу о JMeter — мы попробуем написать небольшой сценарий тестирования веб-сайта с его помощью или как вариант создать сценарий в badboy с последующим его переносом в jmeter.

black-zorro@tut.by, black-zorro.com


Компьютерная газета. Статья была опубликована в номере 16 за 2008 год в рубрике soft

©1997-2024 Компьютерная газета