Построить исполняемый JAR для нагрузочного теста Гатлинга

Я новичок в Gatling (2.1.2) и хочу сделать небольшой прототип проекта, чтобы показать своим коллегам.

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

  1. распакуйте пакет Gatling в папку и поместите мои файлы моделирования в папку user-files/simulations. bin/gatling.sh будет компилировать и запускать файлы моделирования.
  2. использовать gatling-maven-plugin мавен плагин для выполнения моделирование.
  3. создайте проект с помощью gatling-highcharts-maven-archetype, и запустите класс Engine.

и я нашел эти проблемы

для 1, трудно добавить зависимости для моделирования классов. Я должен выяснить, какие банки нужны, и поместить их в папку lib.

для 2 требуется установка maven.

для 3 он работает только из IDE

Я просто хочу простой исполняемый файл jar со всеми зависимостями в комплекте (моя симуляция, Gatling и третья сторона), и запустить его с любой машины (например, экземпляры EC2).

есть ли способ достичь этого?

обновление 1:

я попробовал метод 3, но переместил все файлы проекта из до main, и использовать maven-assembly-plugin построить jar с зависимостями. Когда я попытался запустить файл, я получил следующую ошибку:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at Engine$.delayedEndpoint$Engine(Engine.scala:7)
    at Engine$delayedInit$body.apply(Engine.scala:4)
    at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
    at scala.App$$anonfun$main.apply(App.scala:76)
    at scala.App$$anonfun$main.apply(App.scala:76)
    at scala.collection.immutable.List.foreach(List.scala:381)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
    at scala.App$class.main(App.scala:76)
    at Engine$.main(Engine.scala:4)
    at Engine.main(Engine.scala)
Caused by: java.nio.file.FileSystemNotFoundException
    at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171)
    at com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157)
    at java.nio.file.Paths.get(Paths.java:143)
    at io.gatling.core.util.PathHelper$.uri2path(PathHelper.scala:32)
    at IDEPathHelper$.<init>(IDEPathHelper.scala:7)
    at IDEPathHelper$.<clinit>(IDEPathHelper.scala)
    ... 11 more

Я думаю это как то связано с Гатлинга конфигурации, но не знаю, что пошло не так.

5 ответов


Я пытался сделать нечто подобное. Я!--3-->не может используйте Maven. Я постараюсь вспомнить, как я это сделал.

1) я настроил maven-сборка-плагин для генерации одного JAR с зависимостями, как это:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

вам необходимо убедиться, что все необходимые библиотеки (gatling, Scala runtime, Zinc compiler) присутствуют в результирующем пути к классам.

2) Проверьте область ваших зависимостей как пакеты Maven только классы определяется с помощью scope=compile по умолчанию. Самый простой способ-это, вероятно, не использовать тестовые зависимости.

3) Создайте сценарий запуска, например launch.sh. Он должен содержать что-то вроде этого:

#!/bin/sh
USER_ARGS="-Dsomething="
COMPILATION_CLASSPATH=`find -L ./target -maxdepth 1 -name "*.jar" -type f -exec printf :{} ';'`
JAVA_OPTS="-server -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms512M -Xmx2048M -XX:+HeapDumpOnOutOfMemoryError -XX:+AggressiveOpts -XX:+OptimizeStringConcat -XX:+UseFastAccessorMethods -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false ${JAVA_OPTS}"
java $JAVA_OPTS $USER_ARGS -cp $COMPILATION_CLASSPATH io.gatling.app.Gatling -s your.simulation.FullClassName

чтобы объяснить, я взял собственный сценарий запуска Гатлинга для вдохновения. Обратите внимание в основном на наличие цель каталог в определении параметра classpath.

4) компиляции скомпилированный цель


вы всегда можете создать простой класс Java, который начинает Gatling с Gatling.фромарги. С помощью этой установки вы можете иметь все в одном счастливом исполняемый банку. Пусть этот класс будет jar mainClass вместо " io.Гатлинг.приложение.Гатлинг". Этот пример для класса моделирования scala " my.пакет.MySimulation".

import scala.Option;
import io.gatling.app.Gatling;
import io.gatling.core.scenario.Simulation;

public class StartSimulation {

