2015-01-11 14 views
9

Ich bin neu bei Gatling (2.1.2) und möchte ein kleines Prototyp-Projekt zu meinen Kollegen zeigen.Build ausführbare JAR für Gatling Belastungstest

Nach der quick start Seite, gibt es mehr Möglichkeiten, wie ich kann eine Simulation mit Gatling laufen:

  1. dekomprimieren der Gatling einen Ordner bündelt in und meine Simulation Drop von Dateien in Anwender-Dateien/Ordner Simulationen. bin/gatling.sh kompiliert und führt die Simulationsdateien aus.
  2. Verwenden Sie das gatling-maven-plugin Maven-Plugin, um die Simulation auszuführen.
  3. Erstellen Sie ein Projekt mit gatling-highcharts-maven-archetype, und führen Sie die Engine-Klasse.

und ich fand diese Probleme

Für 1, ist es schwer, Abhängigkeiten für die Simulation Klassen hinzuzufügen. Ich muss herausfinden, was die Gläser benötigt werden und sie in den Lib-Ordner fallen lassen.

Für 2 muss Maven installiert werden.

Für 3, es läuft nur von einem IDE

Ich möchte nur eine einfache ausführbare JAR-Datei mit allen Abhängigkeiten zusammenzugebündelt (meine Simulation, Gatling und Dritte), und es von jedem Rechner laufen (wie EC2 Instanzen).

Gibt es einen Weg, dies zu erreichen?

Update 1:

habe ich versucht, Verfahren 3, aber alle Projektdateien aus test Ordnern main bewegt und verwenden maven-assembly-plugin ein Glas mit Abhängigkeiten zu bauen. Als ich versuchte, die Datei auszuführen, bekam ich folgende Fehlermeldung:

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 

Ich denke, das ist etwas, mit Gatling-Konfiguration zu tun, aber nicht wissen, was schief gegangen ist.

+0

Wenn Sie ein PoC erstellen möchten, warum bleiben Sie nicht zuerst bei den offiziell unterstützten Bereitstellungsstrategien? –

+0

@StephaneLandelle, ich habe tatsächlich die offizielle Strategie ausprobiert, und so musste ich alle Gläser in den lib-Ordner fallen lassen. Ich möchte nur wissen, ob der Aufbau einer lauffähigen JAR möglich ist oder nicht und warum. – stackoverflower

+0

@Philippe, können Sie möglicherweise Methode 1 in meiner Frage verwenden. Was Sie tun müssen, ist die Zip-Datei des Gatling-Bundles zu entpacken und Ihre Szenario-Scala-Datei in den Ordner $ {GATLING}/user-files/simulations einzufügen. Jedes abhängige Jar sollte in $ {GATLING}/lib gehen (Sie müssen den Ordner erstellen, wenn er nicht im Bundle enthalten ist). Dann können Sie Gatling mit $ {GATLING} /bin/gatlin.sh ausführen. Die [Datei] (https://github.com/gatling/gatling/blob/master/gatling-bundle/src/universal/bin/gatling.sh) sagt Ihnen alles, wie es funktioniert. – stackoverflower

Antwort

3

Ich habe versucht, etwas ähnliches zu tun. I konnte nicht auch Maven verwenden. Ich werde versuchen, mich daran zu erinnern, wie ich das gemacht habe.

1) Ich habe konfiguriert Maven-Montage-Plugin auf einzelne JAR mit Abhängigkeiten wie folgt zu erzeugen:

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

Sie müssen alle benötigten Bibliotheken (Gatling, scala Laufzeit, Zink-Compiler), um sicherzustellen, vorhanden sind auf dem resultierenden Klassenpfad.

2) Überprüfen Sie den Umfang Ihrer Abhängigkeiten, da Maven nur Klassen packt, die standardmäßig mit scope = compile definiert sind. Der einfachste Weg ist wahrscheinlich, keine Testabhängigkeiten zu verwenden.

3) Erstellen Sie ein Startskript, z. launch.sh.Es sollte so etwas enthalten:

#!/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 

