All of this has happened before, and all this will happen again. -- BSGI just watched Steve Freeman short talk "Given When Then" considered harmful (requires free login), and I was looking for some ways to cheaply eliminate duplication in Behat scenarios.
Fortunately, Behat supports Scenario Outlines for tabular data which is an 80/20 solution to transform lots of duplicated scenarios:
Scenario: 3 is Fizz Given the input is 3 When it is converted Then it becomes Fizz Scenario: 6 is Fizz too because it's multiple of 3 Given the input is 6 When it is converted Then it becomes Fizz Scenario: 2 is itself Given the input is 2 When it is converted Then it becomes 2into a table:
Scenario Outline: conversion of numbers Given the input is <input> When it is converted Then it becomes <output> Examples: | input | output | | 2 | 2 | | 3 | Fizz | | 6 | Fizz |Moreover, you can also pass tabular data to a single step with Table Nodes:
Scenario: two items in the cart Given the following items are in the cart: | name | price | | Cake | 4 | | Shrimps | 10 | When I check out Then I pay 14It takes a few minutes to learn how to do this into an existing Behat infrastructure. There are minimal changes to perform in the FeatureContext in the case of the Table Nodes, while Scenario Outlines are a pure Gherkin-side refactoring.
My code is on Github in my behat-tables-kata repository. If this reminds you of PHPUnit's @dataProvider, try to think of other patterns that can be borrowed from the xUnit world to fast-forward Cucumber and Behat development.