Trailer Download Video Trailer: webm or MP4 About. Play as Poncho Pat the meanest outlaw in the west. Shoot down other outlaws with his mini gun. You can ride Poncho Pat's horse while you blast baddies as well. To deal with the massive duplication of data, and get the download size to a more reasonable 54.5MB, we had to use 7zip compression. If you don't already have it, you can download 7zip for Windows or use Keka for Mac OS X. (The Unarchiver for Mac does not correctly decompress this 7zip file.) Download Half-Life 2 Alyx Mod: Version 2.
iPad Pro
Supercharged by the Apple M1 chip.
iPhone 12
Purple. Now in season.
From $29.12/mo. for 24 mo. or $699 before trade‑in1
Buy directly from Apple with special carrier offers
iMac
Say hello.
Apple Watch Series 6
The future of health is on your wrist.
AirTag
Lose your knack for losing things.
Fill Mom's day with color.
Get 2-hour delivery on select Mother's Day gifts for $9.2 Or pick up at the Apple Store.
Apple Arcade
Wonderbox: The Adventure Maker. Play now.
Apple TV 4k
A higher definition of TV.
Apple TV Plus
The Mosquito Coast
At Million Victories, we have reached a point where we want our game to be put under heavy stress, to test its resistance to a high load of user calls. There are many tools providing such features : we chose Gatling, a popular open source framework for load testing. Our targets here are the REST API endpoints of Million Lords.
Gatling gathers 3 different tools :
- a recorder, acting like a proxy between a client and a server to record requests in-between, and generate the corresponding scenario;
- a gatling, a heavy machine gun to tear apart your server, replaying the scenario a LOT of times;
- a reporting tool, outputing nice graphs on response times and on how your app died.
We will not be using the recorder, since we want to make a custom scenario to try and understand the guts of the machine gun. It can however be incredibly helpful to output a scenario in a matter of minutes.
Gatling was created in order to write tests in the Scala programming language (a functionnal and refined version of Java). It requires a JVM, and is quite hard to learn, but can also grow very powerful.
Writing a scenario to fuel your machine gun
One pro of Gatling is the pretty straight forward way of creating a scenario. Even if you don't know a lot about Scala, you can still build a quite robust scenario. The current scenario will send both GET and POST requests, feeding them with different parameters each time it is run, and reusing the answers provided by the server.
The skeleton of the scenario will be as follow :
- create a player;
- get its basic settings (gold, main city);
- navigate on the map, load new tiles;
- launch an attack;
- get the new state of the player;
- level up its main city.
Initializing the artillery
Gatling provides predefined classes that you can just extend to build your scenario. A basic start would be :
Let's analyze this chunk of code. First we import the common packages to get the tools to build the scenario. We then create our class extending the Gatling Simulation class.
We now have two objects to build : httpConf is to configure the global parameters of the scenario. Drowning (itch) mac os. It sets up things like the URL of our api, the common headers, some custom headers as well. Those headers will be used in each following request.
The second object to define is the scenario scn. In this example this scenario does nothing, except being named 'Million Lords Crashtest'.
Ultimately, we load our gun with those two objects and get ready to fire : the last line injects a scenario with the given configuration to be played 100 times over 10 seconds.
Let's now build some ammunition to make it even deadlier.
Building requests
iPhone 12
Purple. Now in season.
From $29.12/mo. for 24 mo. or $699 before trade‑in1
Buy directly from Apple with special carrier offers
iMac
Say hello.
Apple Watch Series 6
The future of health is on your wrist.
AirTag
Lose your knack for losing things.
Fill Mom's day with color.
Get 2-hour delivery on select Mother's Day gifts for $9.2 Or pick up at the Apple Store.
Apple Arcade
Wonderbox: The Adventure Maker. Play now.
Apple TV 4k
A higher definition of TV.
Apple TV Plus
The Mosquito Coast
At Million Victories, we have reached a point where we want our game to be put under heavy stress, to test its resistance to a high load of user calls. There are many tools providing such features : we chose Gatling, a popular open source framework for load testing. Our targets here are the REST API endpoints of Million Lords.
Gatling gathers 3 different tools :
- a recorder, acting like a proxy between a client and a server to record requests in-between, and generate the corresponding scenario;
- a gatling, a heavy machine gun to tear apart your server, replaying the scenario a LOT of times;
- a reporting tool, outputing nice graphs on response times and on how your app died.
We will not be using the recorder, since we want to make a custom scenario to try and understand the guts of the machine gun. It can however be incredibly helpful to output a scenario in a matter of minutes.
Gatling was created in order to write tests in the Scala programming language (a functionnal and refined version of Java). It requires a JVM, and is quite hard to learn, but can also grow very powerful.
Writing a scenario to fuel your machine gun
One pro of Gatling is the pretty straight forward way of creating a scenario. Even if you don't know a lot about Scala, you can still build a quite robust scenario. The current scenario will send both GET and POST requests, feeding them with different parameters each time it is run, and reusing the answers provided by the server.
The skeleton of the scenario will be as follow :
- create a player;
- get its basic settings (gold, main city);
- navigate on the map, load new tiles;
- launch an attack;
- get the new state of the player;
- level up its main city.
Initializing the artillery
Gatling provides predefined classes that you can just extend to build your scenario. A basic start would be :
Let's analyze this chunk of code. First we import the common packages to get the tools to build the scenario. We then create our class extending the Gatling Simulation class.
We now have two objects to build : httpConf is to configure the global parameters of the scenario. Drowning (itch) mac os. It sets up things like the URL of our api, the common headers, some custom headers as well. Those headers will be used in each following request.
The second object to define is the scenario scn. In this example this scenario does nothing, except being named 'Million Lords Crashtest'.
Ultimately, we load our gun with those two objects and get ready to fire : the last line injects a scenario with the given configuration to be played 100 times over 10 seconds.
Let's now build some ammunition to make it even deadlier.
Building requests
The process of writing requests is straight forward. For the first request, we initialize a 'feeder' that will feed different values to each play of the scenario. In our case the feeder take its values from a huge list (over 400k) of english words to generate random usernames. My favorite murder: the game mac os.
This first request is a basic GET. Note the pause preceding the call: Galting waits 3 seconds before the request, this way, you can set the pace of the scenario to better simulate a real use case.
Let's now create a new user: we will check if the username is available before creating it.
Pauses can be set in milliseconds as well.
We first build a POST request with a custom header and a custom form parameter. The syntax '${username}' comes from the feeder, because we named the only column of our csv 'username'. This username will be the same during the whole process.
An assert method can be used to check if the the server is answering. However, Gatling have a default assert that will output the HTTP status against expected values.
Second is the creation of the player itself. This is another way of building a POST request. I prefer this one because it allows you to provide a custom body with anything you want. The triple quotes ensure everything is escaped, before being sent as JSON.
The interesting part now: we check the returned value from the server: we access JSON answer with XPath syntax.
Here, '$._id' means we are looking for a child whose key is '_id'. '$.c[0]' means we are looking for the first element of a list whose key is 'c'. We get those two values and then save them as 'idPlayer' and 'idCity'.
Now that's already some nice work done here. We can then reuse the defined objects for following requests:
The 'body' attribute allows any string you want. Here we are loading some new tiles based on coordinates :
Launching an attack follows the same structure (some parameters are omitted to make it more understandable):
Finally, leveling up the city is just another basic POST request, we provide idCity and the number of levels to add :
Now the job is to take all those requests, to mix them up until you have a heavy dirty scenario, the closest you can get to a real use case. Each play will slightly differ thanks to the initial feeder. Our machine gun is now ready to fire.
Results
Gatling outputs nice graphs to analyze in a quick look the choke points of your api. Here is a sample output :
I like the two scalable graphs showing requests and responses. Puzzle demo mac os. This is a good way to start to see where everything went wrong.
Cowboy With A Gatling Gun Mac Os 11
You can access the details of every request on the other tab, to see a precise analysis of its response time over the duration of the load testing.
To sum it up, Gatling is a powerful and beautiful way to break your app. Highly customizable, you can provide very detailed scenarii, to match real use cases and make sure your app is ready for its hour of glory.
Check out our other devlogs !
Gatling Gun Plans For Sale
Author : Florentin Vallée