Top Banner
IT SHOULD! BDD IN PRACTICE
27

It should! - BDD in practice

May 10, 2015

Download

Technology

Karol Sójko

How BDD helps you solve the murder on the Orient Express
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: It should! - BDD in practice

IT SHOULD!BDD IN PRACTICE

Page 2: It should! - BDD in practice

BEHAVIOR DRIVEN DEVELOPMENT=

TEST DRIVEN DEVELOPMENTexcept it's done right

Page 3: It should! - BDD in practice

TDDIS

CODE-CENTRICWHILE

BDDIS

COMMUNICATION-CENTRIC

Page 4: It should! - BDD in practice

IT'S LIKE COKE

PEPSI =

COCA-COLAexcept it's done right

Page 5: It should! - BDD in practice

BUT THIS IS NOT ABOUT WHAT BDD MEANS

THIS IS ALL ABOUT

TOOLS

AND ...

Page 6: It should! - BDD in practice

THE MURDER ON THE ORIENT EXPRESS

Page 7: It should! - BDD in practice

MA'AM! CAN YOU TEST WHO YOU SAW?"What do you mean test? I can describe it if you like" - Ma'am

./bin/phpspec desc Suspect

Page 8: It should! - BDD in practice

THE SUSPECTS"He was one of those types, you know" - Ma'am

namespace spec\OrientExpress\Suspect;

use PhpSpec\ObjectBehavior;use Prophecy\Argument;

class SuspectSpec extends ObjectBehavior{ function it_is_initializable() { $this->shouldHaveType('OrientExpress\Suspect\Suspect'); }}

Page 9: It should! - BDD in practice

THE SUSPECTS"Don't yell at me! Be a dear and help me out." - Ma'am

Page 10: It should! - BDD in practice

THE SUSPECTS

namespace spec\OrientExpress\Suspect;

use PhpSpec\ObjectBehavior;use Prophecy\Argument;

class SuspectSpec extends ObjectBehavior{ //...

function it_should_answer_questions() { $this->answer('Are you the killer?') ->shouldReturn('Nope, not me'); }}

Page 11: It should! - BDD in practice

THE SUSPECTS

Page 12: It should! - BDD in practice

THE SUSPECTSnamespace OrientExpress\Suspect;

class Suspect{ public function answer($question) { return 'Nope, not me'; }}

Page 13: It should! - BDD in practice

THE SUSPECTS - REFACTORING MADE EASY"Oh, I just remembered!" - Ma'am

namespace spec\OrientExpress\Suspect;

use PhpSpec\ObjectBehavior;use Prophecy\Argument;

class SuspectSpec extends ObjectBehavior{ // ... function it_should_not_confess_to_wrong_questions_if_guilty() { $this->setGuilty(true); $this->answer('Are you the killer?') ->shouldReturn('Nope, not me'); }}

Page 14: It should! - BDD in practice

THE SUSPECTS - REFACTORING MADE EASY"Oh, I just remembered!" - Ma'am

namespace spec\OrientExpress\Suspect;

use PhpSpec\ObjectBehavior;use Prophecy\Argument;

class SuspectSpec extends ObjectBehavior{ // ...

function it_should_confess_to_key_question_if_guilty() { $this->setGuilty(true); $this->answer('It was you!') ->shouldReturn('Mmmkay I confess'); }}

Page 15: It should! - BDD in practice

THE SUSPECTSnamespace OrientExpress\Suspect;

class Suspect{ protected $keyQuestion = 'It was you!';

protected $guilty = false;

public function answer($question) { if ($this->guilty && $question == $this->keyQuestion) { return 'Mmmkay I confess'; }

return 'Nope, not me'; }

// ...}

Page 16: It should! - BDD in practice

SIR! CAN YOU DESCRIBE WHO SOLVED IT?

./bin/phpspec desc Detective

Page 17: It should! - BDD in practice

THE OLDSCHOOL DETECTIVE // Oppa PHPUnit style function testSolve() { // ... $crime = $this->getMock('OrientExpress\Crime\Crime', array('getSuspects')); $crime->expects($this->any()) ->method('getSuspects') ->will($this->returnValue(array($suspect1, $suspect2)); // NoOoOoooOoOoOoo!!! }

Page 18: It should! - BDD in practice

THE DETECTIVEclass DetectiveSpec extends ObjectBehavior{ // ... /** * @param OrientExpress\Crime\Crime $crime * @param OrientExpress\Suspect\Suspect $suspect1 * @param OrientExpress\Suspect\Suspect $suspect2 */ function it_should_be_able_to_solve_crimes($crime, $suspect1, $suspect2) { $crime->getSuspects() ->willReturn(array($suspect1, $suspect2)); $suspect1->answer('It was you!') ->willReturn('Nope, not me'); $suspect2->answer('It was you!') ->willReturn('Mmmkay I confess');

$this->solve($crime)->shouldReturn($suspect2); }}

Page 19: It should! - BDD in practice

THE DETECTIVEnamespace OrientExpress\Investigators;

use OrientExpress\Crime\Crime;

class Detective{ public function solve(Crime $crime) { foreach ($crime->getSuspects() as $suspect) { $answer = $suspect->answer('It was you!'); if (preg_match('/confess/', $answer)) { return $suspect; } } }}

Page 20: It should! - BDD in practice

WORKS AS DESCRIBED

Page 21: It should! - BDD in practice

WHAT ABOUT THE SCOTLAND YARD?

Page 22: It should! - BDD in practice

DOES THE POLICE FUNCTION PROPERLY?Feature: In order to know the crimes on orient express As a Scotland Yard API client I want to get access to the archives

Page 23: It should! - BDD in practice

DOES THE POLICE FUNCTION PROPERLY?Background: Given the following crimes exist: | name | | "Murder on the Orient Express" | And the following detectives exist: | name | | "Herculse Poirot" | And the following suspects exist: | name | | "Princess Dragomiroff" | | "Count Adrenyi" |

Page 24: It should! - BDD in practice

DOES THE POLICE FUNCTION PROPERLY?

Page 25: It should! - BDD in practice

Scenario: Getting data from the Scotland Yard's archives Given crime "Murder on the Orient Express" was solved by "Hercules Poirot" And crime "Murder on the Orient Express" had suspects: | name | | "Princess Dragomiroff" | | "Count Adrenyi" | When I send GET request to "/api/crimes/ORIENT_EXPRESS_CRIME_ID" Then the response should contain json: """ { "crime": { "name": "Murder on the Orient Express", "detective": { "name": "Hercules Poirot" }, "suspects": [ { "name": "Princes Dragomiroff" }, { "name": "Count Adrenyi" } ] } } """

Page 26: It should! - BDD in practice

WHY IS THIS SO IMPORTANT?BECAUSE EVERY CODE TELLS A STORY

OR AT LEAST

IT SHOULD!

Page 27: It should! - BDD in practice

?PhpSpec: Behat:

Specs:

ABOUT MEKarol Sójko

Lead Software Architect @

Twitter: Github:

https://github.com/phpspec/phpspechttps://github.com/Behat/Behat

https://github.com/karolsojko/bdd-in-practice

The Comet Cult

@karolsojkokarolsojko