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

2022-09-02 21:23:06

我是Gatling(2.1.2)的新手,想做一个小型原型项目向我的同事展示。

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

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

我发现了这些问题

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

对于 2,它需要安装 maven。

对于 3,它仅从 IDE 运行

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

有没有办法做到这一点?

更新 1:

我尝试了方法3,但是将所有项目文件从文件夹移动到,并用于构建具有依赖项的jar。当我尝试运行该文件时,我得到以下错误:testmainmaven-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

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


答案 1

我试图做类似的事情。我也不能使用Maven。我会努力记住我是怎么做到的。

1)我已经配置了maven-assembly-plugin来生成单个JAR,其依赖项如下所示:

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

您需要确保所有必需的库(gatling,scala runtime,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

为了解释,我以加特林自己的发布脚本为灵感。请注意,在类路径参数定义中存在目标目录。

4)编译编译编译的目标目录,launch.sh 到单个目录并分发(例如,作为存档)。然后,您可以通过执行./launch.sh 来设置方案。

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


答案 2

我认为这有点晚了,但我面临着与这里相关的相同问题,但是为了使用maven,我使用了gradle。猜猜方法是一样的,第一个解决方案和我自己的东西有点混合。

首先,定义一个带有 gatling 依赖项的 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

将生成一个独立的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

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

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

希望能帮助别人。

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

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

当有时间时,将提供一个链接到我的github与一个工作。干杯


推荐