  public static void main(String[] args) {
    Gatling.fromArgs(new String[]{}, new Option<Class<Simulation>>() {

        private static final long serialVersionUID = 1L;

        @Override
        public int productArity() {
            return 0;
        }

        @Override
        public Object productElement(int arg0) {
            return null;
        }

        @SuppressWarnings("unchecked")
        @Override
        public Class<Simulation> get() {
            try {
                return (Class<Simulation>) Class.forName("my.package.MySimulation");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        public boolean isEmpty() {
            return false;
        }

        @Override
        public boolean canEqual(Object o) {
            return false;
        }
    });
  }
}

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

во-первых, определите файл сборки gradle с зависимостями Гатлинга и задачей создания fatjar

apply plugin: 'scala'
version 0.1

dependencies {
  compile group: 'io.gatling', name: 'gatling-test-framework', version: '2.1.7'
  compile group: 'com.typesafe.akka', name: 'akka-actor_2.11', version: '2.4.7'
  compile group: 'org.scala-lang', name: 'scala-library', version: '2.11.7'
}

repositories{
   mavenCentral()
   mavenLocal()
}


task fatJar(type: Jar) {
   manifest {
       attributes 'Implementation-Title': 'Preparing test',  
          'Implementation-Version': version,
          'Main-Class': 'io.gatling.app.Gatling'
   }
   baseName = project.name + '-all'
      from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } {
        exclude 'META-INF/MANIFEST.MF'
        exclude 'META-INF/*.SF'
        exclude 'META-INF/*.DSA'
        exclude 'META-INF/*.RSA'

   }
   with jar
}

эта задача выполнена как

gradle clean build fatJar

создаст автономную банку, которая будет запускать основной класс Gatling по умолчанию. Так скажите, что тест ведьмы, который вы хотите запустить, выполнен со стандартным параметром'- s'.

Итак, последний шаг-создать, если хотите, скрипт для его запуска. Я" украду " скрипт для первого комментария и немного изменю

#!/bin/sh

if [ -z "" ];
then
    echo "Test config tool"
    echo
    echo "Running Parameters : "
    echo
    echo " <Config file> : Test definition file. Required"
    echo
   exit 0;
 fi

USER_ARGS="-DCONFIG_FILE="
JAVA_OPTS="-server -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms512M -Xmx2048M -XX:+HeapDumpOnOutOfMemoryError -XX:+AggressiveOpts -XX:+OptimizeStringConcat -XX:+UseFastAccessorMethods -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false ${JAVA_OPTS}"
java $JAVA_OPTS $USER_ARGS -jar test-project-all-0.1.jar -s FunctionalTestSimulation -nr

в моем случае я буду запускать один и тот же тест с разными, простыми в настройке параметрами, поэтому моя симуляция всегда одинакова. Все мои файлы scala компилируются gradle и package в jar, что означает, что они находятся в пути к классам, изменяя Имя "FunctionalTestSimulation" для переменной скрипта позволяет легко адаптировать этот скрипт для чего-то более общего.

думаю, что сделать версию Maven будет легко.

надеюсь, что кто-то поможет.

обновление со структурой папок После запроса будет добавлен небольшой черновик структуры папок для проекта:

test-project
    |_ build.gradle
    |_ src
        |_ main
            |_ scala
            |_ resources
    |_ runSimulation.sh
    |_ configFile.conf

когда есть время предоставит ссылку на мой github с рабочим. Ура!--5-->


у меня была аналогичная проблема, я ее исправил следующим образом:

внутри пакета Гатлинга есть bin/ и посмотри gatling.sh. Вы видите, что он просто добавляет определенные конфигурации в classpath, а затем работает io.gatling.app.Gatling класс gatling-compiler-<version_number>.jar. Итак, все, что вам нужно сделать, это сделать jar, который включает компилятор, добавить конфигурации и тесты в classpath и запустить io.gatling.app.Gatling. шаги:

добавить зависимость компилятора:

<dependency>
        <groupId>io.gatling</groupId>
        <artifactId>gatling-compiler</artifactId>
        <version>${gatling.version}</version>
    </dependency

создать банку с зависимости:

  <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>${project.build.finalName}</finalName>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

создать тест банку (это включает в себя ваши тесты Гатлинга)

 <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>test-jar</goal>
                    </goals>
                    <configuration>
                        <excludes>
                            <exclude>src/test/resources/*</exclude>
                        </excludes>
                        <finalName>${project.build.finalName}</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>

создать пакет из вашей конфигурации. Для этого можно использовать сборку maven. Обычно я создаю отдельный модуль, который обрабатывает создание пакета для разных сред. Этот пакет содержит gatling.conf, logback.xmlи все другие ресурсы, которые приложение хочет, включая тестовые данные. Теперь у вас в основном есть три пакета:application.jar, application-tests.jar и application-conf.zip. Распакуйтеapplication-conf.zip, копией application.jarи application-tests.jarв той же папке.

в этой папке нужно создать , просто оставьте его пустым. В моем случае, это было необходимо. Я думаю, вы можете как-то измените это в gatling.conf. Но я не знаю как.

выполнить

java -cp ".:application-test.jar:application.jar" io.gatling.app.Gatling  

Я использую IntelliJ Idea, и я исправил это, щелкнув правой кнопкой мыши по папке scala > отметить каталог как > корень тестовых источников . Теперь выполняйте "движок" и у вас все будет хорошо !