В одной из записей (Установка и настройка Apache.JMeter) рассказывал про ручную установку и настройку Apache.JMeter. Сейчас расскажу про автоматизацию этого процесса.
В результате — все параметры настройки JMeter будут храниться в системе контроля версий. Тесты будут легко воспроизводимы, а процесс приблизится к тому, чтобы встроить нагрузку в CI/CD-конвейер.
mvn verify или mvn jmeter:test
И магия — скачался jmeter, плагины, запустился тест, сформировался отчёт.
Результат настройки в репозитории:
Основа статьи
- https://jmeter.apache.org/
- https://maven.apache.org/
- https://github.com/jmeter-maven-plugin
- https://www.blazemeter.com/blog/how-use-jmeter-maven-plugin
- https://github.com/undera/jmeter-plugins
- https://jmeter-plugins.org/
Статья опирается на труды других людей, но имеет свою оригинальность.
Создание пустого maven проекта
Проект можно создать вручную, а можно использовать maven archetype.
Ручное создание проекта
Создать каталог, назвав его «jmeter-loadtestweb». Внутри каталога создать структуру каталогов пустого java-проекта:
jmeter-loadtestweb
src
main
java
test
java
jmeter
pom.xml
И разместить в каталоге файл pom.xml следующего содержимого:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.loadtestweb</groupId> <artifactId>jmeter-loadtestweb</artifactId> <packaging>jar</packaging> <version>0.1.0</version> <name>jmeter-loadtestweb</name> <description>Apache.JMeter test for loadtestweb</description> <!-- Properties --> <properties> <!-- Test name --> <performancetest.script>jmeter-loadtestweb</performancetest.script> </properties> <!-- Build Settings --> <build> <plugins> <plugin> <groupId>com.lazerycode.jmeter</groupId> <artifactId>jmeter-maven-plugin</artifactId> <version>2.8.1</version> <executions> <!-- Run JMeter tests --> <execution> <id>jmeter-tests</id> <goals> <goal>jmeter</goal> </goals> </execution> <!-- Fail build on errors in test --> <execution> <id>jmeter-check-results</id> <goals> <goal>results</goal> </goals> </execution> </executions> <configuration> <testFilesIncluded> <jMeterTestFile>${performancetest.script}</jMeterTestFile> </testFilesIncluded> <jmeterVersion>5.0</jmeterVersion> <!-- Configuring the jvm that the jmeter process runs in https://github.com/jmeter-maven-plugin/jmeter-maven-plugin/wiki/Configuring-the-jvm-that-the-jmeter-process-runs-in http://reins.altervista.org/java/A_Collection_of_JVM_Options_MP.html https://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html --> <jMeterProcessJVMSettings> <xms>1024</xms> <xmx>2048</xmx> <arguments> <argument>-XX:MaxMetaspaceSize=256m</argument> <argument>-XX:+UseG1GC</argument> <argument>-XX:MaxGCPauseMillis=100</argument> <argument>-XX:G1ReservePercent=20</argument> <argument>-Duser.language=en</argument> <argument>-Duser.region=EN</argument> <argument>-Dfile.encoding=UTF-8</argument> <argument>-XX:-HeapDumpOnOutOfMemoryError</argument> <argument>-server</argument> </arguments> </jMeterProcessJVMSettings> <testResultsTimestamp>false</testResultsTimestamp> <overrideRootLogLevel>DEBUG</overrideRootLogLevel> <suppressJMeterOutput>false</suppressJMeterOutput> <ignoreResultFailures>true</ignoreResultFailures> <guiTestFile>${project.basedir}/src/test/jmeter/${performancetest.script}</guiTestFile> <propertiesJMeter> <jmeter.save.saveservice.thread_counts>true</jmeter.save.saveservice.thread_counts> <jmeter.save.saveservice.subresults>true</jmeter.save.saveservice.subresults> <sample_variables></sample_variables> <!-- # Disable sent statistics to https://jmeter-plugins.org/stats/ --> <jpgc.repo.sendstats>false</jpgc.repo.sendstats> </propertiesJMeter> </configuration> </plugin> </plugins> </build> </project>
Каталог /src/test/jmeter используется для хранения jmx-файлов (скриптов jmeter), property-файлов (файлов настройки), дополнительных скриптов, например, groovy-скриптов.
Назначение каталогов
Назначение каталогов для jmeter-проекта может быть следующим:
jmeter-loadtestweb
src
main
java — утилиты, классы JMeter Function, классы для Java Request (пример JavaTest и SleepTest) — программный код, с помощью которого можно создавать нагрузку
test
java — jUnit-тесты для jUnit Request
jmeter — каталог, который будет использоваться плагином jmeter-maven-plugin, в нем можно создавать ещё подкаталоги
Назначение тегов в pom.xml
Некоторые интересные теги в pom.xml выделил. На эти значения стоит обратить внимание или заменить на свои.
Информация о проекте
Обязательными атрибутами являются groupId и artifactId.
<groupId>com.loadtestweb</groupId>
<artifactId>jmeter-loadtestweb</artifactId>
Также нужно указать номер версии, название и описание теста.
<version>0.1.0</version> <name>jmeter-loadtestweb</name> <description>Apache.JMeter test for loadtestweb</description>
Выше указаны примеры значений. Их можно заменить на свои.
Настройки
Для удобства правки часто изменяющиеся параметры рекомендуется выносить в секцию properties. Так в эту секцию вынесено имя файла с тестом.
Сюда же можно вынести номер версии Apache.JMeter, версии плагинов — те параметры, которые с высокой вероятностью будут меняться в дальнейшем.
Позже в раздел properties мы добавим параметры профиля нагрузки — количество виртуальных пользователей, интенсивность выполнения.
<!-- Properties --> <properties> <!-- Test name --> <performancetest.script>jmeter-loadtestweb.jmx</performancetest.script> </properties>
Например, пусть наш jmx-файл будет называться jmeter-loadtestweb.jmx
... <jMeterTestFile>${performancetest.script}</jMeterTestFile> ... <guiTestFile>${project.basedir}/src/test/jmeter/${performancetest.script}</guiTestFile> ...
Это свойство можно использовать, чтобы указать путь к jmx-файлу для запуска теста в консольном и графическом режимах. Без дублирования информации.
Кроме того, любые параметры проекта, даже не переопределённые в pom.xml, можно использовать при формировании новых значений.
Открытие проекта в IntelliJ IDEA

