web-dev-qa-db-ja.com

ガトリング負荷テスト用の実行可能JARをビルドする

私はGatling(2.1.2)を初めて使用し、同僚に見せるために小さなプロトタイププロジェクトを実行したいと思っています。

クイックスタート ページによると、ガトリングでシミュレーションを実行する方法はいくつかあります。

  1. gatlingバンドルをフォルダーに解凍し、シミュレーションファイルをuser-files/simulationsフォルダーにドロップします。 bin/gatling.shは、シミュレーションファイルをコンパイルして実行します。
  2. gatling-maven-pluginmavenプラグインを使用してシミュレーションを実行します。
  3. gatling-highcharts-maven-archetypeを使用してプロジェクトを作成し、Engineクラスを実行します。

そして私はそれらの問題を見つけました

1の場合、シミュレーションクラスの依存関係を追加するのは困難です。必要なjarファイルを見つけて、libフォルダーにドロップする必要があります。

2の場合、Mavenをインストールする必要があります。

3の場合、IDEからのみ実行されます

すべての依存関係(シミュレーション、Gatling、サードパーティ)がバンドルされた単純な実行可能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

これはガトリング構成と関係があると思いますが、何が問題になっているのかわかりません。

15
stackoverflower

私は似たようなことをしようとしました。私はMavenも使用できませんでした。私はこれをどのようにしたかを思い出そうとします。

1)次のような依存関係を持つ単一のJARを生成するようにmaven-Assembly-pluginを構成しました。

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

必要なすべてのライブラリ(ガトリング、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

説明するために、私はインスピレーションを得るためにガトリング独自の起動スクリプトを使用しました。クラスパスパラメータ定義に主にtargetディレクトリが存在することに注意してください。

4)コンパイルしたtargetディレクトリとlaunch.shを単一にコンパイルしますディレクトリを作成し、これを配布します(アーカイブなど)。次に、./ launch.shを実行してシナリオを実行できます。

私はこれがnotの標準的な解決策であることを知っていますが、それは私にとってはうまくいきました。うまくいけば、それもあなたを助けるでしょう。改善すべき問題やヒントがある場合は、私たちと共有してください。

6
voho

それには少し遅れると思いますが、ここで関連する同じ問題に直面していますが、代わりにMavenを使用するためにgradleを使用しました。アプローチは同じだと思います。最初の解決策と何かまたは私自身の解決策を少し混ぜ合わせたものです。

まず、ガトリングの依存関係とfatjarをビルドするタスクを含むgradleビルドファイルを定義します

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メインクラスをデフォルトとして実行する自己完結型のjarを生成します。したがって、実行するウィッチテストは標準の「-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

私の場合、シミュレーションが常に同じになるように、構成が簡単な異なるパラメーターを使用して同じテストを実行します。すべてのmy scalaファイルはgradleとパッケージによってjarにコンパイルされます。つまり、クラスパスにあります。Script変数の "FunctionalTestSimulation"名を変更すると、このスクリプトをより一般的なものに簡単に適合させることができます。

Mavenバージョンを作成するのは簡単だと思います。

それが誰かを助けることを願っています。

フォルダー構造で更新リクエストの後、プロジェクトのフォルダー構造の小さなドラフトが追加されます。

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

時間があれば、動作するgithubへのリンクを提供します。乾杯

5
kszosze

Gatling.fromArgsでGatlingを開始する単純なJavaクラスをいつでも作成できます。この設定では、すべてを1つの幸せな実行可能jarに含めることができます。このクラスを "ではなくjarmainClassにします。 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;
        }
    });
  }
}
5
Pata

同様の問題が発生しました。次のように修正しました。

Gatlingパッケージの中にはbin/があり、gatling.shを見てください。クラスパスに特定の構成を追加し、io.gatling.app.Gatlinggatling-compiler-<version_number>.jarクラスを実行するだけであることがわかります。したがって、必要なのは、コンパイラーを含むjarを作成し、構成とテストをクラスパスに追加して、io.gatling.app.Gatlingを実行することだけです。手順:

コンパイラの依存関係を追加します。

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

依存関係のあるjarを作成します。

  <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>

テストjarを作成します(これにはガトリングテストが含まれます)

 <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.conflogback.xml、およびテストデータを含むアプリケーションが必要とする他のすべてのリソースが含まれています。これで、基本的にapplication.jarapplication-tests.jar、およびapplication-conf.Zipの3つのパッケージができました。 application-conf.Zipを解凍し、application.jarapplication-tests.jarを同じフォルダにコピーします。

このフォルダに、target/test-classes/フォルダを作成する必要があります。空のままにしておきます。私の場合、それは必要でした。 gatling.confでそれをどのように変更できると思います。しかし、その方法はわかりません。

実行

Java -cp ".:application-test.jar:application.jar" io.gatling.app.Gatling  
2
Saman

私はIntelliJIdeaを使用しており、scalaフォルダー>ディレクトリを>テストソースルートとしてマーク]を右クリックすることでこれを修正しました。「エンジン」を実行すると、すべて問題ありません。

0
Alferd Nobel

私は最近これについてブログを書きました ガトリングテスト用のバージョン管理可能な自己完結型(fat-/uber-)JARの作成 、そのソースは jamietanna/fat-gatling -jar

Mavenプロジェクトの場合、手順は次のようになります。

必要な主なものは、gatling-charts-highchartsへの依存関係を追加することです。

<project>
    <!-- ... -->
    <dependencies>
        <dependency>
            <groupId>io.gatling.highcharts</groupId>
            <artifactId>gatling-charts-highcharts</artifactId>
            <version>${gatling.version}</version>
        </dependency>
    </dependencies>
</project>

次に、ガトリングシナリオ/シミュレーションがsrc/mainではなくsrc/testにあることを確認する必要があります。

最後に、maven-shade-pluginを使用して、GatlingのCLIランナーをmainClassとして使用する実行可能JARを構築できます。

<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>  
0
jamietanna