Behavior Driven Development
What is BDD & TDD
Behavior-Driven Development (BDD)
Describes the behavior of the system from the outside in
Used for Integration / Acceptance Testing
Test Driven Development (TDD)
Tests the functions of the system from the inside out
Used for unit testing
BDD
Given a set of preconditions: Things that need to happen to put the system into the state needed to perform the tests
When an event occurs: Things that the user does to interact with the system under test
Then some testable outcome is observed: The expected outcome of the actions performed by the user
BDD Tactics
Apply the "Five Why's" principle to each proposed User Story, so that its purpose is clearly related to business outcomes
Thinking "from the outside in", in other words implement only those behaviors which contribute most directly to these business outcomes, so as to minimize waste
Describe behaviors in a single notation which is directly accessible to domain experts, testers and developers, so as to improve communication
Apply these techniques all the way down to the lowest levels of abstraction of the software, paying particular attention to the distribution of behavior, so that evolution remains cheap
The 5 Why's
The "5 why's" are a way of continuously asking "why?" over an over until you get to the core of why something happened.
Examples of 5 Why's
Q. "Why did the system fail in production?" A. "we found an error condition that wasn't caught"
Q. "Why didn't we catch this condition?" A. "Because we didn't write a test case for it"
Q. "Why didn't we write a test case" A. "Because the developer wasn't trained in TDD"
Q. "Why wasn't the developer trained in TDD? A. "Because we cut the training budget"
Conclusion of The 5 Why's: Why did the system fail in production?
Because we cut the training budget and didn't properly train our new developers.
Expected Benefits of BDD
BDD offers more precise guidance on organizing the conversation between developers, testers and domain experts
Notations originating in the BDD approach, in particular the given-when-then canvas, are closer to everyday language and have a shallower learning curve compared to TDD tools
Tools targeting a BDD approach generally afford the automatic generation of technical and end user documentation from BDD "specifications"
BDD Workflow
First, the developers, testers and business folks explore the problem domain, and collaborate to produce concrete examples that describe the behavior they want.
Next, the team use Behave to run those examples as automated acceptance tests.
As the team work on the solution, Behave tells you which examples are implemented and working, and warns you about the ones that aren’t.
Before you know it, you have one document that’s both the specification and the tests for your software.
BDD Uses Gherkin Syntax
Given: the purpose of givens is to put the system in a known state before the user (or external system) starts interacting with the system (in the When steps)
When: each of these steps should describe the key action the user (or external system) performs
Then: is used to observe outcomes. The observations should be related to the business value/benefit in your feature description
And: is used for continuations. Given this And that... Then this And that... etc.
How behave works
Behave looks for a folder named features with files that have an extension of
.feature
It then looks for a folder under that called steps that contains the Python code to parse the Gherkin sentences in the feature files.
Note: There is no relationship between feature files and step files. Behave loads all of the steps regardless of how many files they are contained in
Loading Test Data
feature file:
step file:
Variable Substitution
You can use variable substitution to make the steps more generic
This step can now be used to check for any message in a response
It’s a good idea to make steps as generic as possible for maximum reuse
Feature Definition
08-Behavior-Driven-Development.pdf: P22
Environment Setup
Behave has a way to setup all of the tests in one place: environment.py
before_step(context, step)
,after_step(context, step)
: These run before and after every step. The step passed in is an instance of Step.before_scenario(context, scenario)
,after_scenario(context, scenario)
: These run before and after each scenario is run. The scenario passed in is an instance of Scenario.before_feature(context, feature)
,after_feature(context, feature)
: These run before and after each feature file is exercised. The feature passed in is an instance of Feature.before_tag(context, tag)
,after_tag(context, tag)
: These run before and after a section tagged with the given name. They are invoked for each tag encountered in the order they’re found in the feature file.before_all(context)
,after_all(context)
: These run before and after the whole shooting match.
Selenium
Selenium automates browsers. That's it!
It is a web browser driver to test web sites by interacting with the user interface just like a human would
It supports Firefox, Chrome, Safari, IE, PhantomJS
This makes it perfect for testing the integration of multiple microservices that share a common user interface
Last updated