From 3b492d2392798db2c29e13fac7c1b1cae80dd7ae Mon Sep 17 00:00:00 2001 From: nhan tran Date: Fri, 15 Apr 2016 14:31:52 +0100 Subject: [PATCH] add gatling to test folder --- src/test/gatling/.gitignore | 1 + src/test/gatling/pom.xml | 49 ++++++ .../src/test/resources/application.conf | 9 ++ .../gatling/src/test/resources/data/.gitkeep | 0 .../gatling/src/test/resources/gatling.conf | 153 ++++++++++++++++++ .../src/test/resources/logback-test.xml | 24 +++ .../test/resources/request-bodies/.gitkeep | 0 .../scala/default/RecordedSimulation.scala | 25 +++ 8 files changed, 261 insertions(+) create mode 100644 src/test/gatling/.gitignore create mode 100644 src/test/gatling/pom.xml create mode 100644 src/test/gatling/src/test/resources/application.conf create mode 100644 src/test/gatling/src/test/resources/data/.gitkeep create mode 100644 src/test/gatling/src/test/resources/gatling.conf create mode 100644 src/test/gatling/src/test/resources/logback-test.xml create mode 100644 src/test/gatling/src/test/resources/request-bodies/.gitkeep create mode 100644 src/test/gatling/src/test/scala/default/RecordedSimulation.scala diff --git a/src/test/gatling/.gitignore b/src/test/gatling/.gitignore new file mode 100644 index 00000000000..eb5a316cbd1 --- /dev/null +++ b/src/test/gatling/.gitignore @@ -0,0 +1 @@ +target diff --git a/src/test/gatling/pom.xml b/src/test/gatling/pom.xml new file mode 100644 index 00000000000..5839c132a40 --- /dev/null +++ b/src/test/gatling/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + com.dcsc + nodeapp-gatling + 2.0.3 + + + UTF-8 + ${project.version} + 2.0.0 + + + + + io.gatling.highcharts + gatling-charts-highcharts + ${gatling.version} + test + + + + + + + io.gatling + gatling-maven-plugin + ${gatling-plugin.version} + + + test + + execute + + + + + + target/gatling/results + src/test/resources/request-bodies + src/test/scala + + + + + + + diff --git a/src/test/gatling/src/test/resources/application.conf b/src/test/gatling/src/test/resources/application.conf new file mode 100644 index 00000000000..caa076933b1 --- /dev/null +++ b/src/test/gatling/src/test/resources/application.conf @@ -0,0 +1,9 @@ +#################################### +# Akka Actor Config File # +#################################### + +akka { + scheduler { + tick-duration = 50ms + } +} diff --git a/src/test/gatling/src/test/resources/data/.gitkeep b/src/test/gatling/src/test/resources/data/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/test/gatling/src/test/resources/gatling.conf b/src/test/gatling/src/test/resources/gatling.conf new file mode 100644 index 00000000000..8c70bae1c22 --- /dev/null +++ b/src/test/gatling/src/test/resources/gatling.conf @@ -0,0 +1,153 @@ +######################### +# Gatling Configuration # +######################### + +# This file contains all the settings configurable for Gatling with their default values + +gatling { + core { + #outputDirectoryBaseName = "" # The prefix for each simulation result folder (then suffixed by the report generation timestamp) + #runDescription = "" # The description for this simulation run, displayed in each report + #encoding = "utf-8" # Encoding to use throughout Gatling for file and string manipulation + #simulationClass = "" # The FQCN of the simulation to run (when used in conjunction with noReports, the simulation for which assertions will be validated) + #disableCompiler = false # When set to true, skip compiling and load an already compiled simulation (used in conjunction with simulationClass) + #mute = false # When set to true, don't ask for simulation name nor run description (currently only used by Gatling SBT plugin) + + extract { + regex { + #cacheMaxCapacity = 200 # Cache size for the compiled regexes, set to 0 to disable caching + } + xpath { + #cacheMaxCapacity = 200 # Cache size for the compiled XPath queries, set to 0 to disable caching + } + jsonPath { + #cacheMaxCapacity = 200 # Cache size for the compiled jsonPath queries, set to 0 to disable caching + #preferJackson = false # When set to true, prefer Jackson over Boon for JSON-related operations + jackson { + #allowComments = false # Allow comments in JSON files + #allowUnquotedFieldNames = false # Allow unquoted JSON fields names + #allowSingleQuotes = false # Allow single quoted JSON field names + } + + } + css { + #cacheMaxCapacity = 200 # Cache size for the compiled CSS selectors queries, set to 0 to disable caching + } + } + + timeOut { + #simulation = 8640000 # Absolute timeout, in seconds, of a simulation + } + directory { + #data = user-files/data # Folder where user's data (e.g. files used by Feeders) is located + #requestBodies = user-files/request-bodies # Folder where request bodies are located + #simulations = user-files/simulations # Folder where the bundle's simulations are located + #reportsOnly = "" # If set, name of report folder to look for in order to generate its report + #binaries = "" # If set, name of the folder where compiles classes are located + #results = results # Name of the folder where all reports folder are located + } + zinc { + #jvmArgs = "-Xss10M" # JVM args passed to Zinc (in charge of compiling Gatling Simulations) + } + } + charting { + #noReports = false # When set to true, don't generate HTML reports + #maxPlotPerSeries = 1000 # Number of points per graph in Gatling reports + #accuracy = 10 # Accuracy, in milliseconds, of the report's stats + indicators { + #lowerBound = 800 # Lower bound for the requests' response time to track in the reports and the console summary + #higherBound = 1200 # Higher bound for the requests' response time to track in the reports and the console summary + #percentile1 = 95 # Value for the first percentile to track in the reports, the console summary and GraphiteDataWriter + #percentile2 = 99 # Value for the second percentile to track in the reports, the console summary and GraphiteDataWriter + } + } + http { + #elFileBodiesCacheMaxCapacity = 200 # Cache size for request body EL templates, set to 0 to disable + #rawFileBodiesCacheMaxCapacity = 200 # Cache size for request body Raw templates, set to 0 to disable + #fetchedCssCacheMaxCapacity = 200 # Cache size for CSS parsed content, set to 0 to disable + #fetchedHtmlCacheMaxCapacity = 200 # Cache size for HTML parsed content, set to 0 to disable + #redirectPerUserCacheMaxCapacity = 200 # Per virtual user cache size for permanent redirects, set to 0 to disable + #expirePerUserCacheMaxCapacity = 200 # Per virtual user cache size for permanent 'Expire' headers, set to 0 to disable + #lastModifiedPerUserCacheMaxCapacity = 200 # Per virtual user cache size for permanent 'Last-Modified' headers, set to 0 to disable + #etagPerUserCacheMaxCapacity = 200 # Per virtual user cache size for permanent ETag headers, set to 0 to disable + #warmUpUrl = "http://goo.gl/pq1Xwu" # The URL to use to warm-up the HTTP stack (blank means disabled) + ssl { + trustStore { + #type = "" # Type of SSLContext's TrustManagers store + #file = "" # Location of SSLContext's TrustManagers store + #password = "" # Password for SSLContext's TrustManagers store + #algorithm = "" # Algorithm used by SSLContext's TrustManagers store + } + keyStore { + #type = "" # Type of SSLContext's KeyManagers store + #file = "" # Location of SSLContext's KeyManagers store + #password = "" # Password for SSLContext's KeyManagers store + #algorithm = "" # Algorithm used SSLContext's KeyManagers store + } + } + ahc { + #allowPoolingConnections = true # Allow pooling HTTP connections (keep-alive header automatically added) + #allowPoolingSslConnections = true # Allow pooling HTTPS connections (keep-alive header automatically added) + #compressionEnforced = false # Enforce gzip/deflate when Accept-Encoding header is not defined + #connectTimeout = 60000 # Timeout when establishing a connection + #pooledConnectionIdleTimeout = 60000 # Timeout when a connection stays unused in the pool + #readTimeout = 60000 # Timeout when a used connection stays idle + #connectionTTL = -1 # Max duration a connection can stay open (-1 means no limit) + #ioThreadMultiplier = 2 # Number of Netty worker threads per core + #maxConnectionsPerHost = -1 # Max number of connections per host (-1 means no limit) + #maxConnections = -1 # Max number of connections (-1 means no limit) + #maxRetry = 0 # Number of times that a request should be tried again + #requestTimeout = 60000 # Timeout of the requests + #useProxyProperties = false # When set to true, supports standard Proxy System properties + #webSocketTimeout = 60000 # Timeout when a used websocket connection stays idle + #useRelativeURIsWithConnectProxies = true # When set to true, use relative URIs when talking with an SSL proxy or a WebSocket proxy + #acceptAnyCertificate = true # When set to true, doesn't validate SSL certificates + #httpClientCodecMaxInitialLineLength = 4096 # Maximum length of the initial line of the response (e.g. "HTTP/1.0 200 OK") + #httpClientCodecMaxHeaderSize = 8192 # Maximum size, in bytes, of each request's headers + #httpClientCodecMaxChunkSize = 8192 # Maximum length of the content or each chunk + #keepEncodingHeader = true # Don't drop Encoding response header after decoding + #webSocketMaxFrameSize = 10240 # Maximum frame payload size + } + } + data { + #writers = "console, file" # The lists of DataWriters to which Gatling write simulation data (currently supported : "console", "file", "graphite", "jdbc") + #reader = file # The DataReader used by the charting engine for reading simulation results + console { + #light = false # When set to true, displays a light version without detailed request stats + } + file { + #bufferSize = 8192 # FileDataWriter's internal data buffer size, in bytes + } + leak { + #noActivityTimeout = 30 # Period, in seconds, for which Gatling may have no activity before considering a leak may be happening + } + jdbc { + db { + #url = "jdbc:mysql://localhost:3306/temp" # The JDBC URL used by the JDBC DataWriter + #username = "root" # The database user used by the JDBC DataWriter + #password = "123123q" # The password for the specified user + } + #bufferSize = 20 # The size for each batch of SQL inserts to send to the database + create { + #createRunRecordTable = "CREATE TABLE IF NOT EXISTS `RunRecords` ( `id` INT NOT NULL AUTO_INCREMENT , `runDate` DATETIME NULL , `simulationId` VARCHAR(45) NULL , `runDescription` VARCHAR(45) NULL , PRIMARY KEY (`id`) )" + #createRequestRecordTable = "CREATE TABLE IF NOT EXISTS `RequestRecords` (`id` int(11) NOT NULL AUTO_INCREMENT, `runId` int DEFAULT NULL, `scenario` varchar(45) DEFAULT NULL, `userId` VARCHAR(20) NULL, `name` varchar(50) DEFAULT NULL, `requestStartDate` bigint DEFAULT NULL, `requestEndDate` bigint DEFAULT NULL, `responseStartDate` bigint DEFAULT NULL, `responseEndDate` bigint DEFAULT NULL, `status` varchar(2) DEFAULT NULL, `message` varchar(4500) DEFAULT NULL, `responseTime` bigint DEFAULT NULL, PRIMARY KEY (`id`) )" + #createScenarioRecordTable = "CREATE TABLE IF NOT EXISTS `ScenarioRecords` (`id` int(11) NOT NULL AUTO_INCREMENT, `runId` int DEFAULT NULL, `scenarioName` varchar(45) DEFAULT NULL, `userId` VARCHAR(20) NULL, `event` varchar(50) DEFAULT NULL, `startDate` bigint DEFAULT NULL, `endDate` bigint DEFAULT NULL, PRIMARY KEY (`id`) )" + #createGroupRecordTable = "CREATE TABLE IF NOT EXISTS `GroupRecords` (`id` int(11) NOT NULL AUTO_INCREMENT, `runId` int DEFAULT NULL, `scenarioName` varchar(45) DEFAULT NULL, `userId` VARCHAR(20) NULL, `entryDate` bigint DEFAULT NULL, `exitDate` bigint DEFAULT NULL, `status` varchar(2) DEFAULT NULL, PRIMARY KEY (`id`) )" + } + insert { + #insertRunRecord = "INSERT INTO RunRecords (runDate, simulationId, runDescription) VALUES (?,?,?)" + #insertRequestRecord = "INSERT INTO RequestRecords (runId, scenario, userId, name, requestStartDate, requestEndDate, responseStartDate, responseEndDate, status, message, responseTime) VALUES (?,?,?,?,?,?,?,?,?,?,?)" + #insertScenarioRecord = "INSERT INTO ScenarioRecords (runId, scenarioName, userId, event, startDate, endDate) VALUES (?,?,?,?,?,?)" + #insertGroupRecord = "INSERT INTO GroupRecords (runId, scenarioName, userId, entryDate, exitDate, status) VALUES (?,?,?,?,?,?)" + } + } + graphite { + #light = false # only send the all* stats + #host = "localhost" # The host where the Carbon server is located + #port = 2003 # The port to which the Carbon server listens to + #protocol = "tcp" # The protocol used to send data to Carbon (currently supported : "tcp", "udp") + #rootPathPrefix = "gatling" # The common prefix of all metrics sent to Graphite + #bufferSize = 8192 # GraphiteDataWriter's internal data buffer size, in bytes + } + } +} diff --git a/src/test/gatling/src/test/resources/logback-test.xml b/src/test/gatling/src/test/resources/logback-test.xml new file mode 100644 index 00000000000..de1b87aef2d --- /dev/null +++ b/src/test/gatling/src/test/resources/logback-test.xml @@ -0,0 +1,24 @@ + + + + + true + + + + + %d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx + false + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/gatling/src/test/resources/request-bodies/.gitkeep b/src/test/gatling/src/test/resources/request-bodies/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/test/gatling/src/test/scala/default/RecordedSimulation.scala b/src/test/gatling/src/test/scala/default/RecordedSimulation.scala new file mode 100644 index 00000000000..337c86bb705 --- /dev/null +++ b/src/test/gatling/src/test/scala/default/RecordedSimulation.scala @@ -0,0 +1,25 @@ +package default + +import io.gatling.core.Predef._ +import io.gatling.http.Predef._ +import scala.concurrent.duration._ + +class RecordedSimulation extends Simulation { + + val httpConf = http + .baseURL("###TOKEN_VALID_URL###") + .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") + .doNotTrackHeader("1") + .acceptLanguageHeader("en-US,en;q=0.5") + .acceptEncodingHeader("gzip, deflate") + .userAgentHeader("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0") + + val scn = scenario("RecordedSimulation") + .exec(http("request_1") + .get("/")) + .pause(7) + + setUp(scn.inject(rampUsers(100) over (10 seconds))) + .protocols(httpConf) + .assertions(global.responseTime.max.lessThan(###TOKEN_RESPONSE_TIME###)) +}