BDD — это методология разработки программного обеспечения, которая:
Начинаем с описания внешнего поведения, затем реализуем внутреннюю логику
Примеры вместо абстрактных требований:
Когда пользователь добавляет товар в корзину
И переходит к оформлению заказа
Тогда система должна показать форму оплаты
Пример для интернет-магазина:
Feature: Оформление заказа
Как покупатель
Я хочу оформить заказ
Чтобы получить товар
Scenario: Успешное оформление заказа
Given у меня есть товар в корзине
When я перехожу к оформлению
And заполняю данные доставки
Then я вижу страницу подтверждения
And получаем email с деталями заказа
Given(/^у меня есть товар в корзине$/) do
@product = create(:product)
@cart = create(:cart)
@cart.add_product(@product)
end
When(/^я перехожу к оформлению$/) do
visit checkout_path
end
Then(/^я вижу страницу подтверждения$/) do
expect(page).to have_content("Order confirmed")
end
describe Order do
it "calculates total with tax" do
order = build(:order, subtotal: 100)
expect(order.total).to eq(118) # 18% tax
end
end
scenario "User adds product to cart" do
visit product_path(create(:product))
click_button "Add to Cart"
expect(page).to have_css(".cart-count", text: "1")
end
Feature: Регистрация пользователя
Чтобы получить доступ к системе
Как новый пользователь
Я хочу зарегистрировать аккаунт
Scenario: Успешная регистрация
Given я на странице регистрации
When я заполняю форму валидными данными
And нажимаю "Зарегистрироваться"
Then я вижу сообщение об успешной регистрации
And получаю приветственное письмо
Given(/^я на странице регистрации$/) do
visit new_user_registration_path
end
When(/^я заполняю форму валидными данными$/) do
fill_in "Email", with: "test@example.com"
fill_in "Password", with: "password123"
end
class UsersController < ApplicationController
def create
@user = User.new(user_params)
if @user.save
UserMailer.welcome(@user).deliver_now
redirect_to root_path, notice: "Registration successful!"
end
end
end
Резюмируем: BDD — это мощная методология, которая через формализацию поведения системы на языке бизнеса помогает создавать качественное ПО, соответствующее реальным потребностям. В Ruby-экосистеме она особенно эффективна благодаря инструментам вроде Cucumber, RSpec и Capybara.