Книгу не читал, по этому аналогий привести не смогу
Пишу на php для веб c bdd
1. Пишу bdd story.
( в моем случае это сценарии behat)
Для меня bdd story это как функциональные и интеграционные тесты, в которых я проверяю работу всего моего продукта в целом.
Тут вынес несколько правил для себя:
1.1. Обязательно формулировать цель (название) сценария
- Я вхожу в личный кабинет
- Я создаю новую статью блога
Это поможет отстраниться от лишнего и не превратить сценарий в кашу
1.2. Писать на нативном языке без технических подробностей
Я поначалу долго сопротивлялся писать, что либо кроме файлов трансляции на русском. Но потом вкурил фишку. По сути сценарии у меня превратились не просто в тесты, а мини todo list. Всегда четкий и понятный.
А избегание технических подробностей помогает забыть о проектирование архитектуры системы на этапе написания сценария.
И мне гораздо понятнее:
- Я должен видеть "Отказано в доступе"
чем
- Статус код страницы должен быть 403
1.3. Я(Исполнитель) сценария дурак )
Сценарий не должен быть замудреным. От должен быть простой и не держать какие-либо данные "в голове".
-
2. Далее я начинаю реализовывать шаги сценария
(писать тесты)
- Если я имею на руках желтый (не реализованный) сценарий, то начинаю уже задумываться о технических подробностях которые лежат на поверхности:
Например (приведенный код это псевдокод для понятности
Я должен быть на странице "Новости"assert( $uri, '/news');
Я вижу заголовок статьи "Эта прекрасная статья"assertTextInElement('#newsTitle", $title);
- Если я имею на руках красный тест, то пришло время для кода..
3. Написание практически всего кода предшествует у меня BDDSpec
(в моем случае phpspec)
И так, я получил ошибку от bahat. Я специально настроил утилиту так что бы она ругалась ошибками разрабатываемой системы.
В итоге я получаю такую ошибку:
- uri '/new' not exist
Это для меня прямое указание к действию. т.е я должен создать новую страницу.
В рамках моей системы уже существуют правила:
- новая страница - это новое action у контролера.
- action должен вернуть массив значений для шаблона
Опираясь на это я создаю спецификацию для контроллера
class ControllerSpec {
public function it_should_show_news ()
{
$this->newsAction()->shouldBeArray();
}
}
И далее код, который пройдет этот тест:
class Controller {
public function newsAction()
{
return [];
}
}
4. После этого запустив phpspec я получил зеленый bddspec
5. После этого cнова возвращаюсь к bddstory
Получаю зеленый шаг
6. Возвращаюсь на шаг 2.
Так начинает расти система и обрастать новым протестированным функционалом.
До bdd использовал tdd c PHPUnit и был очень доволен, пока не подсел на behat + phpspec