Я хотел изучить возможность использования JBehave, чтобы формализовать определение scrums done. Идея заключалась в том, чтобы инкапсулировать определение done как сценарий JBehave. Поэтому в истинном стиле схватки я решил выделить 4 часа работы, посвященной JBehave.
С точки зрения схватки BDD может быть использован для превращения определения «сделано» в тестовый артефакт. Команда создает сценарии для каждой задачи. С JBehave файл сценария описывает требуемое поведение и шаги теста, которые он должен будет пройти, чтобы считаться выполненным. Т.е. с учетом некоторых предпосылок выполнить какое-то действие и ожидать каких-то результатов. Смотрите проект JBehave для более подробной информации, так как это всего лишь простой пример.
BDD через 4 часа?
Таким образом, сценарии — это просто текстовые файлы, описывающие необходимые функции с точки зрения ожидаемого поведения. Однако даже до разработки их можно запустить и увидеть ожидающие ожидания. Давайте рассмотрим простой пример, показывающий, кто за что отвечает в схватке. У меня уже есть проект, который я использую для изучения тестовых шаблонов, поэтому я подумал, что просто ознакомлю его с этим. Если вы хотите рабочую версию, просто возьмите форк с github.
В северном направлении У меня есть данные, используемые при тестировании сложного компонента страницы. Так что, пока не чистый сценарий, я могу сделать его существование частью Givens. В этом проекте вполне вероятно, что никаких реальных данных не требуется, но разработчик добавил бы их во время сборки.
Сначала владелец продукта и тестер создают простой файл сценария, описывающий поведение и ожидания.
Given a data fixture
When a page is created with 20 items on a page
Then expected lines on a page is 4 with data items in a line 5
Затем разработчики напишут жгут и уточнят шаги, необходимые для соответствия поведению.
Нам нужно запустить сценарий и добавить к нему шаги. Общая идея состоит в том, чтобы провести тест сценария, который затем включает в себя этапы. Это один из способов начальной загрузки шагов, доступны другие способы, включая систему Spring, которая использует SpringStepsFactory . У меня возникли проблемы с системой пружин, поскольку в моем проекте используется пружина 3, а JBehave по-прежнему заблокирован весной 2.5.6. Кроме того, я использую junit 4.8, а для пружины 2.5.6 требуется 4.4. Это в конечном итоге проблема, как и во многих проектах. Я не хотел бы связывать в тех старых версиях. На самом деле другие идеи в моем проекте мешают мне делать это тоже. Таким образом, в моем временном ящике я избегаю проблемы и загружаю вручную.
Тестовый класс Bootstrap
public class SimplePageScenario extends JUnitScenario {
public SimplePageScenario() {
super(new MostUsefulConfiguration() {
@Override
public ScenarioDefiner forDefiningScenarios() {
return new ClasspathScenarioDefiner(
new UnderscoredCamelCaseResolver(".scn"),
new PatternScenarioParser());
}
});
addSteps(new SimplePageSteps());
}
}
Перед добавлением вызова addSteps ()) сценарий показывает шаги, которые ожидают выполнения.
(org/testpatterns/scenarios/example_scenario.scn)
Scenario:
Given a spring data fixture (PENDING)
When a page is created with 20 items on a page (PENDING)
Then expected lines on a page is 4 with data items in a line 5 (PENDING)
Наконец, разработчики заполняют класс Steps, добавляя разделы, которые соответствуют ключевым словам сценария, Given, When и Then. Разработка ведется до тех пор, пока поведение не пройдет тест.
public class SimplePageSteps extends Steps {
private SimplePage page;
private final PageDataFixture dataFixture = new PageDataFixture();
@Given("a data fixture")
public void givenASpringDataFixture() {
notNull(dataFixture);
}
@When("a page is created with $itemsOnAPage items on a page")
public void createPage(int itemsOnAPage) {
page = SimplePage.newInstance(dataFixture.getDataItem(), itemsOnAPage);
}
@Then("expected lines on a page is $linesOnAPage with data items in a line $itemsInALine")
public void validatePage(int linesOnAPage, int itemsInALine) {
Map expectedLines = dataFixture.createPageExpectation(linesOnAPage, itemsInALine);
Map actualMap = page.getMap();
ensureThat(actualMap, is(expectedLines));
}
}
Хорошие моменты
- Мне нравится возможность взаимодействия ключевых участников схватки. Сотрудничество между тестировщиками и владельцем продукта является важным, поскольку оно должно прояснить вопросы о поведении на ранней стадии. Подобные преимущества появляются, когда команда разработчиков начинает понимать поведение.
- Наличие простого сценарного артефакта означает, что владелец продукта может быть связан с чем-то, что фактически становится частью непрерывной интеграции.
Плохие очки
- Бутстрап неуклюжий. Необходимость добавления шагов означает, что после создания новых сценариев разработка должна быть начата до появления ожидающих шагов. Есть и другие способы начальной загрузки. Пружинная система — это шаг в правильном направлении, на самом деле я бы хотел использовать впрыск во всем приложении. Это все еще не решает проблему необходимости что-то редактировать до появления шагов. Я бы предпочел, чтобы после создания сценария шаги автоматически находились по мере их написания и отображались как незапущенные до тех пор, пока они не будут вырезаны.
- Расширение Junit Testcase также является проблемой. Весьма вероятно, что в более сложных проектах нам понадобятся методы насмешки или весенние тесты. У них есть свои бегуны с аннотацией @RunWith. Было бы лучше, если бы был какой-то способ загрузить поведение в любой другой тестовый фреймворк.
- В моем 4-часовом временном интервале я не получил работу отчета. К сожалению, для создания отчетов требуется больше кодирования и настройки, и это далеко не просто небольшая конфигурация maven.
- При запуске из maven все не работало, пока я не настроил maven-resource-plugin для копирования файлов сценария. Это должно было просто сработать из коробки.
- Большая часть моих 4 часов была занята конфигурацией, которая была составлена тонкой документацией.
Вывод
Стоит попытаться использовать подход, основанный на поведении, используя сценарии. Я мог видеть преимущества. Не уверен, что JBehave — это решение для меня. Сложно настроить, и несовместимость с другими фреймворками на данный момент меня оттолкнет. Я найду некоторое время, чтобы взглянуть на easyb другую систему Java BDD дальше.