Подробное руководство по разработке и реализации нагрузочного теста

Как вы можете быть уверены, что ваши API готовы к работе? Несмотря на то, что у нас реализованы уровни тестирования, такие как модульные тесты, интеграционные тесты и сквозные тесты для контроля качества, прохождение всех функциональных тестов не означает, что ваша система подходит для запуска в производство. Рост числа одновременных пользователей или большая нагрузка на определенные функции, возможно, парализует всю вашу систему, если дизайн вашей системы не учитывает такое использование в реальной среде.

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

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

В этой статье я расскажу, как реализовать нагрузочные тесты для API с помощью Gatling. Чтобы продемонстрировать идеи, я рассмотрю пример реализации нагрузочного теста для API-интерфейсов обмена валют.

Краткий обзор нагрузочного теста Гатлинга

Gatling - программный фреймворк для создания моделирования нагрузочного теста. Он основан на языке программирования Scala. Не беспокойтесь, вам не нужно много знать о Scala, потому что Gatling предоставляет набор предметно-ориентированных языков (DSL), так что вы можете легко определять сценарии тестирования и настраивать моделирование тестирования.

Давайте посмотрим на простой пример, который представляет собой модифицированную версию Учебника Гатлинга. Это компьютерная система инвентаризации, в которой пользователи могут искать и отправлять новые записи. Большинство пользователей сначала ищут записи, затем отправляют заявку на создание новой записи, а затем снова выполняют поиск. Между каждым действием есть пауза, чтобы имитировать реальное поведение пользователя. Мы определяем такую ​​схему использования как сценарий в Gatling. Профиль громкости предназначен для увеличения 5 пользователей за 10 секунд.

Gatling генерирует отчет в формате HTML с различными диаграммами и статистикой по завершении каждого тестового прогона. Вот несколько примеров диаграмм для вашего быстрого ознакомления.

Исходя из вышеупомянутого сценария, программный код нагрузочного теста прост и содержит 66 строк кода. Я объясню некоторые подробности в следующем разделе.

Установить Gatling

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

  • Java JDK версии 8 или 11
  • Scala 2.12
  • Maven
  • IntelliJ Idea IDE с подключаемым модулем Scala

Gatling поддерживает настройку с помощью автономной установки, Maven, SBT и Gradle. В этой статье я продемонстрирую использование плагина Maven.

Примеры использования и API

Мы стремимся создать нагрузочный тест для API торговли иностранной валютой, который поддерживает извлечение курса обмена валюты и отправку данных о торговле иностранной валютой. Чтобы подать заявку на торговую сделку, клиенты должны сначала зарегистрировать обменный курс, прежде чем отправлять транзакцию.

На этой диаграмме показан список вариантов использования и соответствующих конечных точек API.

Чтобы запустить приложение Forex API в локальной среде, удобнее всего запустить его как контейнер докеров. Выполните эту команду, чтобы загрузить опубликованный образ докера и запустить приложение.

docker run --rm -p 8080:8080 whalebig27/reactive-spring-forex-trade

Приложение по умолчанию запускается на основе фиктивных данных курсов валют для облегчения локального тестирования. Если вам интересно узнать больше о реализации API, вы можете обратиться к этой статье и этому репозиторию Github.

Выполнение нагрузочного теста

После того, как API будет запущен и запущен, следующим шагом будет получение примера реализации нагрузочного теста из этого репозитория GitHub, а затем запуск нагрузочного теста с помощью этой команды.

mvn gatling:test

По завершении прогона нагрузочного теста вы найдете сгенерированный отчет в папке target / gatling. Отчет показывает, что все запросы были обработаны успешно. Большинство запросов было выполнено в течение 800 мс, в то время как время ответа значительно увеличилось в середине прогона теста.

Обзор нагрузочного теста

Перед написанием сценариев нагрузочного тестирования давайте посмотрим на общий дизайн нагрузочного теста.

Пути пользователей

