Использовал ли BDD-фичи для REST Assured?

Ответ

Да, активно использовал. Хотя REST Assured сам по себе не является BDD-фреймворком, его синтаксис (given(), when(), then()) идеально ложится на парадигму Behavior-Driven Development (BDD), делая тесты очень читаемыми даже для нетехнических членов команды.

Практическое применение:

  1. Чистый BDD-стиль в коде: Я структурировал API-тесты, явно разделяя этапы подготовки, действия и проверок.

    @Test
    public void userCanRetrieveTheirProfile() {
        // Given (Подготовка: заданы учетные данные и ожидаемые данные)
        String authToken = "valid_jwt_token";
        String expectedUsername = "testUser";
    
        // When (Действие: выполняется API-вызов)
        Response response = given()
                .header("Authorization", "Bearer " + authToken)
                .when()
                .get("/api/profile");
    
        // Then (Проверка: валидация ответа)
        response.then()
                .statusCode(200)
                .body("username", equalTo(expectedUsername))
                .body("email", notNullValue())
                .time(lessThan(2000L)); // Проверка производительности
    }
  2. Интеграция с Cucumber (полноценный BDD): Для сложных бизнес-сценариев я интегрировал REST Assured с Cucumber. В .feature-файлах на Gherkin описывались сценарии, а в Step Definitions использовался REST Assured для реализации шагов.

    # Файл: user_management.feature
    Feature: User Management
      Scenario: Admin can deactivate a user account
        Given an admin user is authenticated
        When the admin sends a DELETE request to "/users/123"
        Then the response status should be 204
        And the user status in the database should be "INACTIVE"
    // Step Definitions
    public class UserSteps {
        private Response response;
    
        @When("the admin sends a DELETE request to {string}")
        public void adminSendsDeleteRequest(String endpoint) {
            response = given()
                    .header("Authorization", adminToken)
                    .when()
                    .delete(endpoint);
        }
    
        @Then("the response status should be {int}")
        public void verifyResponseStatus(int expectedCode) {
            response.then().statusCode(expectedCode);
        }
    }

Преимущества такого подхода:

  • Прозрачность: Менеджеры и аналитики могут читать сценарии в .feature-файлах и понимать, что именно тестируется.
  • Живая документация: Набор сценариев Cucumber + REST Assured становится исполняемой спецификацией поведения API.
  • Фокус на поведении: Тесты фокусируются на том, что должна делать система, а не на внутренней реализации, что делает их более стабильными.

Ответ 18+ 🔞

Слушай, а я-то как раз с этим REST Assured на короткой ноге, хоть он и не чистокровный BDD-фреймворк. Но его синтаксис — этот самый given(), when(), then() — это же просто ёперный театр для BDD! Тесты читаются, как будто их писал не программист, а какой-нибудь менеджер, который в жизни кода не видел. Ну, почти.

Как я это на практике применял:

  1. Код в стиле "чё да как". Я просто раскладывал тесты по этим трём полочкам: подготовка, действие, проверка. Получалось наглядно, хоть сейчас показывай.

    @Test
    public void userCanRetrieveTheirProfile() {
        // Given (Чё у нас есть? Токен и ожидаемый юзернейм)
        String authToken = "valid_jwt_token";
        String expectedUsername = "testUser";
    
        // When (Что делаем? Дёргаем апишку)
        Response response = given()
                .header("Authorization", "Bearer " + authToken)
                .when()
                .get("/api/profile");
    
        // Then (Что получили? Проверяем всё до ниточки)
        response.then()
                .statusCode(200)
                .body("username", equalTo(expectedUsername))
                .body("email", notNullValue())
                .time(lessThan(2000L)); // И чтобы не тормозило, а то терпения ноль ебать
    }
  2. А для серьёзных разборок — Cucumber. Когда сценарии такие, что волнение ебать, одними юнит-тестами не отделаешься. Тут подключал полноценный BDD. В файлах на Gherkin писалось, что должно происходить человеческим языком, а в шагах уже колдовал с REST Assured.

    # Файл: user_management.feature
    Feature: User Management
      Scenario: Admin can deactivate a user account
        Given an admin user is authenticated
        When the admin sends a DELETE request to "/users/123"
        Then the response status should be 204
        And the user status in the database should be "INACTIVE"
    // А вот тут уже мои руки, Step Definitions
    public class UserSteps {
        private Response response;
    
        @When("the admin sends a DELETE request to {string}")
        public void adminSendsDeleteRequest(String endpoint) {
            response = given()
                    .header("Authorization", adminToken)
                    .when()
                    .delete(endpoint);
        }
    
        @Then("the response status should be {int}")
        public void verifyResponseStatus(int expectedCode) {
            response.then().statusCode(expectedCode); // Всё просто, как ёклмн
        }
    }

И в чём, собственно, профит, чувак?

  • Прозрачность овердохуища: Любой менеджер или аналитик может заглянуть в .feature файл и понять, что мы тут вообще тестируем, без необходимости вникать в код. Сам от себя охуевал, насколько это работает.
  • Документация, которая живая: Этот набор сценариев — он же и есть спецификация. Не пыльный документ, а то, что реально запускается и проверяет систему.
  • Фокус на сути: Тесты смотрят на то, что система делает, а не как она это делает внутри. Это делает их крепче, они меньше ломаются из-за мелких внутренних изменений.