maven


Launch spring-boot app before Gatling simulation


I have a spring-boot project powered by maven I would like to run load tests on, using Gatling.
At this moment, I can run my simulation typing the following command :
mvn gatling:execute
It works correctly but I have to launch my springboot app manually or it won't work.
Here is my Simulation class :
package main.aperture.gatling
import aperture.config.SpringBootApertureTestingConfiguration
import io.gatling.core.Predef._
import io.gatling.core.structure.ScenarioBuilder
import io.gatling.http.Predef._
import io.gatling.http.protocol.HttpProtocolBuilder
import org.springframework.boot.SpringApplication
import org.springframework.context.ConfigurableApplicationContext
import scala.concurrent.duration._
import scala.language.postfixOps
/**
* This class is meant to load test main get routes of this app
* The app has to be launched first (Manually, unfortunately)
*/
class MainSimulation extends Simulation {
val baseUrl: String = "localhost"
val port: String = System.getProperty("server.port", "8080")
val httpConf: HttpProtocolBuilder = http
.baseURL(s"http://$baseUrl:$port") // Here is the root for all relative URLs
val scenario_main_get: ScenarioBuilder = scenario("Testing main get routes")
.exec(http("Request on main route")
.get("/"))
.pause(100 milliseconds)
.exec(http("Request on rooms main route")
.get("/api/rooms"))
.pause(100 milliseconds)
.exec(http("Request on subjects main route")
.get("/api/subjects"))
.pause(100 milliseconds)
.exec(http("Request on supervisors main route")
.get("/api/supervisors"))
setUp(scenario_main_get.inject(rampUsers(1000) over (5 seconds)).protocols(httpConf))
}
Here is my pom.xml (I deleted unrelevant elements) :
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-accessing-mongodb-data-res</artifactId>
<packaging>jar</packaging>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<!-- Properties -->
<properties>
<springfox-version>2.6.1</springfox-version>
<springfox-swaggerui-version>2.6.1</springfox-swaggerui-version>
<spring-version>4.3.2.RELEASE</spring-version>
<swagger-core-version>1.5.10</swagger-core-version>
<slf4j-version>1.6.3</slf4j-version>
<junit-version>4.8.1</junit-version>
<hibernate-validator-version>5.2.4.Final</hibernate-validator-version>
<fizzedwatcher.version>1.0.6</fizzedwatcher.version>
<gatling.version>2.2.5</gatling.version>
<gatling-plugin.version>2.2.4</gatling-plugin.version>
<scala-maven-plugin.version>3.2.2</scala-maven-plugin.version>
</properties>
<!-- Project dependencies -->
<dependencies>
<!-- SpringBoot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- Gatling highcharts -->
<dependency>
<groupId>io.gatling.highcharts</groupId>
<artifactId>gatling-charts-highcharts</artifactId>
<version>${gatling.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- Project build options and plugins -->
<build>
<plugins>
<!--Spring boot plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>aperture.config.SpringBootApertureTestingConfiguration</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- Scala maven plugin -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>${scala-maven-plugin.version}</version>
</plugin>
<!-- Gatling maven plugin -->
<plugin>
<groupId>io.gatling</groupId>
<artifactId>gatling-maven-plugin</artifactId>
<version>${gatling-plugin.version}</version>
<configuration>
<simulationClass>main.aperture.gatling.MainSimulation</simulationClass>
</configuration>
<executions>
<execution>
<goals>
<goal>execute</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
I would like to be able to automatically run the spring-boot app before running the load tests with gatling.
Some have suggested to add the following code at the beggining of my simulation :
val app: ConfigurableApplicationContext = SpringApplication.run(classOf[SpringBootApertureTestingConfiguration])
Runtime.getRuntime.addShutdownHook(new Thread() {
override def run(): Unit = app.stop()
})
But when I do that, I get the following error when I execute it :
[INFO] --- gatling-maven-plugin:2.2.4:execute (default-cli) # gs-accessing-mongodb-data-res ---
20:32:23,625 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
20:32:23,625 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
20:32:23,625 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [jar:file:/home/msb/.m2/repository/io/gatling/gatling-maven-plugin/2.2.4/gatling-maven-plugin-2.2.4.jar!/logback.xml]
20:32:23,634 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList#1a04f701 - URL [jar:file:/home/msb/.m2/repository/io/gatling/gatling-maven-plugin/2.2.4/gatling-maven-plugin-2.2.4.jar!/logback.xml] is not of type file
20:32:23,670 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
20:32:23,674 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
20:32:23,678 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CONSOLE]
20:32:23,681 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter#5:19 - no applicable action for [immediateFlush], current ElementPath is [[configuration][appender][immediateFlush]]
20:32:23,682 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
20:32:23,721 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - ROOT level set to WARN
20:32:23,721 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CONSOLE] to Logger[ROOT]
20:32:23,722 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
20:32:23,722 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator#4e91d63f - Registering current configuration as safe fallback point
20:32:29,151 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
20:32:29,152 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
20:32:29,152 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [jar:file:/home/msb/.m2/repository/io/gatling/gatling-maven-plugin/2.2.4/gatling-maven-plugin-2.2.4.jar!/logback.xml]
20:32:29,169 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList#5419f379 - URL [jar:file:/home/msb/.m2/repository/io/gatling/gatling-maven-plugin/2.2.4/gatling-maven-plugin-2.2.4.jar!/logback.xml] is not of type file
20:32:29,221 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
20:32:29,225 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
20:32:29,233 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CONSOLE]
20:32:29,239 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter#5:19 - no applicable action for [immediateFlush], current ElementPath is [[configuration][appender][immediateFlush]]
20:32:29,241 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
20:32:29,282 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - ROOT level set to WARN
20:32:29,282 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CONSOLE] to Logger[ROOT]
20:32:29,282 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
20:32:29,283 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator#7dc7cbad - Registering current configuration as safe fallback point
main.aperture.gatling.MainSimulation is the only simulation, executing it.
Select simulation id (default is 'mainsimulation'). Accepted characters are a-z, A-Z, 0-9, - and _
Select run description (optional)
20:33:42.287 [restartedMain][WARN ][SpringApplicationRunListeners.java:91] o.s.b.SpringApplication - Error handling failed (no error message)
20:33:42.291 [restartedMain][ERROR][SpringApplication.java:839] o.s.b.SpringApplication - Application startup failed
java.lang.IllegalStateException: Logback configuration error detected:
ERROR in ch.qos.logback.core.joran.spi.Interpreter#5:19 - no applicable action for [immediateFlush], current ElementPath is [[configuration][appender][immediateFlush]]
at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:161)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.reinitialize(LogbackLoggingSystem.java:205)
at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:65)
at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:50)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:114)
at org.springframework.boot.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:299)
at org.springframework.boot.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:272)
at org.springframework.boot.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:235)
at org.springframework.boot.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:208)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:166)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:138)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:121)
at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:68)
at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:337)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)
at main.aperture.gatling.MainSimulation.<init>(MainSimulation.scala:20)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at io.gatling.app.Runner.run0(Runner.scala:79)
at io.gatling.app.Runner.run(Runner.scala:64)
at io.gatling.app.Gatling$.start(Gatling.scala:59)
at io.gatling.app.Gatling$.fromArgs(Gatling.scala:43)
at io.gatling.app.Gatling$.main(Gatling.scala:35)
at io.gatling.app.Gatling.main(Gatling.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at io.gatling.mojo.MainWithArgsInFile.runMain(MainWithArgsInFile.java:50)
at io.gatling.mojo.MainWithArgsInFile.main(MainWithArgsInFile.java:33)
Caused by: org.springframework.boot.devtools.restart.SilentExitExceptionHandler$SilentExitException
at org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread(SilentExitExceptionHandler.java:90)
at org.springframework.boot.devtools.restart.Restarter.immediateRestart(Restarter.java:182)
at org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:161)
at org.springframework.boot.devtools.restart.Restarter.initialize(Restarter.java:543)
at org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationStartedEvent(RestartApplicationListener.java:68)
at org.springframework.boot.devtools.restart.RestartApplicationListener.onApplicationEvent(RestartApplicationListener.java:45)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:166)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:138)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:121)
at org.springframework.boot.context.event.EventPublishingRunListener.started(EventPublishingRunListener.java:63)
at org.springframework.boot.SpringApplicationRunListeners.started(SpringApplicationRunListeners.java:48)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:304)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)
at main.aperture.gatling.MainSimulation.<init>(MainSimulation.scala:20)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at io.gatling.app.Runner.run0(Runner.scala:79)
at io.gatling.app.Runner.run(Runner.scala:64)
at io.gatling.app.Gatling$.start(Gatling.scala:59)
at io.gatling.app.Gatling$.fromArgs(Gatling.scala:43)
at io.gatling.app.Gatling$.main(Gatling.scala:35)
at io.gatling.app.Gatling.main(Gatling.scala)
... 6 more
Maybe I forgot something or there is something missing in my configuration, but I can't find any help for my specific problem in the documentation. Some say it is a spring-boot dev tools bug.
Does anyone know how to correct this?
Even if my simulation is in a package inside my spring-boot project, It does not mean it is linked to the project. So, maybe it is not relevant to want to launch it directly in the code. However, has anyone found a workaround ?
Thanks in advance for your help.
Have you considered wrapping this in a simple shell script and starting the app from the spring boot maven plugin?
http://docs.spring.io/spring-boot/docs/1.5.3.RELEASE/maven-plugin/run-mojo.html.
Otherwise you should be able to hook the spring boot plugin into the maven lifecycle to run before gattling as well without a shell script.

