Как лучше всего организовать и структурировать проект Gatling для тестирования производительности?
При разработке фреймворка мы должны думать о ремонтопригодности и расширяемости, поэтому то, как мы организуем компоненты, очень важно.
В этом руководстве мы покажем, как создать среду тестирования производительности с нуля, используя Gatling и maven.
Предварительные условия:
Для этого урока вам необходимо установить следующее:
Сначала мы создаем базовый проект, запустив архетип maven Gatling:
mvn archetype:generate -DarchetypeGroupId=io.gatling.highcharts -DarchetypeArtifactId=gatling-highcharts-maven-archetype
Когда вы выполните указанную выше команду, начнется загрузка зависимостей.
При появлении запроса укажите значения для «groupId», «artifactId» и «version».
Моя установка выглядит следующим образом:
Когда вы откроете проект, вы заметите, что есть некоторые файлы и папки по умолчанию.
В рамках ресурсов у нас есть
тела этот пакет содержит полезные данные запроса. Например, у вас могут быть шаблоны запросов для различных запросов.
данные этот пакет содержит данные, которые вам нужно передать вашим тестам, например CSV.
В дополнение к двум указанным выше папкам есть файлы Gatling.conf, logback.xml и рекордер.conf. Мы не будем обсуждать это в этом руководстве.
Архетип Gatling maven также создает три базовых объекта Scala, но мы не будем их использовать, поэтому удалите объекты.
Кроме того, мы создадим четыре пакета, config , Запросы , сценарии , а также симуляции :
В пакете config создайте объект Scala с именем Config. Это будет содержать различные конфигурации для нашего проекта, такие как URL-адреса приложений, пользователей по умолчанию и т. Д.
package io.devqa.config object Config {
val app_url = 'http://example-app.com'
val users = Integer.getInteger('users', 10).toInt
val rampUp = Integer.getInteger('rampup', 1).toInt
val throughput = Integer.getInteger('throughput', 100).toInt }
Пакет запросов содержит различные запросы операций. Например, у нас может быть запрос, который получает токен авторизации. Другой запрос может использовать токен из предыдущего запроса для создания пользователя и так далее.
Это отдельные и изолированные запросы, отправленные на разные конечные точки.
GetTokenRequest
package io.devqa.requests import io.gatling.core.Predef._ import io.gatling.http.Predef._ import io.devqa.config.Config.app_url object GetTokenRequest {
val get_token = http('RequestName').get(app_url + '/token')
.check(status is 200)
.check(jsonPath('$..token').saveAs('token')) }
CreateUserRequest
package io.devqa.requests import io.devqa.config.Config.app_url import io.gatling.core.Predef._ import io.gatling.http.Predef._ object CreateUserRequest {
val sentHeaders = Map('Authorization' -> 'bearer ${token}')
val create_user = exec(http('Create User Request')
.post(app_url + '/users')
.headers(sentHeaders)
.formParam('name', 'John')
.formParam('password', 'John5P4ss')
.check(status is 201)
.check(regex('Created').exists)) }
Пакет сценариев содержит бизнес-сценарии. Например, чтобы создать пользователя, мы сначала должны получить токен аутентификации, а затем отправить токен в виде заголовка вместе с параметрами формы для создания пользователя. т.е. мы используем ответ первого запроса для подачи на второй запрос. Такая «цепочка запросов» довольно часто встречается при тестировании API.
CreateUserScenario
package io.devqa.scenarios import io.devqa.requests.{CreateUserRequest, GetTokenRequest} import io.gatling.core.Predef.scenario object CreateUserScenario {
val createUserScenario = scenario('Create User Scenario')
.exec(GetTokenRequest.get_token)
.exec(CreateUserRequest.create_user) }
Наконец, у нас есть моделирование в пакете моделирования. Вы можете думать о моделировании как о разных профилях нагрузки. Например, у нас может быть симуляция нормальной нагрузки или симуляция скачков.
Симуляции должны быть классами Scala и должны расширять класс Gatling Simulation.
package io.devqa.simulations import io.devqa.scenarios.CreateUserScenario import io.gatling.core.Predef.Simulation import io.gatling.core.Predef._ import io.devqa.config.Config._ class CreateUserSimulation extends Simulation {
private val createUserExec = CreateUserScenario.createUserScenario
.inject(atOnceUsers(users))
setUp(createUserExec) }
Ваш проект должен выглядеть следующим образом:
Нам также необходимо изменить наш файл pom.xml, чтобы иметь возможность передавать параметры, такие как пользователи и пропускная способность, нашим тестам производительности во время выполнения.
Файл pom.xml должен выглядеть так:
4.0.0
testing-excellence
gatling-framework
1.0-SNAPSHOT
1.8
1.8
UTF-8
2.3.0
2.2.4
1.3.2
CreateUserSimulation
io.gatling.highcharts
gatling-charts-highcharts
${gatling.version}
test
com.typesafe
config
${typesafe-config.version}
io.gatling
gatling-maven-plugin
${gatling-plugin.version}
io.devqa.simulations.${simulation}
-Denv=${env}
-Dusers=${users}
-Drampup=${rampup}
-Dduration=${duration}
-Dthroughput=${throughput}
true
Наконец, чтобы выполнить класс моделирования, мы запускаем следующую команду
mvn clean gatling:execute -Dusers=1
Приведенная выше команда запустит CreateUserSimulation с 1 пользователем.