В одной из записей (Установка и настройка Apache.JMeter) рассказывал про ручную установку и настройку Apache.JMeter. Сейчас расскажу про автоматизацию этого процесса.

В результате — все параметры настройки JMeter будут храниться в системе контроля версий. Тесты будут легко воспроизводимы, а процесс приблизится к тому, чтобы встроить нагрузку в CI/CD-конвейер.

mvn verify или mvn jmeter:test

И магия — скачался jmeter, плагины, запустился тест, сформировался отчёт.

Результат настройки в репозитории:

Основа статьи

Статья опирается на труды других людей, но имеет свою оригинальность.

Создание пустого maven проекта

Проект можно создать вручную, а можно использовать maven archetype.

Ручное создание проекта

Создать каталог, назвав его «jmeter-loadtestweb». Внутри каталога создать структуру каталогов пустого java-проекта:

  • folder jmeter-loadtestweb
    • folder src
      • folder main
        • folder java
      • folder test
        • folder java
        • folder jmeter
    • xml pom.xml

И разместить в каталоге файл 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-проекта может быть следующим:

  • folder jmeter-loadtestweb
    • folder src
      • folder main
        • folder java — утилиты, классы JMeter Function, классы для Java Request (пример JavaTest и SleepTest) — программный код, с помощью которого можно создавать нагрузку
      • folder test
        • folder java — jUnit-тесты для jUnit Request
        • folder 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 (ещё без jmx-скрипта)
Минимальный проект для jmeter-maven-plugin (ещё без jmx-скрипта)

Изначально проект пустой. В нём ничего нет.

Для того, чтобы работать с 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
IntelliJ.IDEA.Maven.home.directory
Version: 3.5.2

Убедиться, что версия maven не ниже, чем 3.5. На снимке выше версия 3.5.2.

Роль IntelliJ IDEA

Из среды разработки удобно:

  • редактировать pom.xml
  • вызывать любые плагины maven
  • работать с системой контроля версий

А если в будущем будут использоваться

то среда разработки будет просто необходима.

Создание пустого скрипта Apache.JMeter

Выполнить jmeter:gui используя IntelliJ Idea или вызвав в консоли:

mvn jmeter:gui
Apache.JMeter.File.not.found
loadtestweb.jmx (Нет такого файла или каталога)

Запустится Apache.JMeter в графическом режиме и скажет, что файла jmeter-loadtestweb.jmx не существует.

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

IntelliJ.IDEA.Apache.JMeter.project.blank.2
В каталоге jmeter появился jmeter-loadtestweb.jmx (слева), который удобно открыть кликнув по jmeter:gui (справа)

Теперь в проекте есть пустой jmx-скрипт.

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

Уже привык к использованию github.com и bitbucket.com. Но многие товарищи перешли на gitlab.com, в частности, после продажи github.

В данном примере будем использовать github.com, чтобы делиться проектом с другими.

Create a new repository
Создание проекта на github.com

Создаём новый проект. Вот он:

Связывание репозитория и проекта в графическом режиме

В IntelliJ IDEA инициализируем git-репозиторий:

VCS / Enable Version Control Integration…

vcs.git

Добавить связь с внешним репозиторием:

VCS / Git / Remotes…

 

git.remote

Для аутентификации по логину и паролю нужно указать https- сылку, а для аутентификации по ключу — git-ссылку на репозиторий.

Загрузить содержимое внешнего репозитория в локальный, используя IntelliJ Idea (VSC / Git) или консольные команды:

git fetch
git pull

Теперь в проекте появятся файлы из внешнего репозитория — README.md и LICENCE.

IntelliJ.IDEA.Apache.JMeter.project.blank.3
В локальном проекте появились README.md и LICENCE из внешнего репозитория

Добавим в xml 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>
IntelliJ.IDEA.Apache.JMeter.project.blank.4
Добавим в pom.xml описание репозитория и разработчика

Теперь можно сохранить текущие изменения в git и отправить их во внешний репозиторий.

Предполагается, что первоначальная настройка git уже была выполнена.

Настроены имя пользователя и адрес электронной почты.

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

Текущие настройки можно посмотреть, выполнив команды

git config user.name
git config user.email
git.config
Просмотр текущих user.name и user.email из консоли IntelliJ IDEA

Если же для github.com, конкретно, используется специфичное имя и адрес электронной почты, то нужно указать специфичные настройки для текущего проекта.

Будет как в инструкциях выше, но без ключа —global.

git config user.name "polarnik"
git config user.email owasp@yandex.ru

Теперь можно загитовать все изменения. И отправить их во внешнее хранилище.

git.commit
git commit с выбором изменений и указанием commit message из IntelliJ IDEA

Настройка плагинов

Допустим нам недостаточно базовых возможностей Apache.JMeter и решено использовать плагины.

Например плагин Ultimate Thread Group:

А конкретно версии 2.6.

В карточке Custom Thread Group сказано, что скачать плагины из этой группы можно используя артифакт

Maven Artifact: kg.apc:jmeter-plugins-casutg:2.6

Кроме того, скачав архив

можно увидеть следующую структуру:

  • folder lib
    • folder ext
      • jar jmeter-plugins-casutg-2.6.jar (плагин)
      • jar jmeter-plugins-manager-1.3.jar (лишняя нагрузка)
    • 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 и найдём:

Значит 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>

То есть:

  1. В секции jmeterExtensions добавлен плагин
  2. В секции testPlanLibraries добавлены зависимости плагина
  3. Указано, что все неявно заанные зависимости не нужно скачивать:
    • downloadExtensionDependencies = false
    • downloadLibraryDependencies = false
    • downloadOptionalDependencies = false
    • downloadJMeterDependencies = false

после чего скачаем плагины (mvn jmeter:confure).

Зафиксируем изменения в системе контроля версий.

Изменения в проекте отражены в правке:

Таким образом можно добавить любые плагины в проект Apache.JMeter.

Их не придётся хранить вместе с проектом. Они всегда будут скачиваться при необходимости запуска. А в системе контроля версий будет храниться только указание скачать их в файле pom.xml.

 

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s