</>

Technology

API Automation

Difficulty

Advanced

Interview Question

How do you design test cases for an API endpoint that retrieves user data based on criteria?

Answer

Scenario: Testing a User Data Retrieval API Endpoint

You need to test an API endpoint GET /api/users that retrieves user data based on certain criteria.

Approach

Step 1: Identify All Criteria/Filters

  • gender — male/female/other
  • status — active/inactive
  • page / per_page — pagination
  • sort_by — name/email/created_at
  • search — partial name search

Step 2: Design Test Cases

Valid Criteria Combinations:

Java
@Test
public void testGetUsersByGender() {
    given()
        .queryParam("gender", "female")
        .when()
        .get("/api/users")
        .then()
        .statusCode(200)
        .body("data.size()", greaterThan(0))
        .body("data.gender", everyItem(equalTo("female")));
}

@Test
public void testGetUsersByStatusActive() {
    given()
        .queryParam("status", "active")
        .when()
        .get("/api/users")
        .then()
        .statusCode(200)
        .body("data.status", everyItem(equalTo("active")));
}

@Test
public void testGetUsersWithPagination() {
    given()
        .queryParam("page", 2)
        .queryParam("per_page", 5)
        .when()
        .get("/api/users")
        .then()
        .statusCode(200)
        .body("page", equalTo(2))
        .body("per_page", equalTo(5))
        .body("data.size()", lessThanOrEqualTo(5));
}

Edge Cases — Non-existent Users:

Java
@Test
public void testGetNonExistentUser() {
    given()
        .when()
        .get("/api/users/99999")
        .then()
        .statusCode(404)
        .body("message", containsString("not found"));
}

Invalid Criteria:

Java
@Test
public void testInvalidGenderFilter() {
    given()
        .queryParam("gender", "robot")
        .when()
        .get("/api/users")
        .then()
        .statusCode(400)
        .body("error", containsString("Invalid value for gender"));
}

Performance Test:

Java
@Test
public void testResponseTimeForUserList() {
    given()
        .when()
        .get("/api/users")
        .then()
        .statusCode(200)
        .time(lessThan(2000L)); // response under 2 seconds
}

Step 3: Validate Response Structure

Java
@Test
public void testUserResponseSchema() {
    given()
        .when()
        .get("/api/users/1")
        .then()
        .statusCode(200)
        .body("data", hasKey("id"))
        .body("data", hasKey("email"))
        .body("data", hasKey("first_name"))
        .body("data", hasKey("last_name"));
}

Test Coverage Matrix

Test TypeScenarios
Valid filtersgender, status, search
Paginationpage, per_page, last page
Invalid inputwrong values, missing required
Edge casesempty result set, non-existent user
Performanceresponse time < 2s
Securityauth token required

Follow AutomateQA

Related Topics