How to test PUT Request using Rest Assured

HOME

In the last tutorial, I explained How to test POST Request using Rest Assured. In this tutorial, I will automate a PUT Request using Rest Assured. I will verify the status code, line of Status, and content of the Response.

To set up a basic Rest Assured Maven Project, click here and Gradle project, click here.

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.1</version>
      <scope>test</scope>
</dependency>
  
<dependency>
      <groupId>io.rest-assured</groupId>
      <artifactId>rest-assured</artifactId>
      <version>5.3.2</version>
      <scope>test</scope>
</dependency>

What is the PUT Method?

The HTTP PUT API is primarily used to update existing resources. If the resource does not exist, then API may decide to create a new resource or not (Depending on API development). If a new resource has been created by the PUT API, the origin server MUST inform the user agent via the HTTP response code 201 (Created) response, and if an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to indicate successful completion of the request. To learn more about Rest API, please click here.

Below are the steps to test a PUT Request using Rest Assured:

The steps to test the PUT request are similar to the POST request. The only difference is that in POST we send a request to create a new resource, whereas here we have a resource and I will update the detail of the already existing resource. To know about the steps and various imports used in the below example, please refer to the tutorial for POST Request.

Below is the response received for Employee with id 2.

I want to change the employee_salary to 99999. Below is the example for the test to update employee_salary.

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import io.restassured.response.ValidatableResponse;
import io.restassured.specification.RequestSpecification;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.equalTo;

public class PUT_NonBDDDemo {

    RequestSpecification requestSpecification;
    Response response;
    ValidatableResponse validatableResponse;

    @Test
    public void updateUser() {

        String jsonString = "{\"id\": 2,\r\n"
                + "        \"employee_name\": \"Garrett Winters\",\r\n"
                + "        \"employee_salary\": 99999,\r\n"
                + "        \"employee_age\": 63,\r\n"
                + "        \"profile_image\": \"\"}";

        RestAssured.baseURI = "https://dummy.restapiexample.com/api/v1/update/2";

        // Create a request specification
        requestSpecification = RestAssured.given();

        // Setting content type to specify format in which request payload will be sent.
        requestSpecification.contentType(ContentType.JSON);

        // Adding body as string
        requestSpecification.body(jsonString);

        // Calling PUT method
        response = requestSpecification.put();

        // Let's print response body.
        String responseString = response.prettyPrint();

        /*
         * To perform validation on response, we need to get ValidatableResponse type of
         * response
         */
        validatableResponse = response.then();

        // Get status code
        validatableResponse.statusCode(200);

        // It will check if status line is as expected
        validatableResponse.statusLine("HTTP/1.1 200 OK");

        // Check response - name attribute
        validatableResponse.body("data.employee_salary", equalTo(99999));

        // Check response - message attribute
        validatableResponse.body("message", equalTo("Successfully! Record has been updated."));

    }
}

Now, let us convert the same test into BDD format. In the below example, in the first part, we have retrieved the details of the employee with ID 2, and in the second part, we have updated the value of employee_salary to 99999.

import io.restassured.http.ContentType;
import io.restassured.response.Response;
import io.restassured.response.ValidatableResponse;
import io.restassured.specification.RequestSpecification;
import org.junit.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.equalTo;

public class PUT_BDDDemo {

    RequestSpecification requestSpecification;
    Response response;
    ValidatableResponse validatableResponse, validatableResponse1;

    @Test
    public void updateUser() {

        // To get the detail of employee with id 2
        validatableResponse = given()
                .baseUri("https://dummy.restapiexample.com/api/v1/employee/2")
                .contentType(ContentType.JSON)
                .when()
                .get()
                .then()
                .assertThat().statusCode(200);

        System.out.println("Response1 :" + validatableResponse.extract().asPrettyString());

        String jsonString = "{\"id\": 2,\r\n"
                + "        \"employee_name\": \"Garrett Winters\",\r\n"
                + "        \"employee_salary\": 99999,\r\n"
                + "        \"employee_age\": 63,\r\n"
                + "        \"profile_image\": \"\"}";

        // Update employee_salary
        validatableResponse1 = given()
                .baseUri("https://dummy.restapiexample.com/api/v1/update/2")
                .contentType(ContentType.JSON)
                .body(jsonString)
                .when()
                .put()
                .then()
                .assertThat().statusCode(200)
                .body("data.employee_salary", equalTo(99999))
                .body("message", equalTo("Successfully! Record has been updated."));

        System.out.println("Response2 :" + validatableResponse1.extract().asPrettyString());

    }

}

Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!! Cheers!!

How to test SOAP Services using Rest Assured

HOME

In this tutorial, I will test a SOAP Service using Rest Assured. I will verify the status code, line of Status, and content of the Response. To set up a basic Rest Assured Maven Project, click here and Gradle project, click here.

Add the below-mentioned dependencies to the pom.xml.

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.1</version>
      <scope>test</scope>
</dependency>
 
<dependency>
      <groupId>io.rest-assured</groupId>
      <artifactId>rest-assured</artifactId>
      <version>5.3.2</version>
      <scope>test</scope>
</dependency>

What is the SOAP WebService?

SOAP is an XML-based protocol for accessing web services over HTTP. It has some specifications that could be used across all applications.

Implementation Steps:

Step 2 – Specify the base URL to the RESTful web service using the RestAssured class.

RestAssured.baseURI = "http://www.dneonline.com";

Step 3  The response to a request made by REST Assured.

  Response response = given()

Response is imported from package:

import io.restassured.response.Response;

Step 4 – Set the content type to specify the format in which the request payload will be sent to the server. Here, the Content-Type is “text/xml; charset=utf-8”.

 .header("Content-Type", "text/xml; charset=utf-8")

Step 5 Pass Request Body.

   .body(requestBody)
 requestBody = new File(getClass().getClassLoader().getResource("Number.xml").getFile());

Step 6 – Send the POST request to the server and receive the response of the request made by REST Assured. This response contains every detail returned by hitting request i.e. response body, response headers, status code, status lines, cookies, etc. The response is imported from package:

import io.restassured.response.Response;

Step 7 – To validate a response like status code or value, we have used the below code

 Assert.assertEquals(200, response.statusCode());
Assert.assertEquals(13, result);

PrettyPrint() – It prints the response body if possible and returns it as a string. Pretty printing is possible for content types JSON, XML, and HTML.

System.out.println(response.prettyPrint());

Below is an example of testing a SOAP Web Service request using the Rest Assured.

import io.restassured.response.Response;
import org.junit.Assert;
import org.junit.Test;
import java.io.File;
import static io.restassured.RestAssured.given;

public class RestAssured_SOAPDemo {

    File requestBody;
    Response response;

    @Test
    public void test() {

        requestBody = new File(getClass().getClassLoader().getResource("Number.xml").getFile());
        response = given()
                .baseUri("http://www.dneonline.com")
                .basePath("/calculator.asmx")
                .header("Content-Type", "text/xml; charset=utf-8")
                .body(requestBody)
                .post();

        System.out.println(response.prettyPrint());

        var xPathResult = response.xmlPath().get("//SubtractResult/text()");
        var result = Integer.parseInt(String.valueOf(xPathResult));

        System.out.println("xPathResult :" + xPathResult);
        System.out.println("result :" + result);

        Assert.assertEquals(200, response.statusCode());
        Assert.assertEquals(13, result);
    }

}

