Wednesday, January 11, 2012

JBehave быстрый старт


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 класс).
  • Он определяет конфигурационные параметры для тестов. По умолчанию MostUsefulConfiguration с параметрами по умолчанию. Тестовые файлы будут загружаться из classpath, отчет будет выводиться на консоль, в текстовый файл, html и xm. Конфигурация нас устраивает, так и оставим.
  • Переопределенный метод stepsFactory создает фабрику для реализации степов. В данном случае пока один класс со степами – MySteps
    в. 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 отчет о последнем запуске
    Осталось только реализовать необходимую функциональность и радоваться прошедшим тестам.
  • 2 comments:

    1. От какого класса должен extend'иться MyStories класс?

      ReplyDelete
      Replies
      1. Насколько я помню MyStories наследуется от JUnitStory. К сожалению исходники не сохранились :(

        Delete