TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf ·...

26
TDD+BDD (in PHP) ing. enrico bono senior full stack web dev @

Transcript of TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf ·...

Page 1: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

TDD+BDD

(in PHP)

ing. enrico bono

senior full stack web dev @

Page 2: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

RAISE YOUR HAND IF… You've ever tested your code

You test your code every day

You like the smell of phpunit in the morning

Page 3: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

TESTS? Software development process:

Client needs

Planning

Designing

Implementation,1 Testing (and Documenting)

Deployment

(Maintenance)

1 Implementation: never ending fight between developer and bugs

Page 4: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

TESTS (IN CI)? Software development process:

Client needs

Planning

Designing

Implementation (and Documenting)

Testing → Deployment

(Maintenance)

Page 5: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

WHY TEST AT ALL Win the battle against bugs!

Prove our code works → Get paid

Speed implementation up:

Lower debug time

Avoid manual repetitive tasks

Better code maintainability:

Code something without breaking something else

Refactor something without breaking something else

Modernize legacy code without breaking everything!

Better performance

Page 6: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

HOW TO TEST Automated. Suite. (of) Test cases

Test case:

A set of conditions that asserts a software/system/class/method/... is

working as it was originally designed

Test case structure:

Setup

Execute

Validations/Assertions

Cleanup (if any)

Page 7: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

EXAMPLE

Page 8: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

EXAMPLE

Page 9: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

LIVE EXAMPLE Run single test

Run full suite

Break test

Page 10: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

TEST TYPESMany types of test types.

Usually:

Unit tests (multiple test cases per method, corner cases)

Integration/Functional tests

Acceptance tests

End-to-end (E2E) tests

Regression tests

Performance testing

Load testing

Page 11: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

TEST TOOLS (IN PHP) Unit tests → PHPUnit, Atoum, PHPSpec, ...

Integration/Functional tests → PHPUnit, Behat

Acceptance tests → PHPUnit, Codeception, ...

End-to-end (E2E) tests → Codeception, Selenium WebDriver, (Protractor), ...

Regression tests

Performance testing

Load/Stress testing → Apache Benchmark, ...

Page 12: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

PHPUNIT Fast (without XDebug)

Furious: usually used for Unit Testing, can be used for functional testing

Quick setup

Mainstream, well supported, well documented, lots of options… a standard

Slow for code coverage

Page 13: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

CODE COVERAGE

Page 14: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

CODE COVERAGE

Page 15: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

CODE COVERAGE: THE G WAY

Page 16: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

TDD: TEST DRIVED DEVELOPMENT Write tests before implementing the code → Code coverage = 100%

Development cycle:

Write test(s)

Run the tests → red

Write the code (quick and dirt)

Run the tests → green

(Break the tests → red)

Run full suite

Refactor code and tests

Repeat (ad libitum sfumando)

Page 17: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

PHPUNIT: LIVE EXAMPLE Implement some additional feature on the Cart class

→emptyCart() →removeProduct() ...

Page 18: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

BDD: BEHAVIOUR DRIVEN DEV Common language between dev and product owner

The product owner can read or even write a test (story)!

Business is tied to the actual code

Devs know what test to accomodate

Code is self documenting!

Stories are easy to read

Page 19: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

WHAT'S THE STORYA story is a conversation between several people/actors/avatar.

• Every avatar is a well defined character.

The title should be an activity

The narrative should include a role, a feature and a benefit

The scenario title should say what's different

The scenario should be described in terms of Gives, Events and Outcomes

Page 20: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

(MORNING GLORY) Narrative:

As a [role]

I want [feature]

So that [benefit]

Acceptance Criteria: (presented as Scenarios)

Scenario 1: Title

Given [context]

And [some more context]...

When [event]

Then [outcome]

And [another outcome]...

Scenario 2: ...

Page 21: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

BEHAT

Page 22: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

BEHAT: LIVE EXAMPLES Context files (005)

Pages files

Page 23: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

ACCEPTANCE TESTS: CODECEPTION

Page 24: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

E2E TESTS: PROTRACTOR

Page 25: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

TDD IT OR BURST! Habit

No pain, yes gain

Easy

Quick

ROI > 1

Code Coverage ~ 100%

WYTIWYG

Page 26: TDD+BDD - palermo.grusp.orgpalermo.grusp.org/wp-content/uploads/2017/01/2016_1110_TDDBDD.pdf · Acceptance tests → PHPUnit, Codeception, ... ... Furious: usually used for Unit Testing,

MERRY CHRISTMAS (e figli maschi)