Можно ламмерский вопрос?
А чем это лучше чем
PHP:
if ($spaceship->getLocation() != 'space')
$errors[] = 'Должен бороздить просторы вселенной';
if ($spaceship->getTask() == 'foo')
$errors[] = 'Не должен прохлаждаться';
В чем выгода такого описания с помощью describe(), it() и проч?
Вообще, Вас стоит в целом почитать о TDD и BDD, что бы таких вопросов не задавать. Но, вкратце, я поясню.
Если Вы собираетесь ограничиться написанием нескольких простых тестов, то думать о фреймворке для тестирования Вам не обязательно. В противном случае (если кол-во тестов будет исчисляться хотя бы десятками), Вам необходимо будет решить, как минимум, следующие проблемы:
— Обеспечение независимости выполнения каждого теста (иначе у Вас какой-либо тест из сотни испортит значение переменной и Вы будете тратить драгоценное время на то, что бы найти причину того, почему тест не работает (в худшем случае, Вы этого даже не заметите и тест не будет проверять то, что должен));
— Устранение дублирований в коде (что бы протестировать какой-либо класс, надо написать код для создания и инициализации экземпляра этого класса, настройки окружения, других связанных с ним классов и т.п., а если Вы хотите обеспечить независимость выполнения тестов, то для каждого теста Вам надо будет заново выполнять этот код, т.е. выносить его в общие функции и т.п.);
— Стандартизирование стиля написание тесов (что бы тесты мог сопровождать и дописывать кто-либо кроме Вас, не превращая постепенно все это в кашу, которая в итоге будет проверять не понятно что);
— Плюс при отладке конкретного теста Вам потребуется выполнять много раз только его (не запуская тучу других тестов), а в Вашем примере сделать это кроме, как закомментировать лишние тесты, нельзя (чем грозит изменение остального кода тестов я объяснять не буду).
Решив хотя бы эти проблемы, Вы и получите свой фреймворк для тестирования.
Вообще суть BDD в том, что бы описать как должна работать программа в виде списка требований (возможно составленных вместе с заказчиком) и к каждому такому требованию «прикрепить» тестовый код, который будет проверять правильность реализации данного требования. Для этого в BDD и используются слова describe и it. Например, заказчик говорит, что корзина заказов на сайте интернет-магазина должна работать следующим образом:
— Если пользователь зарегистрирован, то должет добавляться товар в корзину;
— Если товар является телефоном, то должно выдаваться сообщение о том, что можно так же приобрести подключение у сотового оператора;
— Если пользователь не зарегистрирован, то должно выдаваться сообщение с просьбой зарегистрироваться;
— Так же должна заноситься запись в лог.
Вот Вы и описываете эти требования в виде describe/it/context:
PHP:
describe('Корзина заказов', function(){
beforeEach(function(){
// Тут размещаем код создания экземпляра корзины, пользователя,
// настройки окружения и т.п. И весь этот код будет выполняться
// заново перед каждым it(), обеспечивая независимость каждого теста.
});
describe('Пользователь зарегистрирован', function(){
describe('Добавление товара в корзину', function(){
describe('Товар является мобильным телефоном', function(){
it('Должен добавиться товар в корзину', function(){});
it('Должно выдаваться сообщение о том, что можно приобрести подключение', function(){});
});
describe('Остальные типы товаров', function(){
it('Должен добавиться товар в корзину', function(){});
it('Не должно выдаваться никаких сообщений', function(){});
});
});
// А с помощью контекстов можно это описать еще короче, избавившись
// от необходимости сопровождать два (а в реальности, скорей всего, далеко
// не два) идентичных теста в разном окружении
describe('Добавление товара в корзину', function(){
it('Должен добавиться товар в корзину', function(){});
context('Товар является мобильным телефоном', function(){
it('Должно выдаваться сообщение о том, что можно приобрести подключение', function(){});
});
context('Остальные типы товаров', function(){
it('Не должно выдаваться никаких сообщений', function(){});
});
});
});
describe('Пользователь не зарегистрирован', function(){
describe('Добавление товара в корзину', function(){
it('Должно выдаваться сообщение с просьбой зарегистрироваться', function(){});
it('Не должно добавиться товаров в корзину', function(){});
it('Должна заноситься запись в лог', function(){});
});
});
});
Надеюсь понятно, что в реальности кол-во подобных тестов будет больше и сложность сопровождение будет возрастать с каждым лишнем дублированием.