The below image shows the test result of the above test.

Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!! Cheers!!

Assertion of JSON in Rest Assured using Hamcrest

Last Updated On

HOME

In this tutorial, we will discuss various types of Assertions present in Hamcrest that are used in Rest Assured.

Table Of Contents

What is Assertion?

An assertion is a way to verify that the expected result and the actual result match or not in the test case.  A test is considered successful ONLY if it is completed without throwing any exceptions. If the current value and the expected value match then the assertion passes and when the assertion passes nothing happens. But when an assertion fails, it will fail the test case.

There are various ways to perform assertions in API Testing. For API Testing, we are using Rest Assured, which uses either Hamcrest or JUnit assertions. We are going to discuss Hamcrest Assertions here.

What is Hamcrest?

Hamcrest is a framework for writing matcher objects, allowing ‘match’ rules to be defined declaratively. We do not need to add Hamcrest dependency explicitly as the Rest-Assured 4.3.3 version includes itself. To learn more about Hamcrest, please refer to this link.

We need to add the below dependency to use Hamcrest in the project. Please use the latest version from here

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest</artifactId>
    <version>3.0</version>
    <scope>test</scope>
</dependency>

To run all the scenarios mentioned below, please add the below-mentioned dependencies to the POM.xml.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>RestAssured_TestNG_Demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <hamcrest.version>3.0</hamcrest.version>
        <testng.version>7.8.0</testng.version>
        <rest-assured.version>5.3.2</rest-assured.version>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

     <!-- Hamcrest Dependency -->
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest</artifactId>
        <version>${hamcrest.version}</version>
        <scope>test</scope>
    </dependency>

    <!-- TestNG Dependency -->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>${testng.version}</version>
    </dependency>

    <!-- Rest Assured -->
    <dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <version>${rest-assured.version}</version>
        <scope>test</scope>
    </dependency>

    </dependencies>
</project>

Below is an example of a JSON Response. I will perform various assertions on this JSON Response.

To use hamcrest assertion, please import the Matchers class, static member.

  1. equalTo – It checks whether the retrieved number from the response is equal to the expected number.
  2. greaterThan – checks extracted number is greater than the expected number.
  3. greaterThanOrEqualTo – checks whether the extracted number is greater than equal to the expected number.
  4. lessThan – It checks whether the retrieved number from the response is lesser than the expected number.
  5. lessThanOrEqualTo – It checks whether the retrieved number from the response is lesser than or equal to the expected number.

Below assertions are imported from the package shown below:-

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.hamcrest.Matchers.lessThan;

Below are examples to show the use of number-related assertions.

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.testng.annotations.Test;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.hamcrest.Matchers.lessThan;

public class HamcrestNumberExample {

    public String endpoint = "https://restful-booker.herokuapp.com/booking/1";

    @Test
    public void numberAssertions() {
        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint).then()
                .body("totalprice", equalTo(164));

        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("totalprice",greaterThan(100));

        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("totalprice",greaterThanOrEqualTo(50));

        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("totalprice",lessThan(1000));

        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("totalprice",lessThanOrEqualTo(1000));

    }

}

The output of the above program is

  1. equalTo – It checks whether the extracted string from JSON is equal to the expected string.
  2. equalToIgnoringCaseIt checks if the extracted string from JSON matches the expected string. The comparison does not consider case (small or capital).
  3. equalToIgnoringWhiteSpace – It checks if the extracted string from JSON matches the expected string. It takes into account the white spaces.
  4. containsString – It checks whether the extracted string from JSON contains the expected string as a substring.
  5. startsWith It checks whether the extracted string from JSON is starting with a given string or character.
  6. endsWithIt checks whether the extracted string from JSON is ending with a given string or character.

Below assertions are imported from the package shown below:-

import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.equalToIgnoringCase;
import static org.hamcrest.Matchers.startsWith;
import static org.hamcrest.Matchers.equalToIgnoringWhiteSpace;

Below are examples to show the use of string-related assertions.

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.testng.annotations.Test;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.equalToIgnoringCase;
import static org.hamcrest.Matchers.startsWith;
import static org.hamcrest.Matchers.equalToIgnoringWhiteSpace;

public class HamcrestStringAssertions {

    public String endpoint = "https://restful-booker.herokuapp.com/booking/1";

    @Test
    public void stringAssertions() {
        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("firstname",equalTo("Mary"));

        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("firstname",equalToIgnoringCase("mary"));

        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("firstname",containsString("Mary"));

        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("firstname",startsWith("M"));

        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("firstname",endsWith("y"));

        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("firstname",equalToIgnoringWhiteSpace("   Mary "));


    }
}

The output of the above program is

nullValue

It checks whether the extracted response from JSON is NULL or Not.

Below assertions are imported from the package shown below:-

import static org.hamcrest.Matchers.hasKey;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;

Below are examples to show the use of collection-related assertions.

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.testng.annotations.Test;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;

public class HamcrestNullAssertion {
    
   public String endpoint = "https://restful-booker.herokuapp.com/booking/1";

    @Test
    public void nullAssertion() {
        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("totalprice1", is(nullValue()));
    }
}

The output of the above program is

hasKey

It checks whether the extracted map has an expected key.

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.testng.annotations.Test;
import static org.hamcrest.Matchers.hasKey;

public class HamcrestHasKeyAssertion {
    
    public String endpoint = "https://restful-booker.herokuapp.com/booking/1";

    @Test
    public void collectionAssertions() {

        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("bookingdates",hasKey("checkin"));

    }
}

The output of the above program is

Not Assertion

The not assertion inverts the meaning of the other assertions. For example, if you want to perform negative assertions, then we can use any assertions with NOT.

The below assertion is imported from the package shown below:-

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.not;

Below are examples to show the use of negative assertions.

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.not;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.testng.annotations.Test;

public class HamcrestNotAssertion {
    
    public String endpoint = "https://restful-booker.herokuapp.com/booking/1";

    @Test
    public void negativeAssertions() {
        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint)
                .then().body("totalprice",not(equalTo(874)));

    }
}

The output of the above program is

Multiple Assert Statements

In the below example, all 3 assertions will fail. It will only execute the first assertion. If the first assertion fails, then other assertions will not be executed.

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.testng.annotations.Test;
import static org.hamcrest.Matchers.equalTo;

public class HamcrestMultipleAssertions {

    public String endpoint = "https://restful-booker.herokuapp.com/booking/1";
    
    @Test
    public void test1() {
        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint).then()
                .body("firstname", equalTo("Jim"), // will fail
                        "lastname", equalTo("Smith"), // will fail
                        "totalprice", equalTo(314)); // will fail
    }

}

The output of the above program is

To execute all the assertions in the test case, combine them into a single body. This should be done just like it is shown below. You can see that all the assertions failed, and they are shown in the response.

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.testng.annotations.Test;
import static org.hamcrest.Matchers.equalTo;

public class HamcrestMultipleAssertions {

    public String endpoint = "https://restful-booker.herokuapp.com/booking/1";
    
    @Test
    public void test1() {
        RestAssured.given().contentType(ContentType.JSON)
                .when().get(endpoint).then()
                .body("firstname", equalTo("Jim"), // will fail
                        "lastname", equalTo("Smith"), // will fail
                        "totalprice", equalTo(314)); // will fail
    }

}