Обычно большинство клиентов просматривают только последние курсы обмена, не торгуя валютами. Кроме того, некоторые клиенты могут передумать и решить не размещать сделку после резервирования обменного курса. Таким образом, мы делим использование на 3 пользовательских пути:

  1. Просматривайте только курсы обмена
  2. Просмотрите курсы обмена и зарезервируйте курс, не отправляя сделку
  3. Получить курсы обмена, забронировать курс и оформить сделку (Полный поток)

Сценарий

Мы начнем с небольшого нагрузочного теста с 10 пользователями в секунду, и весь тест длится 1 минуту. Дизайн внедряет трафик запросов таким образом, что большинство клиентов используют API только для получения ставок форекс (60%), в то время как определенное соотношение из них бронирует ставку (25%), а некоторые другие завершают весь поток отправки транзакции (15%).

Действия пользователя - Получить курсы валют

Реализация начинается с основных строительных блоков, которые представляют собой построение HTTP-запросов API. Общий процесс состоит в том, чтобы получить образец данных запроса из CSV, инициировать HTTP-запрос и затем проверить ответ.

Это конечная точка API для получения курса форекс валютной пары:

GET http://localhost:8080/rates/<baseCurrency>/<counterCurrency>

Например, этот пример запроса извлекает последний курс форекс валютной пары GBP / USD:

http://localhost:8080/rates/latest/GBP/USD

Затем вы получите ответ в формате данных JSON:

{
"timestamp": "2021-07-04T16:35:36.224193",
"baseCurrency": "GBP",
"counterCurrency": "USD",
"buyRate": 1.3787,
"sellRate": 1.3778,
"spread": 9.0E-4
}

Дизайн HTTP-запроса Gatling

На приведенной ниже блок-схеме показано, как Gatling запускает HTTP-запросы к API для получения обменного курса.

Чтобы смоделировать запросы для различных валютных пар, мы храним список валютных пар в файле CSV в качестве источника тестовых данных. Когда запускается действие пользователя, механизм подачи данных случайным образом выбирает одну запись из файла CSV и внедряет ее в сеанс. Затем HTTP-запросы будут созданы и отправлены на основе валютной пары, хранящейся в сеансе. Последним шагом в потоке процесса является проверка того, равен ли статус ответа 200, чтобы определить статус запроса (успешный или неудачный).

Вот пример CSV-файла валютных пар

baseCurrency,counterCurrency
AUD,CAD
AUD,NZD
CAD,CHF
CAD,JPY
CHF,JPY
EUR,CAD
EUR,CHF

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

Действия пользователя - Зарезервируйте обменный курс

Конечная точка API для резервирования обменного курса - это HTTP-запрос POST. Это пример запроса на покупку пары GBP / USD:

POST http://localhost:8080/rates/book
{
"baseCurrency": "GBP",
"counterCurrency": "USD",
"baseCurrencyAmount": 12000,
"tradeAction": "BUY",
"customerId": 1
}

API создает запись бронирования и возвращает запись со ставкой, ссылкой на бронирование и сроком действия в формате JSON:

{
"id": 1306,
"timestamp": "2021-07-04T16:54:50.853825",
"baseCurrency": "GBP",
"counterCurrency": "USD",
"rate": 1.4037,
"baseCurrencyAmount": 12000,
"tradeAction": "BUY",
"bookingRef": "c85c144e-fb88-4695-942e-be2270720dac",
"expiryTime": "2021-07-04T16:56:50.85361",
"customerId": 1
}

Дизайн HTTP-запроса Gatling

Подобно реализации извлечения курса форекс, мы помещаем данные запроса в файл CSV в качестве источника данных и источника для ввода данных в сеанс для построения HTTP-запроса. Кроме того, в конце процесса есть дополнительный шаг для сохранения цены и ссылки на бронирование в сеансе. 2 поля данных необходимы для отправки транзакции форекс в следующем действии пользователя.

Вот поля данных запроса на бронирование тарифа в файле CSV:

