2015-01-11 2 views
9

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

Согласно quick start странице, есть несколько способов, которыми я могу запустить моделирование с Гатлинга:

  1. распаковывать Гатлинга расслоение в папку и падение мои файлы моделирования в пользовательские файлы папки/симуляций. bin/gatling.sh будет компилировать и запускать файлы моделирования.
  2. использовать плагин maven для запуска симуляции.
  3. создайте проект с gatling-highcharts-maven-archetype и запустите класс Engine.

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

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

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

Для 3, он работает только с IDE

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

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

Update 1:

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

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at Engine$.delayedEndpoint$Engine$1(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$1.apply(App.scala:76) 
    at scala.App$$anonfun$main$1.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 

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

+0

Если вы хотите построить PoC, почему бы вам не сначала придерживаться стратегий развертывания, которые официально поддерживаются? –

+0

@StephaneLandelle, я на самом деле пробовал официальную стратегию, и именно так я нашел, что мне нужно было сбросить все банки в папку lib. Я просто хочу знать, возможно ли создание runnable JAR или нет, и почему. – stackoverflower

+0

@Philippe, вы могли бы использовать метод 1 в моем вопросе. Вам нужно распаковать zip-файл пакета Gatling и вставить файл scala сценария в папку $ {GATLING}/user-files/simulations. Любая зависимая банка должна перейти в $ {GATLING}/lib (вам нужно создать папку, если она не входит в комплект). Затем вы можете запустить Gatling с помощью $ {GATLING} /bin/gatlin.sh. Файл [файл] (https://github.com/gatling/gatling/blob/master/gatling-bundle/src/universal/bin/gatling.sh) сообщает вам, как он работает. – stackoverflower

ответ

3

Я попытался сделать что-то подобное. I не мог использовать Maven. Я попытаюсь вспомнить, как я это сделал.

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

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

Вы должны обеспечить все необходимые библиотеки (Гатлинга, Scala во время выполнения, компилятор цинка) присутствуют на ваш результирующий путь к классам.

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

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

#!/bin/sh 
USER_ARGS="-Dsomething=$1" 
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 

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

4) Компиляция скомпилированный целевой каталог и launch.sh в один каталог и распространить это (например, в виде архива). Затем вы можете выполнить сценарии, выполнив ./launch.sh.

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

+0

Извините за поздний ответ. Это почти то же самое, что и я. Надеюсь, что команда Gatling окажет официальную поддержку этому. – stackoverflower

+1

Как я могу указать список классов моделирования? -sf не работает, поскольку для него требуется путь к папке, а не путь пакета в комплекте jar –

4

Вы всегда можете создать простой Java-класс, который запускает Gatling с помощью Gatling.fromArgs. С помощью этой настройки вы можете иметь всего лишь одну счастливую исполняемую банку. Пусть этот класс является основным кластером jar вместо «io.gatling.app.Gatling». Этот пример предназначен для класса моделирования scala «my.package.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; 
     } 
    }); 
    } 
} 
+0

Спасибо за ваш ответ. Проблема больше связана с зависимостями. То, что я закончил, это написать собственный основной класс, как и вы, и использовать maven для упаковки проекта в исполняемый JAR с зависимостями. – stackoverflower

+0

К сожалению, метод fromArgs был помечен частным для io.gatling в версии 2.2.3, поэтому для использования этого трюка вам нужно добавить что-то вроде: package io.gatling import io.gatling.app.{Гатлинга, SelectedSimulationClass} объект GatlingHack { Защиту fromArgs (арг: Array [String], selectedSimulationClass: SelectedSimulationClass): Int = Gatling.fromArgs (арг, selectedSimulationClass) } –

+0

Заметим, однако, что Гатлинга не означает таким образом, как отметил Стефан Ландел за несколько дней до того, как сделать privateArray методом private: https://groups.google.com/d/msg/gatling/387pDAweZEY/Va6TsErHAAAJ –

1

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

пакет Внутри Гатлинга есть bin/ и взглянуть на gatling.sh. Вы видите, что он просто добавляет определенные конфигурации в classpath, а затем запускает класс io.gatling.app.Gatling в gatling-compiler-<version_number>.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. Unzip application-conf.zip, копия application.jar и application-tests.jar в той же папке.

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

Run

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

Я думаю, что это немного поздно, но я сталкиваюсь своего рода ту же проблему, связанную здесь, но вместо того, чтобы использовать 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 

будет генерировать автономный баночку, которая будет работать Гатлинга основной класс по умолчанию. Поэтому скажите, что тест на ведьму, который вы хотите запустить, производится со стандартным параметром «-s».

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

#!/bin/sh 

if [ -z "$1" ]; 
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=$1" 
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 скомпилированы градиентом и пакетом в банке, что означает, что они находятся в пути к классам, изменение имени «FunctionalTestSimulation» для переменной Script позволяет легко адаптировать этот скрипт к чему-то более универсальному.

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

Надежды, которые помогают кому-то.

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

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

Когда есть время, предоставит ссылку на мой GitHub с рабочими один. Cheers

+0

Это было действительно полезно, спасибо. Одна маленькая вещь, я вижу, что вы импортировали scala-library дважды вверху, в разных форматах. Вы можете удалить это – SaviourSoul

+0

Спасибо, не осознавали этого! – kszosze

+0

вы также можете поделиться своей структурой каталогов проектов, которая работает для этого сценария Gradle? например где находятся ваши тесты и ресурсы – Alex

0

Я использую IntelliJ Idea, и я получил это исправление, щелкнув правой кнопкой мыши папку scala> Mark Directory в качестве> Test Sources Root. Теперь выполните «Двигатель», и все будет хорошо!

+0

Это также работает, если каталог помечен как источник root, а не test. Я полагаю, удобный способ быстро запустить тест. – breakspirit

Смежные вопросы