为Gatling负载测试构建可执行JAR

sta*_*wer 14 java load-testing gatling

我是Gatling(2.1.2)的新手,想要做一个小型原型项目给同事们展示.

根据快速入门页面,有几种方法可以用Gatling运行模拟:

  1. 将Gatling包解压缩到一个文件夹中,然后将我的模拟文件放到user-files/simulations文件夹中.bin/gatling.sh将编译并运行模拟文件.
  2. 使用gatling-maven-pluginmaven插件执行模拟.
  3. gatling-highcharts-maven-archetype,创建一个项目,并运行Engine类.

我发现了那些问题

对于1,很难为模拟类添加依赖项.我必须弄清楚需要什么罐子并将它们放到lib文件夹中.

对于2,它需要安装maven.

对于3,它只从IDE运行

我只想要一个简单的可执行JAR文件,其中所有依赖项捆绑在一起(我的模拟,加特林和第三方),并从任何机器(如EC2实例)运行它.

有没有办法实现这个目标?

更新1:

我尝试了方法3,但将所有项目文件从test文件夹移动到main,并用于maven-assembly-plugin构建具有依赖项的jar.当我尝试运行该文件时,出现以下错误:

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
Run Code Online (Sandbox Code Playgroud)

我想这与Gatling配置有关,但不知道出了什么问题.

voh*_*oho 6

我试图做类似的事情。我也不能使用Maven。我将尝试记住我是如何做到的。

1)我已经配置了maven-assembly-plugin以生成具有如下依赖关系的单个JAR:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

您需要确保所有必需的库(加特林,scala运行时,zinc编译器)都出现在生成的类路径中。

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
Run Code Online (Sandbox Code Playgroud)

为了说明,我以加特林自己的启动脚本为灵感。请主要注意在类路径参数定义中目标目录的存在。

4)将编译后的目标目录和launch.sh编译到单个目录中,并将其分发(例如,作为归档文件)。然后,您可以通过执行./launch.sh来实现方案。

我知道这不是标准解决方案,但对我有用。希望它也会对您有所帮助。如果您有任何问题或需要改进的技巧,请与我们分享。

  • 如何指定模拟类列表?-sf不起作用,因为它需要文件夹路径而不是捆绑jar中的程序包路径 (3认同)

小智 5

您始终可以创建一个简单的Java类,以Gatling.fromArgs开始加特林。通过此设置,您可以将所有内容放在一个快乐的可执行jar中。让此类为jar mainClass而不是“ 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;
        }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)


ksz*_*sze 5

我认为这有点晚了,但是我在这里遇到了同样的问题,但是我使用gradle代替了maven。猜猜方法是一样的,只是第一个解决方案和我自己的东西的某种混合。

首先,定义一个具有加特林依赖关系的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
}
Run Code Online (Sandbox Code Playgroud)

该任务执行为

gradle clean build fatJar
Run Code Online (Sandbox Code Playgroud)

将生成一个自包含的jar,它将默认运行Gatling主类。因此,告诉它要运行的女巫测试是使用标准的“ -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
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我将使用易于配置的不同参数运行同一测试,因此我的模拟始终是相同的。我所有的scala文件都是通过gradle编译并打包到jar中的,这意味着它们都在类路径中,更改Script变量的“ FunctionalTestSimulation”名称可以使此脚本轻松适应更通用的要求。

猜猜制作Maven版本会很容易。

希望能帮助到别人。

使用文件夹结构更新 在请求之后,将为项目添加文件夹结构的小草稿:

test-project
    |_ build.gradle
    |_ src
        |_ main
            |_ scala
            |_ resources
    |_ runSimulation.sh
    |_ configFile.conf
Run Code Online (Sandbox Code Playgroud)

有时间的话,将提供一个指向我的github的链接,并提供一个有效的链接。干杯