Изначально проект пустой. В нём ничего нет.
Для того, чтобы работать с jmeter-maven-plugin 2.8.1 (актуальная версия на 16 ноября 2018 года) нужно иметь maven 3.5 или новее.
Выбрать версию maven можно в настройках IntelliJ IDEA
Открыть главном меню пункт File / Settings…
В открывшемся окне «Settings» перейти к разделу:
- Build, Execution, Deployment
- Build Tools
- Maven
- Maven home directory
- Maven
- Build Tools

Убедиться, что версия maven не ниже, чем 3.5. На снимке выше версия 3.5.2.
Роль IntelliJ IDEA
Из среды разработки удобно:
- редактировать pom.xml
- вызывать любые плагины maven
- работать с системой контроля версий
А если в будущем будут использоваться
то среда разработки будет просто необходима.
Создание пустого скрипта Apache.JMeter
Выполнить jmeter:gui используя IntelliJ Idea или вызвав в консоли:
mvn jmeter:gui

Запустится Apache.JMeter в графическом режиме и скажет, что файла jmeter-loadtestweb.jmx не существует.
Самое время создать этот файл и сохранить его в каталоге /src/test/jmeter/ под именем
jmeter-loadtestweb.jmx, используя Apache.JMeter: File / Save

Теперь в проекте есть пустой jmx-скрипт.
Создание проекта в системе контроля версий
Уже привык к использованию github.com и bitbucket.com. Но многие товарищи перешли на gitlab.com, в частности, после продажи github.
В данном примере будем использовать github.com, чтобы делиться проектом с другими.

Создаём новый проект. Вот он:
- https://github.com/polarnik/jmeter-loadtestweb
- https://github.com/polarnik/jmeter-loadtestweb.git
- git@github.com:polarnik/jmeter-loadtestweb.git
Связывание репозитория и проекта в графическом режиме
В IntelliJ IDEA инициализируем git-репозиторий:
VCS / Enable Version Control Integration…
Добавить связь с внешним репозиторием:
VCS / Git / Remotes…
Для аутентификации по логину и паролю нужно указать https- сылку, а для аутентификации по ключу — git-ссылку на репозиторий.
Загрузить содержимое внешнего репозитория в локальный, используя IntelliJ Idea (VSC / Git) или консольные команды:
git fetch git pull
Теперь в проекте появятся файлы из внешнего репозитория — README.md и LICENCE.

Добавим в pom.xml информацию:
- о лицензии
- об интеграции с системой контроля версии
- описание автора
<licenses> <license> <name>The Apache Software License, Version 2.0</name> <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> <distribution>repo</distribution> </license> </licenses> <scm> <url>https://github.com/polarnik/jmeter-loadtestweb</url> <connection>https://github.com/polarnik/jmeter-loadtestweb.git</connection> <developerConnection>git@github.com:polarnik/jmeter-loadtestweb.git</developerConnection> </scm> <developers> <developer> <id>polarnik</id> <name>SMIRNOV Vyacheslav</name> <email>owasp@yandex.ru</email> <url>https://github.com/polarnik</url> <organization>Raiffeisen</organization> <organizationUrl>https://www.raiffeisen.ru/</organizationUrl> <roles> <role>Expert tester</role> </roles> </developer> </developers>