Related Links

Few doubts about Jenkins Selenium and Maven [closed]
OSGi bundle doesn't start after inserting a Bundle Activator
Maven: Build shared Module as Dependency for other Modules so the can be build separately
Maven install failure: Install doesn't see packaged artifact
Jenkins autobuild goes into a loop when github commit triggers the build
Maven Build Issues : Reading jacoco.exec file
dist and native-win could not be activated, no POM in directory
How to get all the specified jars mentioned in the pom.xml and transitively dependent jars?
mvn testng can't run test suite while Idea can
Put Maven plugins in nexus repository
java.lang.NoClassDefFoundError: org/glassfish/jersey/server/spi/Container
Build Best Practices to avoid Classloader leaks - OutOfMemoryError: PermGen space
mule testing, NoClassDefFoundError org.springframework.core.OrderComparator$OrderSourceProvider
Mule DevKit - transformer / Cannot load application's classes
Skip execution of a plugin based on a property
Using Maven-JarJar plugin

Categories

HOME
cakephp
wso2-am
gerrit
openmp
amazon-ec2
minimum-spanning-tree
stock
onedrive
lodash
framework7
routes
rsync
tizen-web-app
survey
ezpublish
fancybox
qt-creator
leiningen
dtrace
decomposition
serilog
jprofiler
swingx
grails3
wkwebview
cultureinfo
jndi
trading
javacv
facet
facebook-access-token
internet-explorer-9
info.plist
traffic
fluentvalidation
neo4j-spatial
large-file-upload
gitignore
procdump
newline
instant-messaging
bcd
iframe-resizer
key-value-observing
webtest
gammu
ghost4j
y86
http-digest
appfabric
suricata
serverside-rendering
android-tabhost
ensembles
turbogears
import-from-excel
angular2-meteor
avconv
dds
nodebb
knpmenubundle
messenger
ableton-live
firmata
probability-density
file-writing
connect-by
simplewebrtc
moveit
testng-dataprovider
dlna
ipconfig
itextpdf
browser-link
rtbkit
t4mvc
comobject
simple-framework
0xdbe
apache-commons-fileupload
createprocessasuser
xc16
knuth
android-radiobutton
heisenbug
java.nio.file
multiprocessor
ivyde
cos
orchardcms-1.7
interface-orientation
type-equivalence
typoscript2
eclipse-templates
stage
vdsp
bespin
web-architecture
microsoft-virtualization
anti-piracy
premature-optimization
text-coloring
ugc

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App