The output of the above program is

I have tried to show the use of a few of the most commonly used assertion methods. There are many more methods available in Hamcrest package. To know about other methods, write import static org.hamcrest.Matchers and add (.) at the end, it will show the list of all the methods available in Hamcrest.

To know more details related to Hamcrest assertion, you can refer the official website – Hamcrest

We are done! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!

How to test POST JSON Object request using Java Map in Rest Assured
How to create JSON Array Request Body
Extraction from JSON in Rest Assured
How To Send A JSON/XML File As Payload To Request using Rest Assured
Logging in Rest Assured

How to test POST Request using Rest Assured

HOME

In the last tutorial, I explained How to test GET Request using Rest Assured. In this tutorial, I will automate a POST Request using Rest Assured. I will verify the status code, line of Status, and content of the Response. To set up a basic Rest Assured Maven Project, click here and Gradle project, click here.

Add the below-mentioned dependencies to the pom.xml. The latest dependency can be downloaded from here.

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
</dependency>
 
<dependency>
      <groupId>io.rest-assured</groupId>
      <artifactId>rest-assured</artifactId>
      <version>5.5.1</version>
      <scope>test</scope>
</dependency>

What is the POST Method?

An HTTP POST method is used to create a new resource in the collection of resources. The request body is passed as a JSON/XML or in a different format. If a resource is created successfully by the endpoint or server, it returns a status code 201(Created). It also provides a Location header with a link to the newly-created resource with the 201 HTTP status. It may return 200 (OK) and 204 (No Content) status code as well, based on how the API is developed.

POST is neither safe nor idempotent. It is therefore recommended for non-idempotent resource requests. Making two identical POST requests will most result in two resources containing the same information.

Below are the steps to test a POST Request using Rest Assured:

Step 1 Specify the base URL to the RESTful web service using the RestAssured class.

RestAssured.baseURI = "https://dummy.restapiexample.com/api/v1/create";

Step 2  Every Request in the Rest-Assured library is represented by an interface called RequestSpecification. This interface allows modifying the request, like adding headers or adding authentication details. Use the RestAssured class to generate a RequestSpecification.

requestSpecification = RestAssured.given();

RequestSpecification is imported from package:

import io.restassured.specification.RequestSpecification;

Step 3 – Set the content type. This step specifies the format in which the request payload will be sent to the server. Here, the Content-Type is JSON.

requestSpecification.contentType(ContentType.JSON);

contentType is imported from restassured.http package:

import io.restassured.http.ContentType;

Step 4 Pass Request Body as String.

requestSpecification.body(jsonString);

Step 5 – Send the POST request to the server. Then receive the response of the request made by REST Assured. This response contains every detail returned by hitting request i.e. response body, response headers, status code, status lines, cookies, etc. The response is imported from package:

import io.restassured.response.Response;

Step 6 To validate a response like status code or value, we need to get the reference of type ValidatableResponse

ValidatableResponse is an interface. A validatable response to a request made by, REST Assured. ValidatableResponse is imported from package:

import io.restassured.response.ValidatableResponse;

PrettyPrint() – It prints the response body if possible and returns it as a string. Pretty printing is possible for content-types JSON, XML, and HTML.

Below is the example of testing a POST request in Non-BDD format. I have used ValidatableResponse for the assertion of status. It is also used for the status line and body of the Response.

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import io.restassured.response.ValidatableResponse;
import io.restassured.specification.RequestSpecification;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.equalTo;

public class POST_NonBDDDemo {

    RequestSpecification requestSpecification;
    Response response;
    ValidatableResponse validatableResponse;

    @Test
    public void verifyStatusCode() {

        String jsonString = "{\"name\":\"newapitest\",\"salary\":\"4000\",\"age\":\"29\"}";

        RestAssured.baseURI = "https://dummy.restapiexample.com/api/v1/create";

        // Create a request specification
        requestSpecification = RestAssured.given();

        // Setting content type to specify format in which request payload will be sent.
        requestSpecification.contentType(ContentType.JSON);

        // Adding body as string
        requestSpecification.body(jsonString);

        // Calling POST method
        response = requestSpecification.post();

        // Let's print response body.
        String responseString = response.prettyPrint();

        /*
         * To perform validation on response, we need to get ValidatableResponse type of
         * response
         */
        validatableResponse = response.then();

        // Check status code
        validatableResponse.statusCode(200);

        // It will check if status line is as expected
        validatableResponse.statusLine("HTTP/1.1 200 OK");

        // Check response body - name attribute
        validatableResponse.body("data.name", equalTo("newapitest"));

        // Check response body - message attribute
        validatableResponse.body("message", equalTo("Successfully! Record has been added."));

    }
}

The below image shows the test result of the above test.

Test implemented in BDD Format

import static org.hamcrest.Matchers.equalTo;

2. given is a static import from package:

import static io.restassured.RestAssured.given;

Below is an example of a BDD Test.

import io.restassured.http.ContentType;
import io.restassured.response.ValidatableResponse;
import org.junit.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.equalTo;

public class POST_BDDDemo {
    
    ValidatableResponse validatableResponse;

    @Test
    public void createUser() {

        String json = "{\"name\":\"apitest\",\"salary\":\"5000\",\"age\":\"30\"}";

        // GIVEN
        validatableResponse = given()
                .baseUri("https://dummy.restapiexample.com/api")
                .contentType(ContentType.JSON)
                .body(json)

                // WHEN
                .when()
                .post("/v1/create")

                // THEN
                .then()
                .assertThat().statusCode(200).body("data.name", equalTo("apitest"))
                .body("message", equalTo("Successfully! Record has been added."));

        System.out.println("Response :" + validatableResponse.extract().asPrettyString());
    }

}

The below image shows the test result of the above test.

String json = "{\"name\":\"apitest\",\"salary\":\"5000\",\"age\":\"30\"}";

.baseUri("https://dummy.restapiexample.com/api")
.contentType(ContentType.JSON)
.body(json)

".assertThat().statusCode(200)"
.body("data.name", equalTo("apitest"))
.body("message", equalTo("Successfully! Record has been added."))

The above tests can be used in both Maven and Gradle projects.

Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!! Cheers!!

How to test GET Request using Rest Assured

HOME

In the last tutorial, I explained the Setup of the REST Assured Maven Project In Eclipse IDE. In this tutorial, I will automate a GET Request. I will verify the status code, line of Status, and content of the Response.

RestAssured is a class that consists of many static fields and methods. It supports POST, GET, PUT, DELETE, HEAD, PATCH, and OPTIONS requests and verifies the response to these requests.

 <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
</dependency>

<dependency>
      <groupId>io.rest-assured</groupId>
      <artifactId>rest-assured</artifactId>
      <version>5.5.5</version>
      <scope>test</scope>
</dependency>

Below are the steps to test a GET Request using Rest Assured:

Step 1 Specify the base URL to the RESTful web service using the RestAssured class.

RestAssured.baseURI = "http://dummy.restapiexample.com/api/v1/employees";

Step 2 Every Request in the Rest-Assured library is represented by an interface called RequestSpecification. This interface allows modification of the request, like adding headers or adding authentication details.

requestSpecification = RestAssured.given();

RequestSpecification is imported from the package:

import io.restassured.specification.RequestSpecification;

