Date post: | 07-Aug-2015 |
Category: |
Technology |
Upload: | andrea-giuliano |
View: | 169 times |
Download: | 0 times |
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