Behavior-Driven Development, BDD, is an Agile software development process that encourages collaboration among developers, QA and non-technical or business participants in a software project.
TOC
It encourages teams to use conversation and concrete examples to formalize a shared understanding of how the application should behave. It emerged from test-driven development (TDD). Behavior-driven development combines the general techniques and principles of TDD with ideas from domain-driven design and object-oriented analysis and design to provide software development and management teams with shared tools and a shared process to collaborate on software development.
Similar process as TDD at the level of features, based on user needs. Use natural languages to create examples by structuring a bridge between “world of programming” and “natural language”. To make the examples executable: Scenarios (how the software behaves from the stand point of user).
Principles of BDD
Test-Driven Development (TDD) is a software-development methodology which essentially states that for each unit of software, a software developer must:
define
a test set for the unit firstmake
the tests failthen
implement the unitfinally
verify that the implementation of the unit makes the tests succeed
Behavioral specifications
BDD specifies that business analysts and developers should collaborate in this area and should specify behavior in terms of user stories, which are each explicitly written down in a dedicated document
. Each User Story should, in some way, follow the following structure:
- Title
- An explicit title.
- Narrative
- A short introductory section with the following structure:
As a
: the person or role who will benefit from the featureI want
: the featureso that
: the benefit or value of the feature
- A short introductory section with the following structure:
- Acceptance criteria
- A description of each specific scenario of the narrative with the following structure:
Given
: the initial context at the beginning of the scenario, in one or more clausesWhen
: the event that triggers the scenarioThen
: the expected outcome, in one or more clauses
- A description of each specific scenario of the narrative with the following structure:
Example:
Title: Returns and exchanges go to inventory.
As a store owner,
I want to add items back to inventory when they are returned or exchanged,
so that I can track inventory.
Scenario 1: Items returned for refund should be added to inventory.
Given that a customer previously bought a black sweater from me
and I have three black sweaters in inventory,
when they return the black sweater for a refund,
then I should have four black sweaters in inventory.
Scenario 2: Exchanged items should be returned to inventory.
Given that a customer previously bought a blue garment from me
and I have two blue garments in inventory
and three black garments in inventory,
when they exchange the blue garment for a black garment,
then I should have three blue garments in inventory
and two black garments in inventory.
Resources
Java
JBehave
Input document that JBehave reads.
JBehave recognizes the terms Given
(as a precondition which defines the start of a scenario), When
(as an event trigger) and Then
(as a postcondition which must be verified as the outcome of the action that follows the trigger).
src
main
test
java
com
quanpan302
bdd
"package-info.java"
"CellGame.java", import net.serenitybdd.jbehave.SerenityStories;
"CellSteps.java", import org.junit.Assert.*;
resources
com
quanpan302
bdd
"cell_game.story"
Input file that JBehave reads.
// cell_game.story
Given a 5 by 5 game
When I toggle the cell at (3, 2)
Then the grid should look like
.....
.....
.....
..X..
.....
When I toggle the cell at (3, 1)
Then the grid should look like
.....
.....
.....
..X..
..X..
When I toggle the cell at (3, 2)
Then the grid should look like
.....
.....
.....
.....
..X..
Java script that JBehave executes.
// CellSteps.java
private Game game;
private StringRenderer renderer;
@Given("a $width by $height game")
public void theGameIsRunning(int width, int height) {
game = new Game(width, height);
renderer = new StringRenderer();
game.setObserver(renderer);
}
@When("I toggle the cell at ($column, $row)")
public void iToggleTheCellAt(int column, int row) {
game.toggleCellAt(column, row);
}
@Then("the grid should look like $grid")
public void theGridShouldLookLike(String grid) {
assertThat(renderer.asString(), equalTo(grid));
}
Selenium
Selenium automates browsers.
Javascript
Mocha
var assert = require('assert');
describe('Array', function () {
describe('#indexOf()', function () {
it('should return -1 when the value is not present', function () {
assert.equal([1, 2, 3].indexOf(4), -1);
});
});
});
Jasmine
describe("A suite is just a function", function() {
var a;
it("and so is a spec", function() {
a = true;
expect(a).toBe(true);
});
});