Теперь можно сохранить текущие изменения в git и отправить их во внешний репозиторий.
Предполагается, что первоначальная настройка git уже была выполнена.
Настроены имя пользователя и адрес электронной почты.
- https://git-scm.com/book/ru/v2/Введение-Первоначальная-настройка-Git
- https://help.github.com/articles/setting-your-username-in-git/
- https://help.github.com/articles/setting-your-commit-email-address-in-git/
Удобно если имя и адрес электронной почты совпадают для всех проектов. Тогда можно действовать, как указано в инструкциях выше.
Текущие настройки можно посмотреть, выполнив команды
git config user.name git config user.email

Если же для github.com, конкретно, используется специфичное имя и адрес электронной почты, то нужно указать специфичные настройки для текущего проекта.
Будет как в инструкциях выше, но без ключа —global.
git config user.name "polarnik"
git config user.email owasp@yandex.ru
Теперь можно загитовать все изменения. И отправить их во внешнее хранилище.

Настройка плагинов
Допустим нам недостаточно базовых возможностей Apache.JMeter и решено использовать плагины.
Например плагин Ultimate Thread Group:
А конкретно версии 2.6.
В карточке Custom Thread Group сказано, что скачать плагины из этой группы можно используя артифакт
Maven Artifact: kg.apc:jmeter-plugins-casutg:2.6
Кроме того, скачав архив
можно увидеть следующую структуру:
lib
ext
jmeter-plugins-casutg-2.6.jar (плагин)
jmeter-plugins-manager-1.3.jar (лишняя нагрузка)
jmeter-plugin-cmn-jmeter-0.4.jar (зависимость)
Таким образом, плагин jmeter-plugins-casutg-2.6.jar зависит от библиотеки jmeter-plugin-cmn-jmeter-0.4.jar, что важно для нас. И распространяется вместе с другим плагином jmeter-plugins-manager-1.3.jar, что не важно для нас.
В jar-файле с библиотекой написано как её найти в репозитории:
/META-INF/maven/kg.apc/jmeter-plugins-cmn-jmeter/pom.properties
#Generated by Maven #Tue May 02 15:16:47 MSK 2017 version=0.4 groupId=kg.apc artifactId=jmeter-plugins-cmn-jmeter
Поищем jmeter-plugin-cmn-jmeter-0.4.jar и найдём:
- https://repo.maven.apache.org/maven2/kg/apc/jmeter-plugins-cmn-jmeter/
- 0.1
- 0.2
- 0.3
- 0.4
- 0.5
- 0.6
Значит kg.apc:jmeter-plugins-casutg:2.6 зависит от kg.apc:jmeter-plugins-cmn-jmeterg:0.4. Но в тоже время, в репозитории есть более новая версия библиотеки kg.apc:jmeter-plugins-cmn-jmeter:0.6.
Maven Artifact: kg.apc:jmeter-plugins-cmn-jmeter:0.6
Добавим в раздел конфигурации плагина jmeter-maven-plugin следующие секции:
<jmeterExtensions> <!-- Custom Thread Groups https://jmeter-plugins.org/?search=jpgc-casutg http://repo.maven.apache.org/maven2/kg/apc/jmeter-plugins-casutg/ --> <artifact>kg.apc:jmeter-plugins-casutg:2.6</artifact> </jmeterExtensions> <testPlanLibraries> <!-- JMeter Plugins Common Classes: Various utility classes to ease development of plugins http://repo.maven.apache.org/maven2/kg/apc/jmeter-plugins-cmn-jmeter/ --> <artifact>kg.apc:jmeter-plugins-cmn-jmeter:0.6</artifact> </testPlanLibraries> <downloadExtensionDependencies>false</downloadExtensionDependencies> <downloadLibraryDependencies>false</downloadLibraryDependencies> <downloadOptionalDependencies>false</downloadOptionalDependencies> <downloadJMeterDependencies>false</downloadJMeterDependencies>
То есть:
- В секции jmeterExtensions добавлен плагин
- В секции testPlanLibraries добавлены зависимости плагина
- Указано, что все неявно заанные зависимости не нужно скачивать:
- downloadExtensionDependencies = false
- downloadLibraryDependencies = false
- downloadOptionalDependencies = false
- downloadJMeterDependencies = false
- downloadExtensionDependencies = false
после чего скачаем плагины (mvn jmeter:confure).
Зафиксируем изменения в системе контроля версий.
Изменения в проекте отражены в правке:
- https://github.com/polarnik/jmeter-loadtestweb/commit/ca53a2995ad8a1c2d3ea23b18ec28d6e7803afbb (Added jmeter-plugin UltimateThreadGroup)
Таким образом можно добавить любые плагины в проект Apache.JMeter.
Их не придётся хранить вместе с проектом. Они всегда будут скачиваться при необходимости запуска. А в системе контроля версий будет храниться только указание скачать их в файле pom.xml.