Concurrent test frameworks

Preview:

Citation preview

CONCURRENT TEST FRAMEWORKSAndrea Giuliano@bit_shark

Andrea Giuliano@bit_sharkandreagiuliano.it

$WHOAMI

PHP TEST FRAMEWORKS

WHICH ONE SHOULD I USE?

CONCENTRATE AND ASK AGAIN

WHO SAID “ONE”?

IS THE TOOL THE PROBLEM?

LET’S START FROM THE BEGINNING

TEST DRIVEN DEVELOPMENT

Red

GreenRefactor

EMERGENT DESIGN

TDD AS A PROBLEM

TDD AS A PROBLEM

class VideoGalleryTest extends \PHPUnit_Framework_TestCase { public function testUploadVideo() { $videoGallery = new VideoGallery(); $videoGallery->upload('path/on/my/awesome/file.mp4');

$this->assertTrue(is_array($videoGallery->getVideos())); $this->assertCount(1, $videoGallery->getVideos()); $this->assertInstanceOf( Video::class, $videoGallery->getFirstVideo()); } }

TDD AS A PROBLEM

class VideoGalleryTest extends \PHPUnit_Framework_TestCase { public function testUploadVideo() { $videoGallery = new VideoGallery(); $videoGallery->upload('path/on/my/awesome/file.mp4');

$this->assertTrue(is_array($videoGallery->getVideos())); $this->assertCount(1, $videoGallery->getVideos()); $this->assertInstanceOf( Video::class, $videoGallery->getFirstVideo()); } }

testing internals

IS VERSUS DOES

IT’S ALL ABOUT BEHAVIOUR

DESCRIBING A STORY

Feature: As a [role] I want [feature] So that [benefit]

Scenario: scenario description Given [context] When [event] Then [outcome]

A DIFFERENT CYCLE

Write an acceptance test (Given/When/Then)

Discover ‘verbs’, ‘nouns’ and write a failing step

definition

A DIFFERENT CYCLE

Describe the behaviours for ‘verbs’ and ‘nouns’

Write an acceptance test (Given/When/Then)

Discover ‘verbs’, ‘nouns’ and write a failing step

definition

A DIFFERENT CYCLE

Describe the behaviours for ‘verbs’ and ‘nouns’

Write an acceptance test (Given/When/Then)

Discover ‘verbs’, ‘nouns’ and write a failing step

definition

Create object and the behavioural methods

A DIFFERENT CYCLE

Describe the behaviours for ‘verbs’ and ‘nouns’

Write an acceptance test (Given/When/Then)

Discover ‘verbs’, ‘nouns’ and write a failing step

definition

Create object and the behavioural methods

THE TOOL

composer require behat/behat --dev

DESCRIBING A STORY

Scenario: Getting the total amount for a conference ticket Given a ticket for the "PHP Day" conference priced EUR100 was added to the marketplace When a user adds the "PHP Day" ticket from the marketplace to the user's shopping cart Then the overall cart price should be EUR122

RUN THE STORY

$ bin/behat --append-snippets

VERBS, NOUNS, BEHAVIOUR DISCOVERING

/** * @Given a ticket for the :conference conference priced EUR:price * was added to the marketplace */ public function aTicketForTheConferencePriced($conference, $price) { $money = Money::EUR((int) $price); $ticket = Ticket::forConferencePriced($conference, $money); $this->marketPlace->add($ticket); }

/** * @When a user adds the ":conference" ticket * from the marketplace to the shopping cart */ public function aUserAddTheTicketToTheShoppingCart($conference) { $this->user->addTicketToCart($conference, $this->marketPlace); }

VERBS, NOUNS, BEHAVIOUR DISCOVERING

/** * @Then the overall cart price should be EUR:price */ public function theOverallCartPriceShouldBe($price) { $money = Money::EUR((int) $price); $amount = $this->user->shoppingCart()->total();

if (!$amount->equals($money)) { throw new \Exception("Cart amount is not " . $price); } }

VERBS, NOUNS, BEHAVIOUR DISCOVERING

DESCRIBE THE BEHAVIOUR

Describe the behaviours for ‘verbs’ and ‘nouns’

Write an acceptance test (Given/When/Then)

Discover ‘verbs’, ‘nouns’ and write a failing step

definition

Create object and the behavioural methods

THE TOOLS

DESCRIBING TICKET CREATION

class TicketTest extends \PHPUnit_Framework_TestCase { /** * @test */ function should_create_a_ticket_for_conference_priced() { $price = Money::EUR(1000); $ticket = Ticket::forConferencePriced( 'An awesome conference', $price );

$this->assertInstanceOf(Ticket::class, $ticket); } }

OBJECT CREATION

Describe the behaviours for ‘verbs’ and ‘nouns’

Write an acceptance test (Given/When/Then)

Discover ‘verbs’, ‘nouns’ and write a failing step

definition

Create object and the behavioural methods

THE TICKET OBJECT

class Ticket implements TicketInterface { private $event; private $price;

private function __construct($event, Money $price) { $this->event = $event; $this->price = $price; }

public static function forConferencePriced($conference, Money $price) { return new Ticket($conference, $price); } }

GOING UP

Describe the behaviours for ‘verbs’ and ‘nouns’

Write an acceptance test (Given/When/Then)

Discover ‘verbs’, ‘nouns’ and write a failing step

definition

Create object and the behavioural methods

SHOPPING CART SPECIFICATION

class ShoppingCartSpec extends ObjectBehavior { function it_should_return_the_amount_with_vat(TicketInterface $ticket) { $ticket->price()->willReturn(Money::EUR(100.00)); $this->addTicket($ticket);

$expectedMoney = Money::EUR(122.00);

$this->total()->shouldBeLike($expectedMoney); } }

THE SHOPPING CART OBJECTclass ShoppingCart { public function total() { $total = Money::EUR(0); foreach ($this->tickets as $ticket) {

$ticketPriceWithVat = Money::multiply( $ticket->price(), self::VAT );

$total = Money::add($total, $ticketPriceWithVat->amount()); }

return $total; } }

GOING UP

Describe the behaviours for ‘verbs’ and ‘nouns’

Write an acceptance test (Given/When/Then)

Discover ‘verbs’, ‘nouns’ and write a failing step

definition

Create object and the behavioural methods

THE GREEN SATISFACTION

MOVING OUTWARDLY

Domain

Application

Presentation

THE FORTRESS

joind.in/14553Please rate the talk

joind.in/14553Please rate the talk

REFERENCES

Assets:https://www.flickr.com/photos/levork/4966756896https://www.flickr.com/photos/jenny-pics/7960912752https://www.flickr.com/photos/joel_baker/12484614505https://www.flickr.com/photos/mike-f/8628898387https://www.flickr.com/photos/mike-f/8628898387https://www.flickr.com/photos/michaeljzealot/6485009571

The RSpec book, Behaviour Driven Development with RSpec, Cucumber, and Friends - D. ChelimskyKonstantin Kudryashov aka Everzet - Introducing modeling by example everzet.com/post/99045129766/introducing-modelling-by-examplea special thanks to Giulio De Donato aka liuggio

Recommended