Test Double
UN’INTRODUZIONE DI
CARMELANTONIO ZOLFO
TDD, un breve riepilogo
 Test Driven Development: metodologia di sviluppo

software che antepone la stesura di test allo ...
TDD, un breve riepilogo
 Perché scrivere prima il test?
 Previene/fa regredire/mette in luce bug;
 Assicura copertura d...
TDD, un breve riepilogo
 Come deve essere un buon test?
 Automatizzato;
 Isolato;
 Ripetibile;
 Facile da scrivere, l...
Fasi di un test

 SUT: system under test (classe, oggetto o metodo testato)
Fasi di un test

VS metodo scientifico

 Ipotesi
 Tesi
 Dimostrazione
Test classico 1/2
class OrderTest extends PHPUnit_Framework_TestCase {
const DISARONNO = ‘Amaretto di Saronno’;
const BACA...
Test classico 2/2
public function testFillingRemovesInventoryIfInStock()
{
$order = new Order(self::DISARONNO, 51);
$order...
Test Double
Test Double, quando entrano in gioco?
Indirect output

Indirect input

 DOC: depended on component
Test Double, quando entrano in gioco?
Indirect output

Indirect input

 Il Test Double sostituisce il DOC in fase di test
Test Double, varianti
 Dummy Object: un placeholder passato al SUT ma





mai utilizzato
Test Stub: sostituisce un D...
Test Double – Mock 1/2
class OrderTest extends PHPUnit_Framework_TestCase
{
const DISARONNO = ‘Amaretto di Saronno’;
publi...
Test Double – Mock 2/2
$this->assertTrue($order->isFilled()); //verify
}
public function testFillingDoesNotRemoveIfNotEnou...
Test Double – Stub 1/2
interface MailService {
public function send (Message $msg);
}
class MailServiceStub implements Mai...
Test Double – Stub 2/2
class OrderTest extends PHPUnit_Framework_TestCase
{
…
public function testOrderSendsMailIfUnfilled...
Test Double – Stub vs Mock as Spy
class OrderTest extends PHPUnit_Framework_TestCase
{
…
public function testOrderSendsMai...
Credits & Contacts
 PHPUnit – manuale - http://phpunit.de/manual/
 xUnit Patterns – Test Double, Gerard Meszaros -

http...
Upcoming SlideShare
Loading in...5
×

Test double - un'introduzione (PHP)

376

Published on

An introduction to Test Double patterns (code: PHP; language: italian)

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
376
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Test double - un'introduzione (PHP)

  1. 1. Test Double UN’INTRODUZIONE DI CARMELANTONIO ZOLFO
  2. 2. TDD, un breve riepilogo  Test Driven Development: metodologia di sviluppo software che antepone la stesura di test allo sviluppo reale delle funzionalità.  Come? Scrivo test che fallisce e lo eseguo Rifattorizzo il codice Scrivo codice che soddisfi il test
  3. 3. TDD, un breve riepilogo  Perché scrivere prima il test?  Previene/fa regredire/mette in luce bug;  Assicura copertura del codice;  Permette di comprendere finalità e modalità della funzione testata;  Permette refactoring, sperimentazioni e cambiamenti nel codice preesistente
  4. 4. TDD, un breve riepilogo  Come deve essere un buon test?  Automatizzato;  Isolato;  Ripetibile;  Facile da scrivere, leggere => facile da mantenere
  5. 5. Fasi di un test  SUT: system under test (classe, oggetto o metodo testato)
  6. 6. Fasi di un test VS metodo scientifico  Ipotesi  Tesi  Dimostrazione
  7. 7. Test classico 1/2 class OrderTest extends PHPUnit_Framework_TestCase { const DISARONNO = ‘Amaretto di Saronno’; const BACARDI = ‘Bacardi Superior’; private $warehouse; public function setUp() { $this->warehouse = new Warehouse(); $this->warehouse->add(self::DISARONNO, 50); $this->warehouse->add(self::BACARDI, 25); } public function testFillingRemovesInventoryIfInStock() { $order = new Order(self::DISARONNO, 50); //fase setup II parte $order->fill($this->warehouse); //fase exercise $this->assertTrue($order->isFilled()); //fase verification $this->assertCount(0, $this->warehouse->getInventory(self::DISARONNO)); }
  8. 8. Test classico 2/2 public function testFillingRemovesInventoryIfInStock() { $order = new Order(self::DISARONNO, 51); $order->fill($this->warehouse); $this->assertFalse($order->isFilled()); $this->assertCount(50, $this->warehouse->getInventory(self::DISARONNO)); } }
  9. 9. Test Double
  10. 10. Test Double, quando entrano in gioco? Indirect output Indirect input  DOC: depended on component
  11. 11. Test Double, quando entrano in gioco? Indirect output Indirect input  Il Test Double sostituisce il DOC in fase di test
  12. 12. Test Double, varianti  Dummy Object: un placeholder passato al SUT ma     mai utilizzato Test Stub: sostituisce un DOC per avere un punto di controllo sugli indirect input necessari al SUT Test Spy: offre un punto di osservazione sugli indirect input necessari al SUT Mock Object: costituisce un punto di osservazione sugli indirect output erogati dal SUT Fake Object: sostituisce le funzionalità di un DOC con una implementazione semplificata senza fornire controllo sugli indirect input/output del SUT
  13. 13. Test Double – Mock 1/2 class OrderTest extends PHPUnit_Framework_TestCase { const DISARONNO = ‘Amaretto di Saronno’; public function testFillingRemovesInventoryIfInStock() { //setup - dati $order = new Order(self::DISARONNO, 50); $warehouseMock = $this->getMock('Warehouse', array('hasInventory', 'remove')); $warehouseMock->expects($this->at(0)) //setup - expectations ->method('hasInventory') ->with($this->equalTo(self::DISARONNO), $this->equalTo(50)) //indirect output ->will($this->returnValue(true)); //indirect input $order->fill($warehouseMock); //exercise
  14. 14. Test Double – Mock 2/2 $this->assertTrue($order->isFilled()); //verify } public function testFillingDoesNotRemoveIfNotEnoughInStock() { $order = new Order(self::DISARONNO, 51); $warehouseMock = $this->getMock('Warehouse', array('hasInventory')); $warehouseMock->expects($this->once()) ->method("hasInventory”) ->will($this->returnValue(false)); $order->fill($warehouseMock); $this->assertFalse($order->isFilled()); } }
  15. 15. Test Double – Stub 1/2 interface MailService { public function send (Message $msg); } class MailServiceStub implements MailService { private $messages = array(); public function send (Message $msg) { $this->messages[] = $msg; } public function numberSent() { return count($this->messages); } }
  16. 16. Test Double – Stub 2/2 class OrderTest extends PHPUnit_Framework_TestCase { … public function testOrderSendsMailIfUnfilled() { $order = new Order(self::DISARONNO, 51); ... $mailServiceStub = new MailServiceStub(); $order->setMailer($mailServiceStub); $order->fill($warehouse); $this->assertEquals(1, $mailer->numberSent()); } }
  17. 17. Test Double – Stub vs Mock as Spy class OrderTest extends PHPUnit_Framework_TestCase { … public function testOrderSendsMailIfUnfilled() { $order = new Order(self::DISARONNO, 51); … $mailServiceMock = $this->getMock('MailService', array('send')); $order->setMailer($mailServiceMock); $mailServiceMock->expects($this->once()) ->method("send"); $order->fill($warehouse); } }
  18. 18. Credits & Contacts  PHPUnit – manuale - http://phpunit.de/manual/  xUnit Patterns – Test Double, Gerard Meszaros - http://xunitpatterns.com/Test%20Double.html  Mocks arent Stubs, Martin Fowler - http://martinfowler.com/articles/mocksArentStubs.html Test Double, un’introduzione di Carmelantonio Zolfo carmelantonio.zolfo@gmail.com
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×