Behat RC1

Yo-ho-ho. It’s happened. Behat RC1 was released with bunch of new features and stability improvements.

Installation

pear channel-discover pear.behat.org
pear install behat/gherkin-beta
pear install behat/behat-beta

Behat Organization

From now on, all Behat related projects will live in own GitHub organization, called Behat. And all projects there will use Behat as vendor namespace part. So, it’s very easy to remember where to find repository: BehatGherkin => https://github.com/Behat/Gherkin.

Gherkin 1.0.0RC1

The core of the Behat project always was Gherkin DSL parser. It’s Behat part, which parsed all your *.feature files and sends them to a tester. And now it’s a standalone library rewritten from scratch.
What does it mean for you, Behat users?

Cleaner

Old parser was a mess. Parser & lexer logic lived in one place and it caused lots of problems. Now it’s a clean, beautiful & fast AST parser with line-by-line lexer.

More Translations

New Gherkin parser support 42 languages out-of-the-box (thanks Cucumber ;-) ), including my favorite:

# language: en-pirate
Ahoy matey!: feature title
  In order to be a good capitan
  As a John Silver
  I need to be able to sink enemy ships

  Yo-ho-ho:
    Let go and haul something

  Heave to: attack enemy ship
    Gangway! prepare harpoo
    Aye attack!!!

  Shiver me timbers: outline title
    Blimey! I drink the <count1> bottles of rom 
    Avast! I eat <count2> chicken legs

    Dead men tell no tales:
      | count1 | count2 |
      | 23     | 122    |

You may check all available keywords for your language with:

behat --usage --lang en-pirate

Behat will print example feature with keywords for specified language.

More Verbose

The old parser was quite silent, which is bad for a parser. So the new one is super verbose with errors. It means, when you’ll try to run this feature with Behat:

Feature: Some feature

    Given something wrong

Behat will say something like:

BehatGherkinExceptionParserException: Expected Feature token, but got Step on line: 3

Which means, that Behat expects another feature (or scenario) instead of provided “free” step ;-)

Ambiguous language specification:

# language: en

# language: ru

Feature: Some feature

    Given something wrong

will cause:

BehatGherkinExceptionParserException: Ambiguous language specifiers on lines: 1 and 3

Unclosed PyString:

Feature:

    Scenario:
        Given something with:
            """
            some text

will cause:

BehatGherkinExceptionParserException: Expected PyStringOperator token, but got EOS on line: 7

etc.

Filters

Filters & loaders moved to separate Gherkin project to. And now, Gherkin comes with 3 great scenario filters:

  • Tags filter. Good old behat --tag ...
  • Name filter. Good old behat --name ...
  • Line filter. New one behat features/arguments.feature:29, which will cause to run only scenario on line 29 of file arguments.feature

More Stable

More than 130 tests, that covers almost all parser & lexer edge cases. All 42 bundled tranlslations are fully covered with unit tests.

Behat 1.0.0RC1

The Behat now lives under Behat vendor namespace too. So be careful & change old throw new EverzetBehatExceptionPending to BehatBehatExceptionPending.

New Configuration System

Behat now has new config system, based on DIC extensions. Old behat.yml file was simply DIC configuration file, which is clunky. New one is much cleaner:

paths:
  base:   features
format:
  name:   progress

Bootstrapping

Before RC1, all your require_once ... was in env.php, that evaluates before each scenario, which is not nice at all. Now Behat supports separate bootstrapping script (bootstrap.php), that evaluates only 1 time before almost any other Behat function:

<?php
// features/support/bootstrap.php
require_once 'PHPUnit/Autoload.php';
require_once 'PHPUnit/Framework/Assert/Functions.php';

Strict Mode

From now on, Behat will NOT fail if your features have pending or skipped tests by default. Behat will fail (return 1 to console) only when you have failed (red) features. It’s default behavior of Cucumber and, now, Behat to. If you still want Behat to fail on any type of status neither passed – use --strict parameter:

behat --strict features/

Available Steps

Forgot what steps is available for your features? Run:

behat --steps features/

it will cause Behat to display all available step regex’s:

'/^a file named "([^"]*)" with:$/'

'/^I run "behat ([^"]*)"$/'

'/^it should (fail|pass) with:$/'

'/^it should (fail|pass)$/'

'/^the output should contain:$/'

'/^the output should not contain:$/'

'/^display last command exit code$/'

'/^display last command output$/'

Multiline Arguments

Hate this multiline arguments in pretty formatter output? Use --no-multiline:

behat --no-multiline features/

which will turn them off in output.

Step Definition Translations

It’s hard to maintain multiple versions of your steps for community… NOT (© Borat). Behat now has feature, called step translations. It means, that you can create folder features/steps/i18n and place translation xliff’s there:

<!-- features/steps/i18n/ru.xliff --->
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
  <file original="global" source-language="en" target-language="ru" datatype="plaintext">
    <header />
    <body>
      <trans-unit id="i-have-entered">
        <source>/^I have entered (d+) into calculator$/</source>
        <target>/^Я набрал число (d+) на калькуляторе$/</target>
      </trans-unit>
      <trans-unit id="i-have-clicked-plus">
        <source>/^I have clicked "+"$/</source>
        <target>/^Я нажал "([^"]*)"$/</target>
      </trans-unit>
      <trans-unit id="i-should-see">
        <source>/^I should see (d+) on the screen$/</source>
        <target>/^Я должен увидеть на экране (d+)$/</target>
      </trans-unit>
    </body>
  </file>
</xliff>

This translations will be used to match your features. For example, this is russian translation & it will be used in all my features, written in # language: ru. Also, --steps keyword accepts additional Behat --lang option in which you can specify language in which you want to see available steps:

behat --steps --lang=ru

will print all available steps in ru (if has translation).

Formatters

Formatters were rewritten from scratch with extensibility & clean code in mind. Compare old pretty formatter with new one. It’s much cleaner, readable & extendable. Now it’s possible to extend PrettyFormatter by overriding 1-2 small methods with 3-6 LOC.

Code cleaning

Whole code was cleaned and refactored. For example, take a look at:

Every single part of Behat code was reviewed & cleaned to ease it’s future extending/enhancement.

Documentation

Documentation is work in progress (together with Mink project ;-) ) and will be available very soon & definetly before release. For now, you can use old docs & wikis, cuz it works for RC1 too.

What is RC?

By RC (release candidate) we mean, that Behat & Gherkin API is stable. It woun’t change and all later RC releases will only fix bugs. But Behat code in some places can have bugs, which will be fixed very fast with further release candidates right until 1.0.0 release. For example, while we wrote this article, RC2 was released with small bug-fix. So, you can and MUST use it now to help us with testing ;-)

Contacting

If you found some bug or you simple have question, you can always ask it on:

  • Official google group
  • Official IRC channel on Freenode: #behat
  • Through GitHub messages
  • Or by mail: everzet@knplabs.com

Also, if you found a bug, it would be super awesome if you create issue in official issue tracker.

More to come…

Stay tuned & we will suprise you many times in the coming month ;-)

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>