Step 3 Send the request to the server and receive the response to the request made by REST Assured. This response contains every detail returned by hitting request i.e. response body, response headers, status code, status lines, cookies, etc.

response = requestSpecification.get();

The response is imported from package:

import io.restassured.response.Response;

Step 4 To validate a response like status code or value, we need to acquire a reference. This reference should be of type ValidatableResponse. ValidatableResponse is an interface. A validatable response to a request made by, REST Assured. ValidatableResponse is imported from the package:

import io.restassured.response.ValidatableResponse;

PrettyPrint() It prints the response body if possible and returns it as a string. Pretty printing is possible for content-types JSON, XML, and HTML.

Below is an example of creating a test in Non-BDD format. I have used ValidatableResponse for the assertion of the status. It is also used for the status line of the Response.

import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.response.ValidatableResponse;
import io.restassured.specification.RequestSpecification;
import org.junit.Test;

public class Get_NonBDDDemo {
    RequestSpecification requestSpecification;
    Response response;
    ValidatableResponse validatableResponse;

    @Test
    public void verifyStatusCode() {

        RestAssured.baseURI = "http://dummy.restapiexample.com/api/v1/employees";

        // Create a request specification
        requestSpecification = RestAssured.given();

        // Calling GET method
        response = requestSpecification.get();

        // Let's print response body.
        String resString = response.prettyPrint();
        System.out.println("Response Details : " + resString);

        /*
         * To perform validation on response, we need to get ValidatableResponse type of
         * response
         */
        validatableResponse = response.then();

        // Get status code
        validatableResponse.statusCode(200);

        // Check status line is as expected
        validatableResponse.statusLine("HTTP/1.1 200 OK");

    }
}

If you don’t want to use ValidatableResponse for the assertion, you can use Response from io.restassured .response to get the status code and status line, which are asserted using JUnit.Assert.

import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.response.ValidatableResponse;
import io.restassured.specification.RequestSpecification;
import org.junit.Assert;
import org.junit.Test;

public class Get_NonBDDResponseDemo {
    RequestSpecification requestSpecification;
    Response response;

    @Test
    public void verifyStatusCode() {

        RestAssured.baseURI = "http://dummy.restapiexample.com/api/v1/employees";

        // Create a request specification
        requestSpecification = RestAssured.given();

        // Calling GET method
        response = requestSpecification.get();

        // Let's print response body.
        String resString = response.prettyPrint();
        System.out.println("Response Details : " + resString);

        // Get status line
        String statusLine = response.getStatusLine();
        Assert.assertEquals(statusLine, "HTTP/1.1 200 OK");

        // Get status code
        int statusCode = response.getStatusCode();
        Assert.assertEquals(statusCode, 200);

    }
}

The output of the above program is

Below is the test implemented in BDD Format. In this test, I am asserting the data of Employee of Id 2. I have validated the name of the employee as well as the response message.

1. equalTo is used for assertion, and is imported from a static hamcrest package:

import static org.hamcrest.Matchers.equalTo;

2. given is a static import from package:

import static io.restassured.RestAssured.given;

import org.junit.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.equalTo;

public class Get_BDDDemo {