baseCurrency,counterCurrency,baseCurrencyAmount,tradeAction,customerId
AUD,CAD,5706,SELL,3
AUD,CHF,4621,SELL,1
EUR,JPY,2165,SELL,1
EUR,NZD,1382,SELL,1
GBP,CHF,2525,BUY,2

Чтобы создать запрос POST в формате JSON, Gatling получает файл шаблона ниже и заполняет его полями данных, извлеченными из сеанса методом ElFileBody ().

Шаблон тела запроса:

{
"baseCurrency": "${baseCurrency}",
"counterCurrency": "${counterCurrency}",
"baseCurrencyAmount": ${baseCurrencyAmount},
"tradeAction": "${tradeAction}",
"customerId": ${customerId}
}

В приведенном ниже исходном коде есть 2 вызова метода check () для извлечения «rate» и «bookingRef» из данных ответа и сохранения их в сеансе.

Действия пользователя - Отправить торговую сделку Forex

API публикации сделок Forex требует ввода с курсом и ссылкой на бронирование для проверки. Следовательно, клиентам необходимо перенести данные из бронирования тарифов.

Пример запроса на обмен валютной пары GBP / USD со ссылкой на курс и бронирование, взятый из ответа API бронирования ставок:

POST http://localhost:8080/deals
{
"baseCurrency": "GBP",
"counterCurrency": "USD",
"rate": 1.4037,
"baseCurrencyAmount": 12000,
"tradeAction": "BUY",
"rateBookingRef": "d2d2d2da-c905-40b1-965c-4a34c4fae73c",
"customerId": 1
}

После успешной публикации запроса транзакции API вернет запись сделки со ссылкой на сделку.

{
"id": 1242,
"dealRef": "cac9557d-6dfd-4f88-b169-12fd97862fa2",
"timestamp": "2021-07-04T17:38:32.359444",
"baseCurrency": "GBP",
"counterCurrency": "USD",
"rate": 1.4037,
"tradeAction": "BUY",
"baseCurrencyAmount": 12000,
"customerId": 1
}

Дизайн HTTP-запроса Gatling

На схеме ниже показано, что представление торговой сделки зависит от бронирования ставки. Он берет данные из сеанса, перенесенного запросом на бронирование тарифа.

Исходный код - это всего несколько строк кода:

Соберите вместе действия пользователя

Когда все действия пользователя готовы, пора собрать строительные блоки для формирования пользовательских путешествий.

На диаграмме ниже показано выполнение пользовательских путешествий. Обычно клиенты просматривают несколько обменных курсов, прежде чем принять решение о совершении сделки на валютном рынке. Следовательно, такое поведение пользователя можно смоделировать, повторяя выполнение извлечения курса валют несколько раз во всех поездках пользователя. Между каждым действием добавляется пауза около 1–3 секунд, чтобы сделать поток более похожим на запросы в реальной среде.

В исходном коде все действия пользователя сгруппированы в объекте ForexRequests для аккуратности и удобочитаемости. Каждое путешествие пользователя определяется как функция в объекте UserJourney.

Сценарий и профиль объема

Наконец, создайте объект сценария и используйте randomSwitch (), чтобы применить соотношение объема запроса к переходам пользователя, что означает, что каждому новому пользователю будет назначен путь пользователя для выполнения теста. согласно определенному соотношению. Настройте симуляцию с 10 новыми пользователями в секунду, и тест длится 1 минуту.

Последние мысли

Процесс проверки готовности системы к реальной модели использования и объема запросов жизненно важен для успешной доставки программного обеспечения. Гатлинг - мощный инструмент. Он гибок в создании настраиваемых пользовательских поездок и сценариев, что позволяет моделировать производственную среду, чтобы проверить производительность и дизайн системы до запуска в производство. Хотя нагрузочный тест Гатлинга написан на основе языка программирования Scala, вы можете легко получить необходимые знания для создания нового нагрузочного теста, не особо разбираясь в Scala. Благодаря удобному для разработчиков дизайну DSL программный код нагрузочного тестирования легко читается и понимается.