Что такое 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