Разделы портала

Онлайн-тренинги

.
Основы BDD: Фреймворки
13.06.2018 12:57

Оригинал статьи: http://automationpanda.com/2017/02/04/bdd-101-frameworks/

Перевод: Анна Радионова

В любом из основных языков программирования существуют BDD фреймворки автоматизации. В некоторых даже не один. Основываясь на структурных принципах, описанных в предыдущей статье, в этой я представляю обзор основных фреймворков, существующих сегодня. Поскольку я вряд ли смогу рассмотреть подробно каждый BDD фреймворк в рамках этой серии, состоящей из 101 статьи, моей целью является помочь вам, читатели, выбрать фреймворк, наиболее подходящий именно вам. Для каждого фреймворка имеется сопроводительная online документация с информацией о его специфике и способах использования, но я бы предпочел не дублировать документацию. Используйте эту статью, главным образом, как справочный материал. (Полный список статей можно найти на странице Automation Panda BDD.)

Основные фреймворки

Большинство BDD фреймворков - это различные версии Cucumber, производные от фреймворка JBehave, написанные в стиле его создателя Дена Норта (Dan North), или non-Gherkin спек-раннеры. Некоторые организуют поведенческие сценарии в отдельные файлы, в то время как другие размещают их непосредственно в исходном коде.

C# и Microsoft .NET

SpecFlow является, пожалуй, самым популярным BDD фреймворком для языков Microsoft .NET. Его слоган звучит как “Cucumber для .NET” – поэтому он полностью совместим с Gherkin. Основной пакет фреймворка бесплатный и опенсорсный, но лицензии на расширения SpecFlow+ являются платными. Бесплатная версия требует установки юнит-тест раннера такого как, например, MsTest, NUnit или xUnit.net для запуска сценариев. Это делает использование SpecFlow удобным, но в то же время оставляет ощущение некоторой топорности фреймворка. В лицензионной версии предоставляется легкий раннер под названием SpecFlow+ Runner (который совместим с BDD) и инструмент для интеграции с Microsoft Excel под названием SpecFlow+ Excel. Имеются SpecFlow расширения для Microsoft Visual Studio, облегчающие разработку.

Существует множество других BDD фреймворков для C# и .NET. Как альтернативу можно рассматривать xBehave.net, который хорошо работает в паре с xUnit.net. Основное отличие xBehave.net заключается в том, что пошаговые сценарии пишутся непосредственно в коде, а не в отдельных текстовых (так называемых feature) файлах. LightBDD позиционируется как более легковесный, по сравнению с остальными, фреймворк и, как правило, применяет некоторые приемы при работе с  partial (частичными) классами для большей читабельности кода. NSpec похож на RSpec и Mocha и активно использует лямбда-выражения. Concordion также предлагает несколько интересных решений написания spec-ов. NBehave производный от JBehave фреймворк, но с 2014 года в нем не производилось никаких обновлений, поэтому можно считать этот проект мертвым.

Java и JVM языки

Основными конкурентами в Java являются фреймворки Cucumber-JVM и JBehave. Cucumber-JVM - официальная версия Cucumber для языка Java и других JVM языков (Groovy, Scala, Clojure и т.д.). Он полностью совместим с Gherkin и генерирует красивые отчеты. Драйвер Cucumber-JVM также может быть кастомизирован. JBehave является одним из первых и наиболее распространенных BDD фреймворков на рынке. Его разработал Dan North, который считается “отцом BDD.” Однако, в JBehave отсутствуют ключевые особенности Gherkin, такие как backgrounds, doc strings и tags. Также он являлся первым решением на чистой Java и существовал еще до появления Cucumber-JVM. Оба фреймворка широко используются, для них имеются плагины в большинстве IDE и устанавливаются с помощью Maven пакетов. В популярной, но довольно старой статье сравниваются эти два фреймворка и автор склоняется в пользу JBehave, но, я считаю, что Cucumber-JVM лучше учитывая уровень фич и поддержки обоих.

Статья в моем блоге Cucumber-JVM for Java содержит подробные инструкции по использованию Cucumber-JVM фреймворка.

В языке Java существует множество других BDD фреймворков. JGiven использует fluent API для написания сценариев, а красивые HTML отчеты выводят сценарии вместе с результатами. Его синтаксис вполне лаконичен. Spock и JDave представляют собой spec фреймворки, но JDave не развивается в течение нескольких последних лет. Scalatest для языка Scala также основан на spec компонентах. У Concordion также есть решение для Java.

JavaScript

Почти все JavaScript BDD  фреймворки работают на Node.js. Mocha - это многоцелевой тестовый фреймворк, который преобразовывает фразы на английском языке в код спецификаций. Jasmine похож на Mocha фреймворк, но по нему гораздо меньше обучающего материала. Cucumber предоставляет решение Cucumber.js для полной совместимости с Gherkin. Yadda чем-то напоминает  Gherkin, но с более гибким синтаксисом. Vows предоставляет другой тип к поведенческого подхода с использованием более формализованных делений фразовых конструкций для обеспечения уникальности при их переиспользовании. Сравнительные статьи по ним можно найти здесь, здесь, здесь и здесь. В блоге Cucumber ведутся споры на тему того, что Cucumber.js лучший, благодаря тому, что его фокус направлен на достижение лучшей коммуникации посредством описания шагов человеко-читаемым текстом, в то время как в других JavaScript BDD фреймворках больше кода, чем лингвистических средств.