    @Test
    public void verifyUser() {

        // Given
        given()

                // When
                .when()
                .get("http://dummy.restapiexample.com/api/v1/employee/2")

                // Then
                .then()
                .statusCode(200).statusLine("HTTP/1.1 200 OK")

                // To verify booking id at index 3
                .body("data.employee_name", equalTo("Garrett Winters"))
                .body("message", equalTo("Successfully! Record has been fetched."));
    }

}

    given
    
    .when()
    .get("http://dummy.restapiexample.com/api/v1/employee/2")
    
    .then()
    .statusCode(200)
    .statusLine("HTTP/1.1 200 OK")
    
    .body("data.employee_name", equalTo("Garrett Winters"))
    .body("message", equalTo("Successfully! Record has been fetched."));
    

    That’s it! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!! Cheers!!

    Rest Assured Tutorials

    HOME

    RestAssured is a Java-based library that is used to test RESTful Web Services. REST-assured was designed to simplify the testing and validation of REST APIs. It takes influence from testing techniques used in dynamic languages such as Ruby and Groovy.

    Chapter 1 Assertion of JSON in Rest Assured using Hamcrest
    Chapter 2 Extraction from JSON in Rest Assured – JsonPath
    Chapter 3 How to perform multiple assertions in Rest Assured? 
    Chapter 4 How to validate JSON body in Rest Assured?
    Chapter 5 Compare JSON Objects using JSONAssert Library
    Chapter 6 Compare JSON Arrays using JSONAssert Library
    Chapter 7 How to Read JSON with JSON.simple – NEW
    Chapter 8 How to create and write to JSON with JSON.simple – NEW

    JSON Handling and manipulation

    Category 10: XML Manipulations

    XML Handling and manipulation

    Gradle

    Chapter 1 Setup Basic REST Assured Gradle Project In Eclipse IDE

    Frameworks

    Chapter 1 Integration of REST Assured with TestNG
    Chapter 2 Integration of REST Assured with JUnit4
    Chapter 3 Integration of REST Assured with JUnit5
    Chapter 4 Serenity BDD with Cucumber and Rest Assured
    Chapter 5 Serenity BDD with Cucumber and Rest Assured in Gradle
    Chapter 6 How To Create Gradle Project with Cucumber to test Rest API
    Chapter 7 Rest API Test in Cucumber and JUnit4
    Chapter 8 API Automation with REST Assured, Cucumber and TestNG

    Integration of REST Assured with JUnit5

    HOME

    In this tutorial, I’ll create a Test Framework for the testing of REST API using REST Assured and JUnit5 as the test framework.

    What is Rest Assured?

    Rest Assured enables you to test REST APIs using Java libraries and integrates well with Maven/Gradle. REST Assured is a Java library that provides a domain-specific language (DSL) for writing powerful, maintainable tests for RESTful APIs.

    What is JUnit5?

    JUnit 5 is the next generation of JUnit. JUnit 5 is composed of several different modules from three different sub-projects.

    Dependency List:-

    1. REST Assured – 5.3.2
    2. Java 11
    3. JUnit Jupiter API – 5.10.0
    4. JUnit Jupiter Engine – 5.10.0
    5. Maven – 3.8.1
    6. Json – 20230618

    Detailed Step Description

    Step 1- Download and Install Java

    Java needs to be present on the system to run the tests. Click here to know How to install Java. To know if Java is installed or not on your machine, type this command in the command line. This command will show the version of Java installed on your machine.

    java -version
    

    Step 2 – Download and setup Eclipse IDE on the system

    The Eclipse IDE (integrated development environment) provides strong support for Java developers, which is needed to write Java code. Click here to learn How to install Eclipse.

    Step 3 – Setup Maven

    To build a test framework, we need to add a number of dependencies to the project. It is a very tedious and cumbersome process to add each dependency manually. So, to overcome this problem, we use a build management tool. Maven is a build management tool that is used to define project structure, dependencies, build, and test management. Click here to learn How to install Maven.

    To know if Maven is already installed or not on your machine, type this command in the command line. This command will show the version of Maven installed on your machine.

    mvn -version
    

    Step 4 – Create a new Maven Project

    Click here to learn How to create a Maven project

    Below is the Maven project structure. Here,

    Group Id – com.example
    Artifact Id – RestAssured_JUnit5_Demo
    Version – 0.0.1-SNAPSHOT
    Package – com. example.RestAssured_JUnit4_Demo

    Step 5 – Add REST Assured and JUnit5 dependencies to the project

    Add the below-mentioned dependencies to the project.

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>org.example</groupId>
      <artifactId>RestAssured_Junit5_Demo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>RestAssured_Junit5_Demo</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <rest-assurd.version>5.3.2</rest-assurd.version>
        <json.version>20230618</json.version>
        <hamcrest.version>1.3</hamcrest.version>
        <junit5.version>5.10.0</junit5.version>
        <maven.surefire.report.plugin.version>3.1.2</maven.surefire.report.plugin.version>
        <maven.compiler.plugin.version>3.10.1</maven.compiler.plugin.version>
        <maven.surefire.plugin.version>3.1.2</maven.surefire.plugin.version>
        <maven.compiler.source.version>11</maven.compiler.source.version>
        <maven.compiler.target.version>11</maven.compiler.target.version>
        <maven.site.plugin.version>3.12.0</maven.site.plugin.version>
      </properties>
    
      <dependencies>
    
        <!-- Rest Assured Dependency -->
        <dependency>
          <groupId>io.rest-assured</groupId>
          <artifactId>rest-assured</artifactId>
          <version>${rest-assurd.version}</version>
          <scope>test</scope>
        </dependency>
    
        <!-- JUNIT Jupiter API Dependency-->
        <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-api</artifactId>
          <version>${junit5.version}</version>
          <scope>test</scope>
        </dependency>
    
        <!-- JUNIT Jupiter Engine Dependency-->
        <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-engine</artifactId>
          <version>${junit5.version}</version>
          <scope>test</scope>
        </dependency>
    
        <!-- JSON Dependency -->
        <dependency>
          <groupId>org.json</groupId>
          <artifactId>json</artifactId>
          <version>${json.version}</version>
        </dependency>
    
        <!-- Hamcrest Dependency -->
        <dependency>
          <groupId>org.hamcrest</groupId>
          <artifactId>hamcrest-all</artifactId>
          <version>${hamcrest.version}</version>
          <scope>test</scope>
        </dependency>
    
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
              <source>${maven.compiler.source.version}</source>
              <target>${maven.compiler.target.version}</target>
            </configuration>
          </plugin>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven.surefire.plugin.version}</version>
            <configuration>
              <testFailureIgnore>true</testFailureIgnore>
            </configuration>
          </plugin>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-site-plugin</artifactId>
            <version>${maven.site.plugin.version}</version>
          </plugin>
        </plugins>
      </build>
    
        <reporting>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-surefire-report-plugin</artifactId>
              <version>${maven.surefire.report.plugin.version}</version>
              <configuration>
                <outputName>JUnit5 Report</outputName>
              </configuration>
            </plugin>
          </plugins>
        </reporting>
    
    </project>
    

    Step 6 – Create the TEST file

    The tests should be written in src/test/java directory. To learn how to create a JSON Request body using JSONObject, please refer to this tutorial.

    import io.restassured.http.ContentType;
    import org.json.JSONObject;
    import org.junit.jupiter.api.Test;
    import static io.restassured.RestAssured.given;
    import static org.hamcrest.Matchers.equalTo;
    
    public class APITests {
    
            String BaseURL = "https://reqres.in/api";
    
        @Test
        public void createUser() {
    
            JSONObject data = new JSONObject();
    
            data.put("name", "NewUser1");
            data.put("job", "Testing");
    
            // GIVEN
            given()
                    .contentType(ContentType.JSON)
                    .body(data.toString())
    
                    // WHEN
                    .when()
                    .post(BaseURL + "/users")
    
                    // THEN
                    .then()
                    .statusCode(201)
                    .body("name", equalTo("NewUser1"))
                    .body("job", equalTo("Testing"))
                    .log().all();
    
        }
    
        @Test
        public void getUser() {  //Failed Test
    
            // GIVEN
            given()
                    .contentType(ContentType.JSON)
    
                    // WHEN
                    .when()
                    .get(BaseURL + "/users/2")
    
                    // THEN
                    .then()
                    .statusCode(200)
                    .body("data.first_name", equalTo("Janet1"))
                    .log().all();
    
        }
    
    }
    

    Step 7 – Test Execution through JUnit Test

    Go to the Runner class and right-click Run As JUnit Test. The tests will run as JUnit tests.

    Below is the image to run the tests in IntelliJ.

    This is how the execution console will look like.

    Step 8 – Run the tests from the command line

    Maven Site Plugin creates a folder – site under the target directory, and the Maven Surefire Report plugin generates the JUnit Reports in the site folder. We need to run the tests through the command line to generate the JUnit Report.

    mvn clean test site
    

    The output of the above program is

    Step 9 – Report Generation

    After the test execution, refresh the project, and a new folder with the name site in the target folder will be generated. This folder contains the reports generated by JUnit. The structure of the folder site looks as shown below.

    View the Report

    Right-click on the Junit5 Report.html and select Open In -> Browser ->Chrome.

    Summary Report

    Below is the summary Report.

    Surefire Report

    Below is an example of a Surefire Report. This report contains a summary of the test execution.

    We are done! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!

    Logging in Rest Assured

    HOME

    Logging plays an important role in understanding the behaviour of the test. When we are testing an API, it is good to know how the APIs are behaving. We should understand how the request is made and how we received the response from the API. It’s important to check what the headers look like. We also need to see what the body looks like. Additionally, verify what parameters we are providing to the request. All of this helps us debug the test code. It helps us identify the reason for the failure of the test.

    REST Assured, provide support to a different type of logging as shown below:-

    Request Logging

    To log all request specification details including parameters, headers, and body of the request, log().all() needs to be added to post given() section.

    import org.testng.annotations.Test;
    import io.restassured.http.ContentType;
    import static io.restassured.RestAssured.*;
    import static org.hamcrest.Matchers.equalTo;
    
    public class RestTests {
    	
    	@Test
        public void requestLoggingDemo() {
     
            String json = "{\"name\":\"apitest\",\"salary\":\"5000\",\"age\":\"30\"}";
     
            // GIVEN
            given()
                   .log().all()
                   .baseUri("https://dummy.restapiexample.com/api")
                   .contentType(ContentType.JSON)
                   .body(json)
     
            // WHEN
             .when()
                    .post("/v1/create")
     
            // THEN
              .then()
                     .assertThat()
                     .statusCode(200)
                     .body("data.name", equalTo("apitest"))
                     .body("message", equalTo("Successfully! Record has been added."));
     
        }
    
    }
    

    The output of the above program is

    Other different request logging options are:-

    given().log().params(). .. // Log only the parameters of the request
    given().log().body(). .. // Log only the request body
    given().log().headers(). .. // Log only the request headers
    given().log().cookies(). .. // Log only the request cookies
    given().log().method(). .. // Log only the request method
    given().log().path(). .. // Log only the request path
    

    Response Logging

    If you want to print the response body regardless of the status code, you can do

    get("/x").then().log().body()..
    

    This will print the response body regardless of an error occurring.

    import org.testng.annotations.Test;
    import io.restassured.http.ContentType;
    import static io.restassured.RestAssured.*;
    import static org.hamcrest.Matchers.equalTo;
    
    public class RestTests {
    
      @Test
    	public void responseLoggingDemo() {
    
    		String json = "{\"name\":\"apitest\",\"salary\":\"5000\",\"age\":\"30\"}";
    
    		// GIVEN
    		given()
                  .baseUri("https://dummy.restapiexample.com/api")
                  .contentType(ContentType.JSON)
    			  .body(json)
    
    		 // WHEN
    		  .when()
                     .post("/v1/create")
    
    		// THEN
    		  .then()
                     .log().all()
                     .statusCode(200)
                     .body("data.name", equalTo("apitest"))
    				 .body("message", equalTo("Successfully! Record has been added."));
    
    	}
    }
    

    The output of the above program is

    Conditional Logging

    What if you want to perform logging conditionally? For example, log in if validation fails and the status code is equal to 200. Also, log in if the server returns a status code >=400.

    .then().log().ifStatusCodeIsEqualTo(302). .. // Only log if the status code is equal to 302
    .then().log().ifStatusCodeMatches(matcher). .. // Only log if the status code matches the supplied Hamcrest matcher
    
    import org.testng.annotations.Test;
    import io.restassured.http.ContentType;
    import static io.restassured.RestAssured.*;
    import static org.hamcrest.Matchers.equalTo;
    
    public class RestTests {
    	
    	@Test
    	public void conditionalResponseLoggingDemo() {
    
    		String json = "{\"name\":\"apitest\",\"salary\":\"5000\",\"age\":\"30\"}";
    
    		// GIVEN
    		given()
                   .baseUri("https://dummy.restapiexample.com/api")
                   .contentType(ContentType.JSON)
    			   .body(json)
    
    		// WHEN
    		 .when()
                   .post("/v1/create")
    
    		// THEN
    		 .then()
                    .log().ifStatusCodeIsEqualTo(200)
                    .assertThat().statusCode(200)
    				.body("data.name", equalTo("apitest"))
                    .body("message", equalTo("Successfully! Record has been added."));
    
    	}
    
    }
    

    The output of the above program is

    Logging to a text file with Rest Assured

    We will see how we can log all the request and response data to a txt file using Rest Assured.

    1. Create a PrintStream object. You have to provide an object of FileOutputStream() to the PrintStream() constructor. Provide the path to the logging.txt file in FileOutputStream().
    2. REST Assured gives us a filter() method, this filter method accepts RequestLoggingFilter and ResponseLoggingFilter. They have two methods, logRequestTo() and logResponseTo() methods respectively. These methods expect a Stream.
    3. Pass the log stream we created to these methods.
    import org.testng.annotations.Test;
    import io.restassured.filter.log.RequestLoggingFilter;
    import io.restassured.filter.log.ResponseLoggingFilter;
    import io.restassured.http.ContentType;
    import static io.restassured.RestAssured.*;
    import static org.hamcrest.Matchers.equalTo;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.PrintStream;
    
    public class RestTests {
    	
    	@Test
    	public void responsetoFileDemo() throws FileNotFoundException {
    
    		PrintStream log = new PrintStream(new FileOutputStream("logging.txt"));
    
    		String json = "{\"name\":\"apitest\",\"salary\":\"5000\",\"age\":\"30\"}";
    
    		// GIVEN
    		given()
                   .baseUri("https://dummy.restapiexample.com/api")
                   .contentType(ContentType.JSON)
    				.body(json)
                    .filter(RequestLoggingFilter.logRequestTo(log))
    				.filter(ResponseLoggingFilter.logResponseTo(log))
    
    		// WHEN
    		 .when()
                    .post("/v1/create")
    
    		// THEN
              .then()
                     .log().ifStatusCodeIsEqualTo(200)
                     .assertThat().statusCode(200)
    				 .body("data.name", equalTo("apitest"))
                     .body("message", equalTo("Successfully! Record has been added."));
    
    	}
    }
    

    Mostly we have more than 1 test, and we want to save the log of all the tests in the text file. We can create a @BeforeClass method, and this class contains the code to create the file and append the data to that file.

    import org.testng.annotations.BeforeClass;
    import org.testng.annotations.Test;
    import io.restassured.filter.log.RequestLoggingFilter;
    import io.restassured.filter.log.ResponseLoggingFilter;
    import io.restassured.http.ContentType;
    import static io.restassured.RestAssured.*;
    import static org.hamcrest.Matchers.equalTo;
    
    public class LogTest {
    	
    	 public PrintStream log ;
    	 RequestLoggingFilter requestLoggingFilter;
    	 ResponseLoggingFilter responseLoggingFilter;
    	
    	@BeforeClass
    	public void init() throws FileNotFoundException {
    		
    		 log = new PrintStream(new FileOutputStream("test_logging.txt"),true);	
    		 requestLoggingFilter = new RequestLoggingFilter(log);
    		 responseLoggingFilter = new ResponseLoggingFilter(log);
    		 
    	}
    	
    	@Test
    	public void test1() {
    
    		// Given
    		given()
    
             .contentType(ContentType.JSON)
             . filters(requestLoggingFilter,responseLoggingFilter)
           
              .when()
                 .get("https://dummy.restapiexample.com/api/v1/employee/2")
    				
               .then()
               		.log().ifStatusCodeIsEqualTo(200)
               		.assertThat().statusCode(200).statusLine("HTTP/1.1 200 OK")
    				
               		// To verify booking id at index 2
    				.body("data.employee_name", equalTo("Garrett Winters"))
    				.body("message", equalTo("Successfully! Record has been fetched."));
    	}
    	
    	@Test
    	public void test2() {
    
    		// Given
    		given()
    
             .contentType(ContentType.JSON)
             . filters(requestLoggingFilter,responseLoggingFilter)
           
              .when()
                 .get("https://dummy.restapiexample.com/api/v1/employee/1")
    				
               .then()
               .log().ifStatusCodeIsEqualTo(200)
               .assertThat().statusCode(200).statusLine("HTTP/1.1 200 OK")
    				// To verify booking id at index 1
    				.body("data.employee_name", equalTo("Tiger Nixon"))
    				.body("message", equalTo("Successfully! Record has been fetched."));
    	}
    
    	
    	
    	@Test
        public void test3() throws FileNotFoundException {
     
            
            String json = "{\"name\":\"apitest\",\"salary\":\"5000\",\"age\":\"30\"}";
     
            // GIVEN
            given()
                   .baseUri("https://dummy.restapiexample.com/api")
                   .contentType(ContentType.JSON)
                    .body(json)
                   .filters(requestLoggingFilter,responseLoggingFilter)
     
            // WHEN
             .when()
                    .post("/v1/create")
     
            // THEN
              .then()
                     .log().ifStatusCodeIsEqualTo(200)
                     .assertThat().statusCode(200)
                     .body("data.name", equalTo("apitest"))
                     .body("message", equalTo("Successfully! Record has been added."));
     
        }
    	
    }
    
    

    The below file shows that the log for multiple requests is saved here.

    Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!

    How to test PATCH Request using Rest Assured
    How to test POST request from JSON Object in Rest Assured
    How to test POST JSON Object request using Java Map in Rest Assured
    How to create JSON Array Request Body – org.json
    Assertion of JSON in Rest Assured using Hamcrest
    Extraction from JSON in Rest Assured

    Integration of REST Assured with TestNG

    Last Updated On

    HOME

    As we know, REST Assured is a Java DSL for simplifying the testing of REST-based services built on top of HTTP Builder. In this tutorial, I’ll create a Test Framework for the testing of REST API using REST Assured and TestNG as the test framework.

    Table of Contents

    1. Dependency List
    2. Detailed Step Description
      1. Download and Install Java
      2. Download and setup Eclipse IDE on the system
      3. Setup Maven
      4. Create a new Maven Project
      5. Add REST Assured and TestNG dependencies to the project
      6. Create a TEST file under src/test/java to write the test code
      7. Test Execution through TestNG
      8. Run the tests from TestNG.xml
      9. TestNG Report Generation

    Dependency List

    1. REST Assured – 5.3.2
    2. Java 8 or above
    3. TestNG – 7.8.0
    4. Maven – 3.8.1
    5. Maven Compiler Plugin – 3.11.0
    6. Maven Surefire Plugin – 3.1.2
    7. Json – 20230618

    Detailed Step Description

    Step 1- Download and Install Java

    Java needs to be present on the system to run the tests. Click here to know How to install Java. To know if Java is installed or not on your machine, type this command in the command line. This command will show the version of Java installed on your machine.

    java -version
    

    Step 2 – Download and setup Eclipse IDE on the system

    The Eclipse IDE (integrated development environment) provides strong support for Java developers, which is needed to write Java code. Click here to know How to install Eclipse.

    Step 3 – Setup Maven

    To build a test framework, we need to add a number of dependencies to the project. It is a very tedious and cumbersome process to add each dependency manually. So, to overcome this problem, we use a build management tool. Maven is a build management tool that is used to define project structure, dependencies, build, and test management. Click here to know How to install Maven.

    To know if Maven is already installed or not on your machine, type this command in the command line. This command will show the version of Maven installed on your machine.

    mvn -version
    

    Step 4 – Create a new Maven Project

    Click here to know How to create a Maven project

    Below is the Maven project structure. Here,

    Group Id – org.example
    Artifact Id – RestAssured_TestNG_Demo
    Version – 0.0.1-SNAPSHOT
    Package – org. example

    Step 5 – Add REST Assured and TestNG dependencies to the project

    Add the below-mentioned dependencies to the project.

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>RestAssured_TestNG_Demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <hamcrest.version>1.3</hamcrest.version>
            <testng.version>7.8.0</testng.version>
            <rest-assured.version>5.3.2</rest-assured.version>
            <json.version>20230618</json.version>
            <maven.compiler.plugin.version>3.11.0</maven.compiler.plugin.version>
            <maven.compiler.source>11</maven.compiler.source>
            <maven.compiler.target>11</maven.compiler.target>
            <maven.surefire.plugin.version>3.1.2</maven.surefire.plugin.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
    
            <!-- Hamcrest Dependency -->
            <dependency>
                <groupId>org.hamcrest</groupId>
                <artifactId>hamcrest-all</artifactId>
                <version>${hamcrest.version}</version>
                <scope>test</scope>
            </dependency>
    
            <!-- TestNG Dependency -->
            <dependency>
                <groupId>org.testng</groupId>
                <artifactId>testng</artifactId>
                <version>${testng.version}</version>
            </dependency>
    
            <!-- Rest Assured -->
            <dependency>
                <groupId>io.rest-assured</groupId>
                <artifactId>rest-assured</artifactId>
                <version>${rest-assured.version}</version>
                <scope>test</scope>
            </dependency>
    
            <!-- JSON Dependency -->
            <dependency>
                <groupId>org.json</groupId>
                <artifactId>json</artifactId>
                <version>${json.version}</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>${maven.compiler.plugin.version}</version>
                    <configuration>
                        <source>${maven.compiler.source}</source>
                        <target>${maven.compiler.target}</target>
                    </configuration>
                </plugin>
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>${maven.surefire.plugin.version}</version>
                    <configuration>
                        <suiteXmlFiles>
                            <suiteXmlFile>testng.xml</suiteXmlFile>
                        </suiteXmlFiles>        
                    </configuration>         
                </plugin>
            </plugins>
        </build>
    </project>
    

    Step 6 – Create a TEST file under src/test/java to write the test code.

    To learn how to create a JSON Request body using JSONObject, please refer to this tutorial – How to test POST request from JSON Object in Rest Assured.

    To know more about priority in TestNG, please refer to this tutorial.

    import io.restassured.http.ContentType;
    import org.json.JSONObject;
    import org.testng.annotations.Test;
    import static io.restassured.RestAssured.given;
    import static org.hamcrest.Matchers.equalTo;
    
    public class RestAPITests {
    
        @Test(description = "To get the details of user with id 3", priority = 0)
        public void verifyUser() {
    
            // Given
            given()
    
                    // When
                    .when()
                    .get("https://reqres.in/api/users/3")
    
                    // Then
                    .then()
                    .statusCode(200)
                    .statusLine("HTTP/1.1 200 OK")
    
                    // To verify user of id 3
                    .body("data.email", equalTo("emma.wong@reqres.in"))
                    .body("data.first_name", equalTo("Emma"))
                    .body("data.last_name", equalTo("Wong"));
        }
    
        @Test(description = "To create a new user", priority = 1)
        public void createUser() {
    
            JSONObject data = new JSONObject();
    
            data.put("name", "RestAPITest");
            data.put("job", "Testing");
    
            // GIVEN
            given()
                    .contentType(ContentType.JSON)
                    .body(data.toString())
    
                    // WHEN
                    .when()
                    .post("https://reqres.in/api/users")
    
                    // THEN
                    .then()
                    .statusCode(201)
                    .body("name", equalTo("RestAPITest"))
                    .body("job", equalTo("Testing"));
    
        }
    
    }
    

    Step 7 – Test Execution through TestNG

    Go to the Runner class and right-click Run As TestNG Test. The tests will run as TestNG tests. (Eclipse)

    This is how the execution console will look like. (IntelliJ)

    Step 8 – Run the tests from TestNG.xml

    Create a TestNG.xml as shown below and run the tests as TestNG. Here, the tests are present in class – com.example. Selenium_TestNGDemo.API_Test.

    <?xml version = "1.0"encoding = "UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name = "Suite1">
        <test name = "TestNG Test Demo">
            <classes>
                <class name = "org.example.RestAPITests"/>
            </classes>
        </test>
    </suite>
    

    Step 9 – TestNG Report Generation

    After the test execution, refresh the project, and a new folder with the name test-output will be generated. This folder contains the reports generated by TestNG. The structure of folder test-output looks as shown below.

    Emailable-report.html

    We are interested inemailable-report.htmlreport. Open “emailable-report.html”, as this is an HTML report, open it with the browser. The below image shows emailable-report.html.

    Index.html

    TestNG also produces “index.html” report, and it resides under the test-output folder. The below image shows the index.html report. This report contains a high-level summary of the tests.

    We are done! Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!!

    How to create JSON Array Request Body – org.json

    Last Updated On

    HOME

    In the last tutorial, I explained How to test POST JSON Object request using Java Map in Rest Assured. In this tutorial, I will create a request body using JSON Array in Rest Assured. This request body can be used for POST or PUT operations.

    Table of Contents

    1. What is JSONArray?
    2. How to create JSONArray Request Body or payload?
    3. Complex JSON Array

    What is JSONArray?

    JSONArray represents an immutable JSON array (an ordered sequence of zero or more values). It also provides an unmodifiable list view of the values in the array.

    1. JSON array can store multiple value types. The values in a JSONArray can be of the following types: JsonObject, JsonArray, JsonString, JsonNumber, JsonValue.TRUE, JsonValue.FALSE, and JsonValue.NULL.
    2. The array index begins with 0.
    3. The square brackets [ ] are used to declare the JSON array.

    An API can accept a JSON Array payload as a request body. Imagine, we want to add employee details of more than one employee in the below example. In this case, we can pass multiple JSON objects within a JSON array. I have explained 2 ways to create JSON Object – map or JsonObject. Refer to any one of the tutorials to get to know about the creation of JSON Object.

    To create a JSON Array, we need to add org.json Maven dependency, as shown below. The latest version can be found here.

    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20240303</version>
    </dependency>  
    

    JSONObject is imported from the package:

    import org.json.JSONObject;
    

    JSONArray is imported from the package:

    import org.json.JSONArray;
    

    Below is an example of JSONArray.

    How to create JSONArray Request Body or payload?

    1. Create a JSON Object and add the first employee details.
    2. Create another JSON Object and add second guest details.
    3. Create a JSONArray.
    4. Add both JSON Objects to JSONArray.

    Below is an example of creating a request from JSONArray with multiple JSON Objects.  I am using a logger just to print the JSON body in the Console. 

    import io.restassured.RestAssured;
    import io.restassured.http.ContentType;
    import org.json.JSONArray;
    import org.json.JSONObject;
    import org.junit.Test;
    import static org.hamcrest.Matchers.equalTo;
    
    public class Json_Demo {
    
        @Test
        public void passBodyAsJsonArrayDemo() {
    
            // JSON Object for first employee
            JSONObject data1 = new JSONObject();
    
            data1.put("employee_name", "ObjectTest");
            data1.put("profile_image", "test1.png");
            data1.put("employee_age", "30");
            data1.put("employee_salary", "11111");
    
            // JSON Object for second employee
            JSONObject data2 = new JSONObject();
    
            data2.put("employee_name", "MapTest");
            data2.put("profile_image", "test2.png");
            data2.put("employee_age", "20");
            data2.put("employee_salary", "99999");
    
            // Creating JSON array to add both JSON objects
            JSONArray array = new JSONArray();
            array.put(data1);
            array.put(data2);
    
            // Send the request
            RestAssured.given()
                    .contentType(ContentType.JSON)
                    .body(array.toString())
                    .log().all()
    
                    .when()
                    .post("https://dummy.restapiexample.com/api/v1/create")
    
                    .then()
                    .assertThat().statusCode(200)
                    .body("message", equalTo("Successfully! Record has been added."))
                    .log().all();
        }
    }
    

    The output of the above program is

           // JSON Object for first employee
            JSONObject data1 = new JSONObject();
    
            data1.put("employee_name", "ObjectTest");
            data1.put("profile_image", "test1.png");
            data1.put("employee_age", "30");
            data1.put("employee_salary", "11111");
    
            // JSON Object for second employee
            JSONObject data2 = new JSONObject();
    
            data2.put("employee_name", "MapTest");
            data2.put("profile_image", "test2.png");
            data2.put("employee_age", "20");
            data2.put("employee_salary", "99999");
    
    JSONArray array = new JSONArray();
    array.put(data1);
    array.put(data2);
    
    contentType(ContentType.JSON)
    
    .body(array.toString())
    
    .log().all()
    
    .post("https://dummy.restapiexample.com/api/v1/create")
    
    .assertThat().statusCode(200)
    
    .body("message", equalTo("Successfully! Record has been added."))
    
    .log().all()
    

    Complex JSON Array

    Let us see an example of a complex JSON Array. This structure represents two separate employee data sets. Each is contained within its own JSON array. The whole is encapsulated within a larger JSON object identified by keys employee1 and employee2.


    {
        "employee1": [
          {
            "firstname": "Tom",
            "salary": 720000,
            "age": 59,
            "lastname": "Mathew"
         }
        ],
        "employee2": [
         {
            "firstname": "Perry",
            "salary": 365000,
            "age": 32,
            "lastname": "David"
        }
       ]
    }
    
    

    The above JSON Array can be created as

    import org.json.JSONArray;
    import org.json.JSONObject;
    import org.junit.Test;
    
    public class Json_Demo {
    
        @Test
        public void passBodyAsJsonArray() {
    
            // JSON Object for first employee
            JSONObject data1 = new JSONObject();
    
            data1.put("firstname", "Tom");
            data1.put("lastname", "Mathew");
            data1.put("age", 59);
            data1.put("salary", 720000);
    
            // JSON Object for second employee
            JSONObject data2 = new JSONObject();
    
            data2.put("firstname", "Perry");
            data2.put("lastname", "David");
            data2.put("age", 32);
            data1.put("salary", 365000);
    
            // Creating first JSON array
            JSONArray array1 = new JSONArray();
            array1.put(data1);
    
            // Creating second JSON array
            JSONArray array2 = new JSONArray();
            array2.put(data2);
    
            // Create JSON Object to add both JSONArrays
            JSONObject data3 = new JSONObject();
            data3.put("employee1", array1);
            data3.put("employee2", array2);
    
            System.out.println(data3.toString(4));
    
        }
    }
    

    JSONObject data1 = new JSONObject();
    data1.put("firstname", "Tom");
    data1.put("lastname", "Mathew");
    data1.put("age", 59);
    data1.put("salary", 720000);
    
    JSONObject data2 = new JSONObject();
    data2.put("firstname", "Perry");
    data2.put("lastname", "David");
    data2.put("age", 32);
    data2.put("salary", 365000);
    

    JSONArray array1 = new JSONArray();
    array1.put(data1);
    
    JSONArray array2 = new JSONArray();
    array2.put(data2);
    

    A third JSONObject, data3, is created to aggregate the two JSON arrays under separate keys: employee1 and employee2.

    JSONObject data3 = new JSONObject();
    data3.put("employee1", array1);
    data3.put("employee2", array2);
    
    System.out.println(data3.toString(4));
    

    Similarly, there is another way to create this JSON Structure.

    import org.json.JSONArray;
    import org.json.JSONObject;
    import org.junit.Test;
    
    public class Json_Demo {
    
        @Test
        public void passBodyAsJsonArray1() {
    
            // Creating JSON array to add first JSON object
            JSONArray array1 = new JSONArray();
            array1.put(new JSONObject().put("firstname", "Tom").put("lastname", "Mathew").put("age", 59).put("salary",
                    720000));
    
            // Creating JSON array
            JSONArray array2 = new JSONArray();
            array2.put(new JSONObject().put("firstname", "Perry").put("lastname", "David").put("age", 32).put("salary",
                    365000));
    
            // Create JSON Object to add JSONArrays
            JSONObject data1 = new JSONObject();
            data1.put("employee1", array1);
            data1.put("employee2", array2);
    
            System.out.println(data1.toString(4));
    
        }
    }
    

    The output of the above program is

    Congratulations on making it through this tutorial and hope you found it useful! Happy Learning!! Cheers!!