A Gatling stress test plugin for MQTT
Scala
Latest commit 035f05c Dec 4, 2016 @mnogu committed on GitHub Merge pull request #6 from jeanadrien/gatling-2.2.x
[ Gatling 2.2 ] Update code base to be compliant with gatling v2.2

README.md

Gatling-MQTT

An unofficial Gatling stress test plugin for MQTT.

Usage

Cloning this repository

$ git clone https://github.com/mnogu/gatling-mqtt.git
$ cd gatling-mqtt

Creating a jar file

Install sbt 0.13 if you don't have. And create a jar file:

$ sbt assembly

If you want to change the version of Gatling used to create a jar file, change the following line in build.sbt:

"io.gatling" % "gatling-core" % "2.2.3" % "provided",

and run sbt assembly.

Putting the jar file to lib directory

Put the jar file to lib directory in Gatling:

$ cp target/scala-2.11/gatling-mqtt-assembly-*.jar /path/to/gatling-charts-highcharts-bundle-2.2.*/lib

Creating a simulation file

$ cp gatling-mqtt/src/test/scala/com/github/mnogu/gatling/mqtt/test/MqttSimulation.scala /path/to/gatling-charts-highcharts-bundle-2.2.*/user-files/simulations
$ cd /path/to/gatling-charts-highcharts-bundle-2.2.*
$ vi user-files/simulations/MqttSimulation.scala

This plugin supports the following options:

  • host
  • clientId
  • cleanSession
  • keepAlive
  • userName
  • password
  • willTopic
  • willMessage
  • willQos
  • willRetain
  • version
  • connectAttemptsMax
  • reconnectAttemptsMax
  • reconnectDelay
  • reconnectDelayMax
  • reconnectBackOffMultiplier
  • receiveBufferSize
  • sendBufferSize
  • trafficClass
  • maxReadRate
  • maxWriteRate

See the document of mqtt-client for the description of these options. For example, the host option corresponds setHost() method in mqtt-client. That is, you can obtain an option name in this plugin by removing set from a method name in mqtt-client and then making the first character lowercase.

The following options also support Expression:

  • host
  • clientId
  • userName
  • password
  • willTopic
  • willMessage
  • version

Here is a sample simulation file:

import io.gatling.core.Predef._
import org.fusesource.mqtt.client.QoS
import scala.concurrent.duration._

import com.github.mnogu.gatling.mqtt.Predef._

class MqttSimulation extends Simulation {
  val mqttConf = mqtt
    // MQTT broker
    .host("tcp://localhost:1883")

  val scn = scenario("MQTT Test")
    .exec(mqtt("request")
      // topic: "foo"
      // payload: "Hello"
      // QoS: AT_LEAST_ONCE
      // retain: false
      .publish("foo", "Hello", QoS.AT_LEAST_ONCE, retain = false))

  setUp(
    scn
      .inject(constantUsersPerSec(10) during(90 seconds)))
    .protocols(mqttConf)
}

The following parameters of publish() support Expression:

  • topic
  • payload

Here is a bit complex sample simulation file:

import io.gatling.core.Predef._
import org.fusesource.mqtt.client.QoS
import scala.concurrent.duration._

import com.github.mnogu.gatling.mqtt.Predef._

class MqttSimulation extends Simulation {
  val mqttConf = mqtt
    .host("tcp://localhost:1883")
    // clientId: the values of "client" column in mqtt.csv
    //
    // See below for mqtt.csv.
    .clientId("${client}")

  val scn = scenario("MQTT Test")
    // The content of mqtt.csv would be like this:
    //
    //   client,topic,payload
    //   clientId1,topic1,payload1
    //   clientId2,topic2,payload2
    //   ...
    .feed(csv("mqtt.csv").circular)
    .exec(mqtt("request")
      // topic: the values of "topic" column in mqtt.csv
      // payload: the values of "payload" column in mqtt.csv
      // QoS: AT_LEAST_ONCE
      // retain: false
      .publish("${topic}", "${payload}", QoS.AT_LEAST_ONCE, retain = false))

  setUp(
    scn
      .inject(constantUsersPerSec(10) during(90 seconds)))
    .protocols(mqttConf)
}

Running a stress test

After starting an MQTT broker, run a stress test:

$ bin/gatling.sh

License

Apache License, Version 2.0