Testing RESTful CRUD Web Service with Gatling Tool

If you follow the right way of designing your web app, and choosed RESTful architecture, then it should be easy for you to test your appplication. By the REST style, you should implement CRUD operations for each entity in your application. What does it mean:

You should be able to Create,Read, Update, Delete(CRUD) your entities.
You should provide statuses for each operations. For example, for Create operation you should have 201 status in case of succesful operation.
You application must have good exception handling. For example, if you will make GET request for retrieving some entity called person with id - 1, and there will be no such record in your storage with this id, then you need to tell your user, that there is no such person, and set status to 404(Not found)
So, given that you will keep in mind all information above and will design your app with such instructions.

Now it’s time to write some tests. Which framework you should choose?

I choosed Gatling framework. Reasons:

It runs on jvm

It has maven module

Configuration

As I mentioned above, I will use maven for building my app.

So, I will create a separate module for running my integration tests.

Gatling integration module

with jar packaging

Setup you pom.xml like in below:

Scala IDE

To write tests with gatling, you need to have IDE with scala support.I choosed Scala ready IDE. You can download it here. After scala installation, Right click on project -> Configure - > Add Scala Nature.

Then create Source Folder in src/test/scala.

Now you are ready to write tests.

Creating first test

To have scalable structure, create a Scala class - org.lnu.is.integration.IntegrationTest.

This class will be entry point for all future tests.

Now let’s create integration test for person(just an example), note that it should be object, not a class - it’s a special singleton construction in scala.

Edit your IntegrationTest class

Adding resources

Note, that all data(json templates, etc..) are store in data folder

data/person/post.json:

data/person/put.json:

Describing scenario

The idea of scenario is:

Call POST method to create new person, get generated identifier.

Call GET method /persons/{identifier} and make sure that there is such record in the system and response has status 200(OK).

Call PUT method to update some columns.

Call GET method to make sure, that columns from above method are updated.

Call DELETE method

Call GET method and make sure, that status is 404(Not Found)

Generating custom values

There are cases, where you need to generate unique value for each request.

For example, some person identifier needs to be unique.

For solving such issue I use session configuration:

.exec(session => {
session
.set("idnum", UUID.randomUUID())}) and in json file I just make a placeholder: