Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Mocking objects practices for Symfony
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Come si capisce che il nostro software funzi...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> is_int (2147483647) + 1 = is_int(2147483648) True Fa...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><ul><ul><ul><li>Tutti verifichiamo che il codice...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> I  test  deveno essere il  “più possibile” completi ...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Bad </li></ul><ul><li>Tanti utenti => tanti ...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Bad </li></ul><ul><li>Le nuove porzioni di s...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Bad </li></ul><ul><li>Un getter è banale </l...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Un test unitario specifica il  comportamento  di un ...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Dipendenze ? Disaccoppiamento? Isolamento? Quando è ...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Scrivere classi che siano disaccoppiate dall...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Come verifichiamo che i risultati ottenuti s...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Legacy system/code Gli strumenti con cui lavoro (fra...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Il database è spesso coinvolto E' permesso fare ques...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Lime style: include(dirname(__FILE__).'/../bootstrap...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> sfPhpunitPlugin class RepositoryTest extends PHPUnit...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> idMockStubGenerator include('/Mock-Stub-Generator/Fa...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Un esempio vale più di mille parole!
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Non utilizzando le classi reali, come faccio ad impl...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Come faccio a replicare le classi “Peer” generate da...
Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Domande?
Upcoming SlideShare
Loading in …5
×

Mocking Objects Practices

1,454 views

Published on

I test unitari sono sempre più utilizzati per verificare la correttezza del codice che scriviamo.
Ci si trova però a volte di fronte a codice scritto in maniera poco "disaccoppiata". Questo può impedirci di sostituire a runtime dei Dependent-on Object con dei Mock Object o degli Stub. Nel talk descriverò un plugin scritto per symfony (ma utilizzabile anche in altri ambiti) che permette di sostituire delle classi a runtime ridefinendole e configurandole all'interno dei test, creando un ambiente che isola il codice da verificare.

Il talk prevederà degli esempi pratici di utilizzo dello strumento descritto.

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,454
On SlideShare
0
From Embeds
0
Number of Embeds
25
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Mocking Objects Practices

  1. 1. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Mocking objects practices for Symfony
  2. 2. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Come si capisce che il nostro software funziona? </li></ul><ul><li>Il TDD </li></ul><ul><li>Centinaia, decine, unità </li></ul><ul><li>“ L'unità” fa la forza </li></ul><ul><li>Quando è difficile eseguire uno unit test </li></ul><ul><li>Esempi pratici di testing con Symfony </li></ul><ul><ul><li>Lime </li></ul></ul><ul><ul><li>PHPUnit </li></ul></ul><ul><ul><li>idMockStunGenerator </li></ul></ul>Nei prossimi 50 minuti...
  3. 3. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> is_int (2147483647) + 1 = is_int(2147483648) True False Chi esegue delle verifiche (di qualsiasi tipo) dopo aver scritto del codice?? <ul><li>1° La razza umana è “error prone” </li></ul><ul><ul><li>2° Tool </li></ul></ul><ul><ul><li>3° Automazione </li></ul></ul>Fondamentale: Il codice non è mai privo di errori!! Un esempio: Chi ha mai testato una funzione di somma?
  4. 4. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><ul><ul><ul><li>Tutti verifichiamo che il codice che scriviamo funziona </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Il TDD si usa anche in ambienti non “agili” </li></ul></ul></ul></ul>Test-Driven Development Il TDD in un'immagine: Cosa devo fare? (Design) Implementazione Lancio il test Verificato Refactoring Fallito Scrittura Test(s)
  5. 5. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> I test deveno essere il “più possibile” completi Rappresentano le nostre conoscenze (in quel momento) I test rappresentano lo stato del nostro lavoro Abbiamo introdotto errori? Niente test, niente commit. Il refactoring rende il codice pulito , comprensibile e modificabile Spaghetti code, $pippo = $k + $i??? l l Domain-driven Design rende il codice leggibile function PippoPlutoPaperino() VS function getAllButTopolino() Utilizzando il Test-Driven Development...
  6. 6. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Bad </li></ul><ul><li>Tanti utenti => tanti bug/errori </li></ul><ul><li>I minuti persi </li></ul><ul><li>Good </li></ul><ul><li>I test </li></ul><ul><li>Il metodo di risoluzione dei bug/errori </li></ul>Centinaia, ...
  7. 7. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Bad </li></ul><ul><li>Le nuove porzioni di software senza test </li></ul><ul><li>Modifiche che introducono errori </li></ul><ul><li>Good </li></ul><ul><li>Lanciare i test spesso </li></ul><ul><li>I test ci salvano dall'introduzione di errori involontari </li></ul>Decine, ...
  8. 8. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Bad </li></ul><ul><li>Un getter è banale </li></ul><ul><li>Funzione di somma? </li></ul><ul><li>Good </li></ul><ul><li>Internamente le nostre classi/funzioni si comportano correttamente </li></ul><ul><li>Le nostre classi/funzioni comunicano con l'esterno nella maniera corretta </li></ul><ul><li>Aiutano ad individuare problemi di integrazione </li></ul>Unità.
  9. 9. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Un test unitario specifica il comportamento di un metodo/una funzione o un'intera classe Un test unitario è necessariamente un test isolato Un test unitario rende esplicite le dipendenze di un metodo/oggetto rispetto ad altri metodi/oggetti Un test unitario deve prevedere la verifica di ogni comportamento dell'unità che verifica (“black box” test VS “white box” test) “ L'unità” fa la forza
  10. 10. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Dipendenze ? Disaccoppiamento? Isolamento? Quando è difficile eseguire un test unitario
  11. 11. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Scrivere classi che siano disaccoppiate dalle loro dipendenze: </li></ul><ul><ul><ul><li>Dipendenze passate nel costruttore </li></ul></ul></ul><ul><ul><ul><ul><ul><li>Public function __constructor() { ... </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>Public function __constructor(Dipendenza dip, ....) { ... </li></ul></ul></ul></ul></ul><ul><ul><ul><li>Dipendenze passate attraverso chiamate a metodi </li></ul></ul></ul><ul><ul><ul><ul><ul><li>Public function foo() { $dep = new Dependency(); .... </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>Public function foo(Dependency $dep) { .... </li></ul></ul></ul></ul></ul><ul><li>Usare Mock e Stub: </li></ul><ul><ul><ul><li>Replicano i comportamenti delle classi reali </li></ul></ul></ul><ul><ul><ul><li>Configurabili da chi scrive il test </li></ul></ul></ul>Soluzioni per eseguire dei test in isolamento
  12. 12. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> <ul><li>Come verifichiamo che i risultati ottenuti siano esatti? </li></ul><ul><ul><ul><li>Stub : verifica dello stato </li></ul></ul></ul><ul><ul><ul><li>Mock : Verifica del comportamento </li></ul></ul></ul><ul><li>Due tipi di TDD </li></ul><ul><ul><ul><li>Il TDD “ classico ” : mock/stub quando è compleso utilizzare le reali dipendenze. </li></ul></ul></ul><ul><ul><ul><li>Il TDD “ Mockist ” : usare sempre dei mock/stub </li></ul></ul></ul>Mock & Stub ref: Mock aren't Stubs <Martin Fowler> http://martinfowler.com/articles/mocksArentStubs.html
  13. 13. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Legacy system/code Gli strumenti con cui lavoro (framework) mi “impongono” la struttura del codice altri??... La decisione all'atto della progettazione non mi permette di applicare i pattern che prevedono mock e stub E quando non posso modificare il codice che verifico??
  14. 14. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Il database è spesso coinvolto E' permesso fare questo: require_once($sf_symfony_lib_dir.'/autoload/sfSimpleAutoload.class.php'); $autoload = new sfSimpleAutoload(); $autoload->addDirectory($sf_symfony_lib_dir.'/util'); $autoload->register(); E questo: new sfDatabaseManager(ProjectConfiguration::getApplicationConfiguration( 'frontend', 'test', true)); $loader = new sfPropelData(); $loader->loadData(sfConfig::get('sf_data_dir').'/fixtures'); Symfony e unit test
  15. 15. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Lime style: include(dirname(__FILE__).'/../bootstrap/unit.php'); require_once($sf_symfony_lib_dir.'/util/sfToolkit.class.php'); class myObject { public function myMethod(){} } $t = new lime_test(16, new lime_output_color()); $t->diag('isPathAbsolute()'); $t->is(sfToolkit::isPathAbsolute('/test'), true); $t->ok(sfToolkit::setObject(new myObject()) instanceof myObject); Symfony e unit test
  16. 16. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> sfPhpunitPlugin class RepositoryTest extends PHPUnit_Framework_TestCase{ public function testGetLogFromRepository() { $proxy = $this->getMock('SvnProxy'); $xml_reader = $this->getMock('SvnXmlReader'); $logcommand = $this->getMock('SvnLogCommand'); $repository = new SVNRepository($proxy, $xml_reader); $this->assertEquals('svn log -n 5', $repository->getRevisionsLog($mock_logcommand)); } … } Symfony e unit test
  17. 17. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> idMockStubGenerator include('/Mock-Stub-Generator/FakeObjectGenerator.cless.php'); $rvm = new ReturnValuesManager('SvnLogCommand'); $rvm->setReturnValue('getSubCommandName', 'subCommandName ') ->setReturnValue('getOptionList', '--option value --option value '); FakeObjectGenerator::generate($rvm, new CodeGenerator()); $t = new lime_test(9, new lime_output_color()); $svn_proxy = new SvnProxy('file:///localrepository/newProject'); $svn_proxy->setSubCommand(new SvnLogCommand()); $t->is($svn_proxy->getCommand(), 'svn --config-dir subCommandName --option value --option value '); Symfony e unit test
  18. 18. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Un esempio vale più di mille parole!
  19. 19. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Non utilizzando le classi reali, come faccio ad implementare uno unit test per la mia classe SvnRepository? Lime? PHPUnit? idMockStubGenerator? Sto sviluppando un “lettore” di log di un repository SVN remoto Ho bisogno di una classe per la lettura dei file XML. Ho bisogno di una classe per la gestione del comando SVN Ho bisogno di due classi per icomandi “log” e “diff” Ho bisogno di una classe che faccia da parser per i file diff Ho bisogno di una classe che descrive i dati ricavati dai log
  20. 20. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Come faccio a replicare le classi “Peer” generate da propel? Lime? PHPUnit? idMockStubGenerator? Sto sviluppando due classi “user” e “book” usando Symfony e propel Ho una classe utenti Ho una classe libri Voglio cercare un libro il cui titolo è uguale al mio nome
  21. 21. Mocking Object practices for Symfony Filippo De Santis <fd@ideato.it> Domande?

×