BDD на Java: как превратить тесты в документацию, которую поймут даже менеджеры

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое BDD и почему это спасёт ваш проект?

Вы когда-нибудь оказывались в ситуации, когда разработчики говорят: "Логика работает идеально", а заказчик отвечает: "Но это вообще не то, что я просил!"? Знакомо? Вот тут на сцену и выходит BDD (Behaviour-Driven Development) — разработка через поведение.

BDD на Java — это не просто модный термин. Это методология, которая стирает границу между бизнес-требованиями и кодом. Вместо того чтобы писать сухие технические тесты (как в TDD), вы пишете сценарии на понятном человеческом языке. И да, их сможет прочитать даже ваш менеджер, который думает, что "Java — это остров".

Как BDD отличается от TDD? (Спойлер: это не одно и то же)

Многие путают TDD (Test-Driven Development) и BDD. Давайте разложим по полочкам:

  • TDD: Вы пишете тест, который падает, потом пишете код, чтобы тест прошёл. Фокус — на технической реализации.
  • BDD: Вы сначала описываете поведение системы в терминах пользователя. "Когда пользователь нажимает кнопку, система делает то-то". Фокус — на бизнес-ценности.

BDD использует Gherkin — язык сценариев с ключевыми словами Given, When, Then. Выглядит это примерно так:

Feature: Вход в личный кабинет
  Scenario: Успешный вход с корректными данными
    Given пользователь находится на странице входа
    When пользователь вводит логин "admin" и пароль "12345"
    Then пользователь видит сообщение "Добро пожаловать!"

Согласитесь, это читается как инструкция, а не как техническая документация. Именно в этом сила поведенческой разработки на Java.

Инструменты для BDD в Java: выбираем фреймворк

В мире Java есть два основных игрока для BDD: Cucumber и JBehave. Давайте сравним их.

Cucumber для Java: король BDD

Cucumber — самый популярный фреймворк. Он поддерживает Gherkin из коробки, интегрируется с JUnit и TestNG, и имеет огромное комьюнити. Если вы новичок в BDD Java, начинайте с Cucumber.

JBehave: старый, но надёжный

JBehave — это "дедушка" BDD. Он менее популярен, но всё ещё используется в legacy-проектах. Его главное отличие: сценарии пишутся в текстовых файлах, а шаги привязываются через аннотации @Given, @When, @Then.

Лично я рекомендую Cucumber — у него лучше документация и больше примеров. Но если вы работаете со старым проектом, JBehave тоже сойдёт.

Пишем первый BDD-тест на Java: пошаговый гайд

Давайте перейдём от теории к практике. Создадим простой проект на Maven с Cucumber. Ваша задача — понять структуру, а не просто скопировать код.

Шаг 1: Подключаем зависимости

Добавьте в pom.xml следующие зависимости:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>7.18.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit-platform-engine</artifactId>
    <version>7.18.0</version>
    <scope>test</scope>
</dependency>

Шаг 2: Создаём feature-файл

В папке src/test/resources создайте файл login.feature:

Feature: Авторизация пользователя
  Как зарегистрированный пользователь
  Я хочу войти в систему
  Чтобы получить доступ к личному кабинету

  Scenario: Успешная авторизация
    Given пользователь открыл страницу логина
    When пользователь вводит логин "test@example.com"
    And пользователь вводит пароль "password123"
    And пользователь нажимает кнопку "Войти"
    Then пользователь перенаправляется на страницу профиля

Обратите внимание на ключевые слова: Given (контекст), When (действие), Then (результат). Это основа разработки через поведение.

Шаг 3: Пишем шаги (Step Definitions)

Теперь создаём Java-класс, который свяжет сценарий с кодом. Это сердце BDD на Java.

import io.cucumber.java.en.Given;
import io.cucumber.java.en.When;
import io.cucumber.java.en.Then;
import static org.junit.jupiter.api.Assertions.*;

public class LoginSteps {
    private String currentPage = "login";
    private boolean isLoggedIn = false;

    @Given("пользователь открыл страницу логина")
    public void пользователь_открыл_страницу_логина() {
        currentPage = "login";
        System.out.println("Открыта страница логина");
    }

    @When("пользователь вводит логин {string}")
    public void пользователь_вводит_логин(String login) {
        System.out.println("Введён логин: " + login);
    }

    @When("пользователь вводит пароль {string}")
    public void пользователь_вводит_пароль(String password) {
        System.out.println("Введён пароль: " + password);
    }

    @When("пользователь нажимает кнопку {string}")
    public void пользователь_нажимает_кнопку(String button) {
        System.out.println("Нажата кнопка: " + button);
        isLoggedIn = true; // Имитация успешного входа
    }

    @Then("пользователь перенаправляется на страницу профиля")
    public void пользователь_перенаправляется_на_страницу_профиля() {
        assertTrue(isLoggedIn, "Пользователь должен быть авторизован");
        currentPage = "profile";
        System.out.println("Перенаправление на профиль");
    }
}

Видите, как легко? Каждый шаг — это отдельный метод, который можно переиспользовать в других сценариях. Это и есть BDD: разработка через поведение в действии.

Шаг 4: Запускаем тест

Создайте класс-раннер:

import org.junit.platform.suite.api.IncludeEngines;
import org.junit.platform.suite.api.SelectClasspathResource;
import org.junit.platform.suite.api.Suite;

@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("features")
public class RunCucumberTest {
}

Запустите тест — и вы увидите в консоли зелёные строки. Поздравляю, вы только что написали свой первый BDD-тест на Java

Блоги

Рекомендаций по книгам