- Published on
Test an API with Karate: Part 4
- Authors
- Name
- Scottie Crump
- @linkedin/scottiecrump/
Photo by Marc Chong Seng on Unsplash
Overview
In the fourth part of the series, we will test the api/get-client
and api/update-client
routes and learn how to create feature files that accept dynamic data.
Testing the api/get-client Endpoint
We will verfiy that a GET request to api/get-client
with a user's id
returns a 200
status. We can create a feature file with the following:
Feature: Get Client
Background:
* def getClients = call read('get-clients.feature')
* def clientList = getClients.response.clients
* def getLastClient = clientList[clientList.length - 1]
Scenario: A user can get a single client
Given url baseUrl
And path 'get-client'
And param id = getLastClient.id
When method GET
Then status 200
We stored the last client in the variable getLastClient
via a call to api/clients
in the previous code, similar to what we did in Part 3. Inside the Scenario
, we used the Karate param keyword to pass an id
parameter equal to the id
of the object stored in getLastClient
. When we run the test, we receive a report indicating the test passed:
In the previous screenshot, we see that the test get-client.feature
passes as expected.
Testing the api/update-client Endpoint
For our next test, we will verify that a POST request to api/update-client
returns a 201
status and the message "(client) successfully updated". We will create a feature file with the following:
Feature: Update Client
Background:
* def getClients = call read('get-clients.feature')
* def clientList = getClients.response.clients
* def getLastClient = clientList[clientList.length - 1]
* def newEmail = fakeUser.email
Scenario: A user can update client data
Given url baseUrl
And path 'update-client'
And getLastClient.email = newEmail
And request getLastClient
When method POST
Then status 201
And response.message == getLastClient.name + " successfully updated"
And path 'get-client'
And param id = getLastClient.id
When method GET
Then response.email == newEmail
In the previous code, inside Background
, we created variables similar to the last test in this blog. In addition, we created a newEmail
variable and set it equal to the email
property of our fakeUser
data generator. We will use this variable to update the email
property of the getLastClient
data object. Inside the Scenario
, we make a POST request to update-client
with the email
from getLastClient
updated to our new email
value. Once the request is made, we assert that the response
status
and message
values are correct.
Finally, we make a GET request to get-client
using the id
and access the response body to verify that the email
property is equal to the value used to update the client data object. When we run the test, we receive a report indicating the test passed:
In the previous screenshot, we see that the test update-client.feature
passes.
Another Option to Test api/update-client
Notice in the previous test that we explicitly called get-client
to verify the email
property was updated as expected. We could have cleaned up our code a bit by changing the way the "get-client" feature file accepts an id
and using the call and read actions to make the request and receive the response
in the "update-client" feature file. To illustrate, first, we will modify the "Get Client" feature file to the following:
Feature: Get Client
Background:
* def getClients = call read('get-clients.feature')
* def clientList = getClients.response.clients
* def getLastClient = clientList[clientList.length - 1]
Scenario: A user can get a single client
Given url baseUrl
And path 'get-client'
And params {id: #(id)}
When method GET
Then status 200
In the previous code, we updated param to "params" and passed in an object representing the query id
and associated value to use in the request. The Karate params allow us to pass multiple query parameters to a request, including dynamic query parameters. Next, we will modify the "Update Client" feature:
Feature: Update Client
Background:
* def getClients = call read('get-clients.feature')
* def clientList = getClients.response.clients
* def getLastClient = clientList[clientList.length - 1]
* def newEmail = fakeUser.email
Scenario: A user can update client data
Given url baseUrl
And path 'update-client'
And getLastClient.email = newEmail
And request getLastClient
When method POST
Then status 201
And response.message == getLastClient.name + " successfully updated"
* def id = getLastClient.id
And call read('get-client.feature') {id: #(id)}
Then response.email == newEmail
In the previous code, first, we created an id
variable set to the id
of the getLastClient
client object. Then we run the "Get Client" feature and pass in a dynamic id
parameter for the feature to consume. When we run the test, we receive a report indicating the test passed:
In the previous screenshot, we see that the test update-client.feature
continues to pass. Essentially, we updated the feature to chain multiple API tests including "Get Clients", "Update Client" and "Get Client".
Part 4 Review
In review, we tested the api/get-client
and api/update-client
routes. We also learned how to create dynamic feature files by passing data to feature files.
Next, we will learn how to test the DELETE api/delete-client
route.