JBehave - это легковесный и простой в использовании фреймворк для разработки тестов используя подход BDD.Конечно существует множество расширений, такие как jbehave-web или jbehave-osgi(полный спписок расширений смотри на их проекте в github), но в данном примере я ограничусь только основными возможностями
Для начала потребуется средство сборки и управления зависимостями Maven. Скачать можно отсюда. Инструкция по установке здесь
Шаг 1. Создаем шаблон проекта
В консоли (cmd) переходим в папку, в которой хотим создать проект. Запускаем команду:
mvn archetype:generate
На вопрос "Choose a number or apply filter" вводим org.jbehave:jbehave-simple-archetype и подтверждаем выбор (жимаем 1)
Далее спросит какую использовать версию (Choose version). Вводим последнюю релизнутую, в моем случае это 3.5.4 (или номер 18)
Далее последует вопрос к какой группе будет относится проект (groupId) и имя артефакта (artifactId).
После скачивания мавеном нужных зависимостей шаблон проекта готов к использованию
Шаг 2. Смотрим что внутри
Открываем IDE и импортируем Maven проект. В IntelliJ IDEA 11 это выглядит так:
Ставим плагин для JBehave (Project->Settings->Plugins):
Смотрим на структуру проекта.
Там мы видим
a. My.story – файл, в котором описана наша история. Пока из одного сценария. Как видим нереализованные степы подсвечиваются как ошибки и ключевые слова выделены цветами. Эту приятность дает нам установленный плагинчик
б. MyStories.java – это основной класс, который используется для запуска тестов на jbehave (своего рода main класс).
в. MySteps.java - Сам класс с реализацией степов, пока пустой – в нем будем реализовывать шаги наших тестовых сценариев
Шаг 3. Попробуем реализовать простую историю
Попробуем реализовать историю удаления/добавления чисел из списка.
Выражу эту историю в формате, который обычно используется в agile процессах во время планирования:
As a [role]
I want [feature]
So that I receive [value]
Наша история, записанная в таком формате выглядит примерно так:
As a developer
I want to add and remove numbers from the list
So that I can use the basic list functionality
Это и есть наше письменное описание функциональности (Narrative)
Из описания следует как минимум 2 сценария: добавить элемент и удалить его. Так и запишем
A number can be added to the list
A number can be removed from the list
Каждый сценарий разбиваем на набор шагов Given-When-Then:
Given an empty list
When I add a number 123
Then size becomes 1 and the list contains 123
и
When I remove number 123
Then the list is empty
Попробуем запустить. Запускаем MyStories как обычный JUnit тест
Тесты прошли. Смотрим на консоль. Каждый шаг в сценарии находится в состоянии PENDING, что естественно т.к. мы ничего еще не реализовали.
Scenario: A number can be added to the list
Given an empty list (PENDING)
When I add a number 123 (PENDING)
Then size becomes 1 and the list contains 123 (PENDING)
@Given("an empty list")
@Pending
public void givenAnEmptyList(){
// PENDING
}
Напишем реализацию наших степов:
И запустим...в консоли видим, что все наши 2 сценария падают с ошибкой:
Scenario: A number can be added to the list
Given an empty list
When I add a number 123
Then size becomes 1 and the list contains 123 (FAILED)
(junit.framework.AssertionFailedError: expected:<1> but was:<0>)
Scenario: A number can be removed from the list
When I remove number 123
Then the list is empty (FAILED)
(junit.framework.AssertionFailedError: null)
Failed to run story com/amazontest/stories/my.story
junit.framework.AssertionFailedError: expected:<1> but was:<0>
at junit.framework.Assert.fail(Assert.java:47)
Если запустить мавеновский билд mvn install
То в файлике target\jbehave\view\reports.html будет красивый HTML отчет о последнем запуске
Осталось только реализовать необходимую функциональность и радоваться прошедшим тестам.
От какого класса должен extend'иться MyStories класс?
ReplyDeleteНасколько я помню MyStories наследуется от JUnitStory. К сожалению исходники не сохранились :(
Delete