Testing applications is one of the most important thing in a developer’s toolbox.
Sometime writing tests is not so straightforward and as time goes by you notice that you have to maintain your application and your tests too.
The purpose of this talk is to show how to test your domain at different layers with different test frameworks, in order to ease the development process and transform your codebase in a stronghold.
11. 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());
}
}
12. 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
15. DESCRIBING A STORY
Feature:
As a [role]
I want [feature]
So that [benefit]
Scenario: scenario description
Given [context]
When [event]
Then [outcome]
16. A DIFFERENT CYCLE
Write an acceptance test
(Given/When/Then)
Discover ‘verbs’, ‘nouns’
and write a failing step
definition
17. 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
18. 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
19. 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
21. 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
23. 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);
}
24. /**
* @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
25. /**
* @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
26. DESCRIBETHE 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
29. 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
30. THETICKET 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);
}
}
31. 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
33. THE SHOPPING CART OBJECT
class 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;
}
}
34. 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