Найти тему
17 подписчиков

Проведение нагрузочного тестирования с помощью Gatling


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

Ключевые концепции:

1. DSL (Domain-Specific Language)

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

2. httpProtocol

httpProtocol — конфигурация HTTP-протокола, которая определяет параметры, такие как базовый URL, заголовки, время ожидания и параметры SSL. Эти настройки помогают моделировать реальное поведение пользователей и их взаимодействие с системой.

val httpProtocol = http
.baseUrl("https://google.com")
.inferHtmlResources()
.acceptHeader("application/json")
.userAgentHeader("MaliciousBot/1.0")
.header("X-Real-IP", "10.0.0.1")
.disableFollowRedirect
.check(status.is(200))

В данном примере настроил httpProtocol для имитации запросов с поддельными заголовками.

3. Simulation

Основной класс в Gatling, который объединяет сценарии, протоколы и профили нагрузки.

class MaliciousSimulation extends Simulation {
setUp(
scn.inject(rampUsers(1000) during (300 seconds)).protocols(httpProtocol)
).assertions(
global.failedRequests.percent.lte(5) // Атакующий хочет, чтобы как можно больше запросов прошло успешно
)
}

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

4. exec

Метод, который используется для выполнения действий в рамках сценария. Может запускать HTTP-запросы, вызывать другие сценарии или функции.

scn.exec(http("SQL Injection")
.post("/login")
.formParam("username", "admin")
.formParam("password", "' OR '1'='1"))
.check(status.is(200)))
.exec(http("Brute Force Login")
.post("/login")
.formParam("username", "user")
.formParam("password", "pass123"))
Метод exec можно использовать для моделирования атак методом грубой силы.

5. inject

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

setUp(
scn.inject(
rampUsers(1000) during (10 minutes), // Постепенное увеличение нагрузки
constantUsersPerSec(2000) during (60 seconds) // Резкая атака DoS
).protocols(httpProtocol)
)

6. check

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

.check(status.is(200))
.check(regex("(?i)password").exists) // Проверка на утечку пароля в ответе сервера

7. pause

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

scn.pause(5)

полезно для тестирования систем обнаружения вторжений и других защитных механизмов.

8. Feeder

Может использоваться для автоматизации атак с использованием различных данных, таких как списки утекших учетных данных или потенциально уязвимых параметров.

val csvFeeder = csv("data/credentials.csv").circular
scn.feed(csvFeeder)
.exec(http("Login Attempt")
.post("/login")
.formParam("username", "${username}")
.formParam("password", "${password}"))
.check(status.is(200))

9. Looping

Механизм повторения определенных действий в сценарии.

.repeat(1000) {
exec(http("Brute Force Attempt")
.post("/login")
.formParam("username", "admin")
.formParam("password", "admin${randomInt(1000)}")) // Перебор паролей
}

10. Assertions

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

assertions(
global.responseTime.max.lt(500), // Максимальное время отклика не должно превышать 500 мс
forAll.failedRequests.percent.is(0) // Процент неудачных запросов должен быть 0
)

#load_testing
Проведение нагрузочного тестирования с помощью Gatling  Gatling — мощный и гибкий инструмент для проведения нагрузочного тестирования, который позволяет оценить устойчивость системы к различным атакам
3 минуты