Um zu erklären, nahm ich Gatling `s eigenen Start-Skript zur Inspiration. Beachten Sie hauptsächlich das Vorhandensein von Ziel Verzeichnis in Klassenpfad Parameterdefinition.

4) Stellen Sie sich Ihren zusammengestellt Ziel Verzeichnis und launch.sh zu einem einzigen Verzeichnis und verteilen diese (zum Beispiel als Archiv). Dann können Sie die Szenarien ausführen, indem Sie ./launch.sh ausführen.

Ich weiß, das ist nicht eine Standardlösung, aber es hat für mich funktioniert. Hoffentlich wird es dir auch helfen. Wenn Sie Probleme oder Tipps zur Verbesserung haben, teilen Sie uns bitte mit.

+0

Sorry wegen der späten Antwort. Das ist fast das Gleiche wie das, was ich getan habe. Ich hoffe, das Gatling-Team wird dies offiziell unterstützen. – stackoverflower

+1

Wie kann ich eine Liste von Simulationsklassen angeben? -sf funktioniert nicht, da es den Ordnerpfad und nicht den Paketpfad in einem gebündelten Glas erfordert. –

4

Sie können immer eine einfache Java-Klasse erstellen, die Gatling mit dem Gatling.fromArgs startet. Mit diesem Setup können Sie alle in nur einem glücklichen ausführbaren Glas haben. Lassen Sie diese Klasse das jar mainClass anstelle von "io.atgl.app.Gatling" sein. Dieses Beispiel bezieht sich auf eine Scala-Simulationsklasse "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

Vielen Dank für Ihre Antwort. Das Problem hat mehr mit Abhängigkeiten zu tun. Am Ende habe ich eine benutzerdefinierte Hauptklasse geschrieben und maven verwendet, um das Projekt in eine ausführbare JAR mit Abhängigkeiten zu packen. – stackoverflower

+0

Leider wurde die fromArgs-Methode in Version 2.2.3 als privat markiert. Um diesen Trick zu verwenden, müssen Sie nun Folgendes hinzufügen: package io.catalog import io.gatling.app.{Gatling, SelectedSimulationClass} Objekt GatlingHack { def fromArgs (args: Array [Zeichenfolge], selectedSimulationClass: SelectedSimulationClass): Int = Gatling.fromArgs (args, selectedSimulationClass) } –

+0

Beachten Sie jedoch, dass Gatling ist nicht dazu gedacht, Wie Stephane Landelle einige Tage vor der Privatisierung der fromArgs-Methode darauf hingewiesen hat: https://groups.google.com/d/msg/gatling/387pDAweZEY/Va6TsErHAAAJ0 –

1

Ich hatte ein ähnliches Problem, ich habe es wie folgt festgelegt:

Innen Gatling-Paket gibt es bin/ und einen Blick auf gatling.sh nehmen. Sie sehen, dass es einfach bestimmte Konfigurationen in den Klassenpfad einfügt und dann die io.gatling.app.Gatling Klasse in ausführt. Alles, was Sie tun müssen, ist, ein JAR zu erstellen, das den Compiler enthält, Konfigurationen und Tests zum Classpath hinzufügt und io.gatling.app.Gatling ausführt. Schritte:

Add Compiler Abhängigkeit:

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

erstellen Glas mit Abhängigkeiten:

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

Test jar erstellen (dazu gehören Ihre Gatling-Tests)

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

ein Paket erstellen aus Ihrer Konfiguration heraus. Sie können Maven Assembly dafür verwenden. Was ich normalerweise mache, ist ein separates Modul zu erstellen, das das Erstellen des Pakets für verschiedene Umgebungen behandelt. Dieses Paket enthält Ihre gatling.conf, logback.xml und alle anderen Ressourcen, die Ihre Anwendung benötigt, einschließlich Testdaten. Jetzt haben Sie im Grunde drei Pakete: application.jar, application-tests.jar und application-conf.zip. Entpacken Sie application-conf.zip, kopieren Sie application.jar und application-tests.jar in den gleichen Ordner.

In diesem Ordner müssen Sie target/test-classes/ Ordner erstellen, nur lassen Sie es leer. In meinem Fall war es erforderlich. Ich denke du kannst etwas wie das in gatling.conf ändern. Aber ich bin mir nicht sicher wie.

Run

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

ich denke, ist ein bisschen zu spät, dass aber ich Gesicht irgendwie das gleiche Problem hier verwandt, aber stattdessen Maven zu verwenden, die ich verwendet gradle. Erraten Sie, dass der Ansatz dasselbe ist, ein bisschen Mischung aus der ersten Lösung und etwas oder meinem eigenen.

Zuerst definieren eine Gradle Build-Datei mit Gatling Abhängigkeiten und eine Aufgabe, eine fatjar aufzubauen

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 
} 

Diese Aufgabe ausgeführt, wie

gradle clean build fatJar 

wird eine in sich geschlossene Gefäß erzeugen, die die Gatling laufen Hauptklasse als Standard. Sagen Sie also, dass der Hextest, den Sie ausführen möchten, mit dem Standardparameter "-s" durchgeführt wird.

Also letzten Schritt ist, erstellen Sie, wenn Sie möchten, ein Skript, um es auszuführen. Ich werde das Drehbuch für den ersten Kommentar „stehlen“ und ändern ein bisschen

#!/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 

In meinem Fall habe ich den gleichen Test mit verschiedenen, leicht zu konfigurieren, Parameter laufen so meine Simulation immer gleich ist. Alle meine Scala-Dateien werden nach Gradle und Paket im Jar kompiliert, was bedeutet, dass sie sich im Klassenpfad befinden. Wenn Sie den Namen "FunctionalTestSimulation" für eine Script-Variable ändern, können Sie das Skript einfach an etwas Generischeres anpassen.

Raten Sie, dass eine Maven-Version einfach sein wird.

Hoffe, dass jemand helfen.

Aktualisierung mit Ordnerstruktur Nach einer Anfrage wird einen kleinen Entwurf der Ordnerstruktur für das Projekt ein:

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

Wenn Zeit zu bieten hat man einen Link zu meinem GitHub mit einem arbeiten. Prost

+0

Das war wirklich hilfreich, danke. Eine kleine Sache, ich sehe, dass Sie Scala-Bibliothek zweimal in verschiedenen Formaten importiert haben. Sie könnten das entfernen – SaviourSoul

+0

Danke, habe das nicht erkannt! – kszosze

+0

können Sie bitte auch Ihre Projektverzeichnisstruktur teilen, die für dieses Gradle-Skript funktioniert? z.B. wo sind deine Tests & Ressourcen – Alex

0

Ich benutze IntelliJ Idee und ich habe dies behoben, indem ich mit der rechten Maustaste auf den Scala-Ordner> Verzeichnis als> Testquellen Root. Jetzt "Engine" ausführen und alles wird gut!

+0

Dies funktioniert auch, wenn das Verzeichnis als Quellen root, nicht als Test markiert ist. Praktischer Weg, um schnell einen Test durchzuführen, nehme ich an. – breakspirit