Java 为Gatling负载测试构建可执行JAR
我是加特林(2.1.2)的新手,想做一个小的原型项目展示给我的同事 根据页面,我可以通过以下几种方式使用Gatling运行模拟:Java 为Gatling负载测试构建可执行JAR,java,load-testing,gatling,Java,Load Testing,Gatling,我是加特林(2.1.2)的新手,想做一个小的原型项目展示给我的同事 根据页面,我可以通过以下几种方式使用Gatling运行模拟: 将Gatling捆绑包解压缩到一个文件夹中,并将我的模拟文件放到用户文件/模拟文件夹中。bin/gatling.sh将编译并运行模拟文件 使用gatlingmaven插件maven插件执行模拟 使用gatling maven原型创建一个项目,并运行Engine类 我发现了这些问题 对于1,很难为模拟类添加依赖项。我必须弄清楚需要什么JAR,然后把它们放到lib文件夹中
gatlingmaven插件
maven插件执行模拟gatling maven原型创建一个项目,并运行Engine类
test
文件夹移动到main
,并使用maven汇编插件构建了一个具有依赖项的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
线程“main”java.lang.ExceptionInInitializeError中的异常
在引擎$.delayedEndpoint$引擎$1处(引擎.scala:7)
在引擎$delayedInit$body.apply处(引擎.scala:4)
在scala.Function0$class.apply$mcV$sp(Function0.scala:40)
在scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)中
位于scala.App$$anonfun$main$1.apply(App.scala:76)
位于scala.App$$anonfun$main$1.apply(App.scala:76)
位于scala.collection.immutable.List.foreach(List.scala:381)
位于scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
位于scala.App$class.main(App.scala:76)
发动机$main时(发动机.scala:4)
在Engine.main(Engine.scala)处
原因:java.nio.file.FileSystemNotFoundException
位于com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171)
位于com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157)
位于java.nio.file.Paths.get(path.java:143)
在io.gatling.core.util.PathHelper$.uri2path(PathHelper.scala:32)上
在IDEPathHelper$(IDEPathHelper.scala:7)
位于IDEPathHelper$(IDEPathHelper.scala)
... 还有11个
我想这与Gatling配置有关,但不知道出了什么问题。我也尝试过类似的方法。我也不能用Maven。我会尽力记住我是如何做到这一点的 1) 我已经配置了maven assembly plugin来生成具有如下依赖项的单个JAR:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
#!/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
为了解释这一点,我以盖特林自己的发射脚本为灵感。主要注意类路径参数定义中存在target目录
4) 编译编译后的目标目录并将launch.sh编译到单个目录,然后将其分发(例如,作为存档)。然后,您可以通过执行/launch.sh来查看场景
我知道这不是一个标准的解决方案,但它对我有效。希望它也能帮助你。如果您有任何需要改进的问题或提示,请与我们分享。您始终可以创建一个简单的Java类,以Gatling.fromArgs启动Gatling。使用此设置,您可以在一个快乐的可执行jar中拥有所有内容。让这个类成为jarmain类,而不是“io.gatling.app.gatling”。此示例适用于scala模拟类“my.package.MySimulation”
导入scala.Option;
导入io.gatling.app.gatling;
导入io.gatling.core.scenario.Simulation;
公共类启动模拟{
公共静态void main(字符串[]args){
fromArgs(新字符串[]{},新选项(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共int生产率(){
返回0;
}
@凌驾
公共对象productElement(int arg0){
返回null;
}
@抑制警告(“未选中”)
@凌驾
公共类get(){
试一试{
return(Class)Class.forName(“my.package.MySimulation”);
}catch(classnotfounde异常){
e、 printStackTrace();
}
返回null;
}
@凌驾
公共布尔值为空(){
返回false;
}
@凌驾
公共布尔canEqual(对象o){
返回false;
}
});
}
}
我有一个类似的问题,我修复了它,如下所示:
在Gatling包中有bin/
,请查看Gatling.sh
。您可以看到,它只是将某些配置添加到类路径中,然后在gatling compiler-.jar
中运行io.gatling.app.gatling
类。所以,您所需要做的就是制作一个包含编译器的jar,向类路径添加配置和测试,并运行io.gatling.app.gatling
。
步骤:
添加编译器依赖项:
<dependency>
<groupId>io.gatling</groupId>
<artifactId>gatling-compiler</artifactId>
<version>${gatling.version}</version>
</dependency
我想这已经有点晚了,但我在这里面临着同样的问题,但我用的是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,该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
当你有时间的时候,我会提供一个到我的github的链接。
干杯我使用IntelliJ Idea,我正确地解决了这个问题
java -cp ".:application-test.jar:application.jar" io.gatling.app.Gatling
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
#!/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
test-project
|_ build.gradle
|_ src
|_ main
|_ scala
|_ resources
|_ runSimulation.sh
|_ configFile.conf
<project>
<!-- ... -->
<dependencies>
<dependency>
<groupId>io.gatling.highcharts</groupId>
<artifactId>gatling-charts-highcharts</artifactId>
<version>${gatling.version}</version>
</dependency>
</dependencies>
</project>
<project>
<!-- ... -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<filters>
<!-- https://stackoverflow.com/a/6743609 -->
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>io.gatling.app.Gatling</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>