Introduction

In this article, we will learn about the Test Automation tool Rest Assured library, which is based on Java.

What is Rest Assured?

Rest Assured is a Java-based open-source library that provides a domain-specific language (DSL) for writing automated tests for RESTful APIs. It simplifies the process of sending HTTP requests, verifying responses, and extracting data from API responses in a structured manner.

Advantages of using Rest assured

Pre-requisite

Step to create a Maven project

  1. Open the Eclipse IDE.
  2. Click File new-->Project---->Other--->Expand the maven folder--->select Maven Project
  3. Choose the desired location of the project, or you can set the default location of the project.
  4. Check the check box to create a simple project(skip archetype selection)
  5. If you do not check this check box, the Maven will ask you to select the archetype solution which you want to build.
  6. Click the next button.
  7. Provide the group Id and Artifact Id and click finish.
  8. A Maven project will be created. It will take a few minutes.

A pom.xml file will be generated, which contains all the metadata regarding the project.

We can add the dependencies and plugins needed for your maven project inside the pom.xml file.

Dependencies needed to be added in the pom.xml are.

Dependencies

<dependencies>
	  <!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured -->

<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>rest-assured</artifactId>
    <version>5.3.0</version>
    <scope>test</scope>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.testng/testng -->

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.7.1</version>
    <scope>test</scope>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest -->

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest</artifactId>
    <version>2.2</version>
    <scope>test</scope>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.20.0</version>
    <scope>test</scope>
</dependency>
	  
</dependencies>

You can also refer to my article if you have any doubts about setting up a Maven project.

First api automation test

As you know, we have different http methods for requests, in this article, we will learn how to hit a get http request using Rest Assured.

In Rest Assured, we can write API Automation tests in two ways

1. Using Request specification

First, we need to store the base URI,

RestAssured is a class inside that class. There is a static string called base URI which stores the base URI value.

Note. Create a package inside the src/test/java folder and then create a class inside the package and then start writing tests using TestNG annotations.

Next is providing the requested specification.

The variable httpRequest stores the request so that we can modify it if required, like adding authentication details, adding headers, etc

Using the httpRequest reference, we call the request type, whether it's get, post, put, delete, etc. This will return, hit the API, and gives the response, which we store in the response object.

@Test
public void getrequest() {
    // Specify the base URL to the RESTful web service 
    RestAssured.baseURI = "https://reqres.in/api/users/2";
    // Get the RequestSpecification of the request to be sent to the server. 
    RequestSpecification httpRequest = RestAssured.given();
    // specify the method type (GET) and the parameters if any. 
    //In this case the request does not take any parameters 
    Response response = httpRequest.request(Method.GET, "");
    // Print the status and message body of the response received from the server 
    System.out.println("Status received => " + response.getStatusLine());
    System.out.println("Response=>" + response.prettyPrint());

}

BDD Style of writing

First, we need to store the base URI,

RestAssured is a class inside that class. There is a static string called base URI which stores the base URI value.

Next, we need to use the pattern,

  1. Given: Here is the given section, all the preconditions for the http request should be provided, like request headers, path param, query param, authentication, etc.
  2. When: Here in the when section, we need to specify which http method we are going to call, whether it is get post put or delete. In this part, the actual api call will happen with the respective http method which you are providing.
  3. Then: Here in the then section, we get the response of the http request and then apply assertions.

Important note

import static io.restassured.RestAssured.*;

import static org.hamcrest.Matchers.*;

Code explained with comments

1. Get API Calls made and asserting using the hamcrest matchers library.

package com.apidemoautomation;

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
import org.testng.Assert;
import org.testng.annotations.Test;

public class Getapi {
	@Test
	public void getapi() {
		//Storing the base uri
        RestAssured.baseURI="https://reqres.in/api/users/2";
        //In one line you can see that we have made a get call and using the hamcrest matchers and asserting that the status code is 200. The log().all() will log all the response logs in the console.
        given().when().get().then().assertThat().statusCode(200).log().all();                      
	}	
}

2. Get API Calls made and asserting using the TestNG library.

package com.apidemoautomation;

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
import org.testng.Assert;
import org.testng.annotations.Test;

public class Getapi {
	@Test
	public void getapi() {
		//storing the base uri
        RestAssured.baseURI="https://reqres.in/api/users/2";
       
        //using the given then pattern and then i am extract the response using response method and storing in variable
        Response response = given().when().get().then()
                .extract().response();
         //using the assert class in the testng i am putting assertion
        Assert.assertEquals(200, response.statusCode());                
	}	
}

Post Request

In order to perform the post request, the code almost remains the same, except we need to call the post method instead of the get method, and since the post method takes the json payload, we need to specify it in the given section.

We need to specify the content type(JSON) as well in the given section.

code explained with comments

@Test
public void createsource() {
    //storing the base uri
    RestAssured.baseURI = "https://reqres.in/";
    //storing the json payload in the string
    String requestBody = "{\n" +
        "    \"email\": \"[email protected]\",\n" +
        "    \"password\": \"cityslicka\"\n" +
        "}";
    // See below we have called the post method in when section which accepts the endpoint as parameter and in the given section we need to provide the json payload in the body method
    Response res = given().contentType(ContentType.JSON).
    body(requestBody).
    when().
    post("api/login").
    then().log().all()
        .extract().
    response();
    //applying assertion on response code
    Assert.assertEquals(200, res.statusCode());
}

Put Request

In order to perform the put request, the code almost remains the same, except we need to call the put method instead of the get method, and since the put method takes the json payload, we need to specify it in the given section.

We need to specify the content type(JSON) as well in the given section.

code explained with comments

@Test
public void putrequest() {
    //storing the base uri
    RestAssured.baseURI = "https://reqres.in/";
    String payload = "{\n" +
        "    \"name\": \"morpheus\",\n" +
        "    \"job\": \"zion resident\"\n" +
        "}";
    /* See below we have called the put method in when section which accepts the endpoint as parameter and in the given section 
     * we need to provide the json payload in the body method
     */
    Response response = given()
        .contentType(ContentType.JSON)
        .body(payload)
        .when()
        .put("api/users/2")
        .then()
        .extract().response();
    //apply assertion on the response status code
    Assert.assertEquals(200, response.statusCode());
}

Delete Request

In order to perform the delete request, the code almost remains the same, except we need to call the delete method instead of the get method.

Code explained with comments

@Test
public void deleterequest() {

    //storing base uri
    RestAssured.baseURI = "https://reqres.in/api/users/2";

    /* See below we have called the delte method in when section
     * 
     */
    Response response = given()
        .when()
        .delete()
        .then()
        .extract().response();
    //apply assertion on the response status code
    Assert.assertEquals(204, response.statusCode());

}

Summary

I hope this article will be helpful in understanding how to set up a Rest assured project and write API automation tests using the rest assured library.

Thanks, Happy learning.