Error Handling and Logging

When testing APIs, it is important to:

  1. Catch and manage errors gracefully.
  2. Log details to understand what went wrong.

In this tutorial, you will learn:

  1. Why Error Handling is Important
  2. Handling API Errors with REST Assured
  3. Logging Requests and Responses
  4. Logging Errors for Debugging
  5. Custom Error Messages
  6. Using Try-Catch for Error Handling

Why Error Handling is Important

APIs can fail due to many reasons:

  • Invalid inputs (e.g., wrong data format)
  • Server issues (e.g., 500 Internal Server Error)
  • Authentication problems (e.g., 401 Unauthorized)
  • Resource not found (e.g., 404 Not Found)

Good error handling helps you:

  • Identify and fix problems faster.
  • Get clear error messages during test failures.
  • Ensure your tests are robust and reliable.

Handling API Errors with REST Assured

When calling an API, you must check for expected and unexpected responses.

Example: Handling a 404 Error (Resource Not Found)

Java
Copy
given()
    .when()
    .get("http://192.xxx.xx.xxx:8080/books/20250401")
    .then()
    .statusCode(404)  // Check if resource is not found
    .body("error", equalTo("Book not found"));

Example: Handling 400 (Bad Request)

If the API expects specific data, sending the wrong input returns 400 Bad Request.

Java
Copy
given()
    .contentType("application/json")
    .body("{\"name\": \"\"}")  // Invalid input (empty name)
    .when()
    .post("https://api.example.com/users")
    .then()
    .statusCode(400)
    .body("message", containsString("Invalid name"));

Logging Requests and Responses

REST Assured provides built-in methods to log:

  • Requests (what you send)
  • Responses (what you receive)
  • Errors (in case of failures)

Log Everything (Request and Response)

Java
Copy
given()
    .log().all()  // Logs full request
    .when()
    .get("http://192.xxx.xx.xxx:8080/books/20250401")
    .then()
    .log().all()  // Logs full response
    .statusCode(200);

Log Only Errors

Logs only if the test fails.

Java
Copy
given()
    .log().ifValidationFails()  // Log only if there is a failure
    .when()
    .get("http://192.xxx.xx.xxx:8080/books/123")
    .then()
    .statusCode(200);  // This will fail and log the error

Log Request Details

Log only the request (helpful for debugging).

Java
Copy
given()
    .log().method()     // Log HTTP method (GET, POST, etc.)
    .log().uri()        // Log the request URL
    .log().headers()    // Log headers
    .log().body()       // Log request body (for POST/PUT)
    .when()
    .post("https://api.example.com/create");

Log Response Details

Log only the response.

Java
Copy
given()
    .when()
    .get("http://192.xxx.xx.xxx:8080/books/20250401")
    .then()
    .log().status()      // Logs status code (200, 404, etc.)
    .log().headers()     // Logs response headers
    .log().body();       // Logs the response body

Custom Error Messages

Add custom messages to make errors clearer.

Example: Custom Error Message

Java
Copy
given()
    .when()
    .get("http://192.xxx.xx.xxx:8080/books/20250401")
    .then()
    .statusCode(200)
    .body("name", equalTo("book 1"), "Name mismatch error!");

If the name does not match, you'll see:

java.lang.AssertionError: Name mismatch error!

Using Try-Catch for Error Handling

You can wrap your API calls in a try-catch block to handle exceptions.

Example: Handling Exceptions Gracefully

Java
Copy
try {
    Response response = 
        given()
            .when()
            .get("http://192.xxx.xx.xxx:8080/books/20250401");
    
    if (response.statusCode() != 200) {
        System.out.println("Error: Unexpected Status Code " + response.statusCode());
    } else {
        System.out.println("Success: " + response.asString());
    }

} catch (Exception e) {
    System.out.println("Exception occurred: " + e.getMessage());
}

Example: Retry on Failure

If an API is unstable, you may retry it.

Java
Copy
int retries = 3;
boolean success = false;

for (int i = 0; i < retries; i++) {
    try {
        given()
            .when()
            .get("https://api.example.com/status")
            .then()
            .statusCode(200);
        success = true;
        break;  // Exit loop if successful
    } catch (Exception e) {
        System.out.println("Retrying... Attempt: " + (i + 1));
    }
}

if (!success) {
    throw new RuntimeException("API failed after " + retries + " retries");
}

Handling JSON Parsing Errors

If the response is not in the expected format, it can cause parsing errors.

Example: Safely Parse JSON

Java
Copy
try {
    Response response = given()
        .when()
        .get("https://api.example.com/data");

    String value = response.jsonPath().getString("nonExistingField");
    System.out.println("Value: " + value);
    
} catch (Exception e) {
    System.out.println("Parsing Error: " + e.getMessage());
}

Validating Response Time

Ensure the API responds within a specific time.

Java
Copy
given()
    .when()
    .get("https://api.example.com/health")
    .then()
    .time(lessThan(3000L));  // Response must be under 3 seconds