PHP

Два основных BDD фреймворка для PHP - это Behat и Codeception. Behat является официальной версией Cucumber для PHP, и, собственно, считается более “чистым” BDD фреймворком. Codeception носит большую программерскую направленность и может использоваться для написания других видов тестов. Существует большое количество статей со сравнительным анализом обоих – здесь, здесь и здесь (хотя последняя, кажется, очень устарела). Оба фреймворка довольно хороши, но Codeception кажется более гибким.

Python

У Python имеется множество тестовых фреймворков и многие являются именно BDD фреймворками. behave и lettuce, наверное, два наиболее значимых “игрока”. Сравнение характеристик аналогично сравнению Cucumber-JVM и JBehave, соответственно: behave полностью совместим Gherkin, в то время как у lettuce нет некоторых лингвистических элементов. Оба имеют плагины для основных IDE. radish - еще один фреймворк, который расширяет язык Gherkin с целью возможности использования сценарных циклов, сценарных предусловий и переменных. Все три записывают сценарии в отдельные feature файлы. Все они внедряют определение шагов в виде функций вместо классов, что не только упрощает описание шагов и делает их использование более независимым, но и помогает избежать ненужных объектных конструкций.

Существуют и другие Python фреймворки. pyspecs - spec-ориентированный фреймворк. pytest-bdd добавляет некоторые Gherkin фичи в популярную библиотеку pytest. Freshen являлся BDD плагином для Nose, но они оба, проекты Freshen и Nose, прекращены.

Ruby

Cucumber, являющийся золотым стандартом BDD фреймворков, впервые был выпущен на языке Ruby. Cucumber поддерживает официальный стандарт языка Gherkin и все версии Cucumber написаны на основе оригинальной на Ruby. Spinach позиционируется как улучшенный Cucumber с доработанным функционалом инкапсуляции шагов. RSpec spec-ориентированный фреймворк, не использующий Gherkin.

Какой фреймворк лучше?

На этот вопрос нет правильного ответа – лучший BDD фреймворк - это тот, который лучше всего удовлетворяет ваши потребности. Однако, нужно учитывать несколько моментов при выборе:

  • Какой язык программирования мне использовать для автоматизации? (What programming language should I use for test automation?)
  • Является ли этот фреймворк популярным и широко используемым?
  • Активно ли поддерживается фреймворк?
  • Язык спецификаций совместим с Gherkin?
  • Для какого вида тестирования вы будете использовать фреймворк?
  • Какие ограничения устанавливаются фреймворком в сравнении с другими?

Фреймворки, которые отделяют текст сценариев от кода хороши для shift-left тестирования. Фреймворки, которые определяют текст сценариев непосредственно в исходный код, лучше подходят для тестирования “белого ящика”, но они могут быть непонятны менее опытным разработчикам. Лидерами моего списка фаворитов являются Cucumber-JVM, SpecFlow и behave. На моей текущей работе я использую SpecFlow и отдаю ему предпочтение среди других .NET фреймворков. Я бы хотел лучше изучить radish и попробовать JGiven для написания unit-тестов. Для лучшей взаимозаменяемости я также рекомендую выбирать фреймворк совместимый с Gherkin.

Справочная таблица

В таблице ниже приведена классификация BDD фреймворков с указанием их языка программирования. В ней также приводятся фреймворки языков, не описанных в статье. Рекомендуемые к использованию фреймворки отмечены звездочкой (*). Неразвивающиеся проекты отмечены крестиком X (x).

Язык

Фреймворк

Тип

C

Catch

In-line Spec

C++

Igloo

In-line Spec

C# and .NET

Concordion

LightBDD

NBehave x

NSpec

SpecFlow *

xBehave.net

In-line Spec

In-line Gherkin

Separated semi-Gherkin

In-line Spec

Separated Gherkin

In-line Gherkin

Golang

Ginkgo

In-line Spec

Java and JVM

Cucumber-JVM *

JBehave

JDave x

JGiven *

Scalatest

Spock

Separated Gherkin

Separated semi-Gherkin

In-line Spec

In-line Gherkin

In-line Spec

In-line Spec

JavaScript

Cucumber.js *

Jasmine

Mocha

Vows

Yadda

Separated Gherkin

In-line Spec

In-line Spec

In-line Spec

Separated semi-Gherkin

Perl

Test::BDD::Cucumber

Separated Gherkin

PHP

Behat

Codeception *

Separated Gherkin

Separated or In-line

Python

behave *

freshen x

lettuce

pyspecs

pytest-bdd

radish *

Separated Gherkin

Separated Gherkin

Separated semi-Gherkin

In-line Spec

Separated semi-Gherkin

Separated Gherkin-plus

Ruby

Cucumber *

RSpec

Spinach

Separated Gherkin

In-line Spec

Separated Gherkin

Swift / Objective C

Quick

In-line Spec

Обсудить в форуме