Monday, March 21, 2011

Нагрузочное тестирование веб сервиса с помощью soapUI

Есть такая полезная штука soapUI. Пользуюсь ей давно, но, в основном, только для того чтобы быстро проверить отдельные методы веб сервисов. Сегодня понадобилось провести нагрузочное тестирование веб сервиса авторизации, который я недавно написал.
Задача как бы тривиальная, но, вот самое сложное в такого рода задачах - это выбрать инструмент. Итак приступаем. После получаса общения с поисковой системой у меня насобирался списочек различного рода утилит. И первую, которую я решил попробовать – это младший брат soapUI, под названием loadUI. В общем, я эту штуку скачал, установил, запустил, немного подождал, увидел пользовательский интерфейс и понял что это не то что мне нужно. Интерфейс, не ужасный, очень даже красивый, и, наверное, даже слишком для такой утилиты, просто я его не понял. Половина экрана занимает раздел с устаревшими новостями и всё как-то уж очень медленно работает. Закрыв его подальше, я решил посмотреть нет ли в soapUI того что мне нужно, т.к. где-то краем глаза видел что эти две утилиты интегрируются. И мне повезло - оказывается есть ! И уже давно есть, просто раньше я не обращал внимания на то что когда импортируешь WSDL чудесной галочкой можно скачать чтобы soapUI сгенерировал набор тестов:


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


Вот как выглядит то что получилось в дереве проекта:


Теперь, когда шаблоны тестов созданы, можно приступить к эмуляции логики клиента.


В моём случае всё достаточно просто: клиент через определённые интервалы времени обращается к методу ApproveSession для подтверждения сессии и в конце работы принудительно закрывает свою сессию с помощью TerminateSession. Всё просто, но есть два нюанса:
1. Необходима поддержка HTTP сессии с помощью Cookies
2. Каждый клиент должен присылать свой уникальный ключ на сервер, который в идеале ещё и должен бы быть закриптован

Итак, оказалось, что первый пункт легко разрешается с помощью ещё одной волшебной галочки, а именно:


Разобравшись с первым вопросом я приступил ко второму. После получаса рысканья по просторам интернета, нашёл очень полезную статью, которая реально сэкономила мне немного времени, и теперь я с радостью потрачу его на блог :)
Итак, применительно к моему случаю, SOAP запрос на подтверждение сессии выглядит приблизительно следующим образом:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:ApproveSession>
         <tem:token>?</tem:token>
      </tem:ApproveSession>
   </soapenv:Body>
</soapenv:Envelope>

Чтобы обеспечить уникальнсть ключа, я буду использовать индекс потока в котором запускается клиент, выглядит это так:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:ApproveSession>
         <tem:token>token${=context.getProperty("ThreadIndex")+1}</tem:token>
      </tem:ApproveSession>
   </soapenv:Body>
</soapenv:Envelope>

Теперь, когда запросы готовы, можно добавить несколько повторов (к сожалению, не знаю как можно организовать цикл в SoapUI, если кто подскажет – буду признателен), задержки между ними и запустить нагрузочный тест:


Итак, в результате запуска теста, получен полезный отчёт. Каждый шаг был выполнен 501 раз (колонка cnt) на протяжении интервала тестирования в одну минуту. Этот интервал я установил перед запуском теста. Кроме того, среднее время отклика сервера в пределах 250 мс (колонка avg), при этом максимальное время отклика порядка 1 сек, а минимальное - 100 мс. Очень неплохо при параллельной работе 500 нагрузочных клиентов. Суммарный объём трафика для всех клиентов менее 1 мб, при этом не было ни одного отказа. В целом результат меня удовлетворил. К сожалению, не получилось сэмулировать большее количество клиентов. При попытке запустить 1000 проходит всего 50 первых запросов а дальше в лог возвращаются ошибки соединения и на короткое время пропадает доступ к интернету. Скорее всего исчерпываются свободные ресурсы на ноутбуке где я проводил тест. На сервер нареканий нет - в логах сервера всё чисто, а счётчики производительности показывают что все запросы были успешно обслужены. Но это уже детали.

Главное, что soapUI всё-таки полезная штука, и в который раз она меня выручает :)

8 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. Здравствуйте, "хожу" по интернету в поисках решения своей задачи.
    Допустим у меня есть веб-сервис, который имеет внешние публичные методы. моя задача написать тесткейсы посылая входные данные, что веб-сервис ответит правильно согласно тех. док-ции, и заавтоматизировать написанные ТК.
    Веб-сервис будет крутиться локально. Для автоматизации ТК дали полную свободу в автоматизации, исп. любую тулзу и я не знаю с чего начать...т.к. раньше не автоматизировал, но программировал на C# Скажите исходя из моей задачи поможет ли мне soapUI?

    ReplyDelete
  3. SoapUI как раз создан для подобного рода задач. Более подробно о том как составлять тесты и запускать их автоматически можете прочитать в мануале
    http://www.soapui.org/Functional-Testing/functional-testing.html
    http://www.soapui.org/Test-Automation/functional-tests.html

    ReplyDelete
  4. Премного благодарен

    ReplyDelete
  5. Вверху ссылка на мой блог, немного схож с вашим, если будет интересно пообщаться по SoapUI пишите)

    ReplyDelete
  6. Извените если я не много буду не в тему, в общем в Соапе сделал проект на тестирование сервиса, в сумме около 50 автотестов по методам, каждый делал в отдельном TestSuite, но тут я столкнулся с проблеммой. Поддерживаем много версий платформы одновременно, и соответсвенно кучу стендов со своими БД и адресами, можно ли мне указать в проекте что бы везде использовался один и тот же адрес(указать только в проекте, а не в каждом вызопе менять адрес сервиса) и так же БД подключения формировать? кто нибудь сталкивался с таким?

    ReplyDelete
  7. Я Артур Борис, житель / гражданин Российской Республики. Мне 52 года, предприниматель / предприниматель. Однажды у меня были трудности с финансированием моего проекта / бизнеса, если бы не мой хороший друг, который представил меня мистеру Бенджамину Ли, чтобы получить кредит на сумму 250 000 долларов США от его компании. Когда я связался с ними, потребовалось всего пять рабочих дней, чтобы завершить процесс кредитования и перевести его на мой счет. Даже с плохой кредитной историей, они все еще предлагают свои услуги вам. Они также предлагают все виды кредитов, такие как бизнес-кредиты, ипотечные кредиты, личные кредиты, автокредиты. Я не знаю, как поблагодарить их за то, что они сделали для меня, но Бог вознаградит их в соответствии с его богатством во славе. Если вам нужна срочная финансовая помощь, свяжитесь с ними сегодня по электронной почте lfdsloans@outlook.com WhatsApp information ... +1-989-394-3740

    ReplyDelete