Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
TDD IN WORDPRESS
WPDAY PORDENONE 13-11-2015
Luca Tumedei
@lucatume
http://theaveragedev.com
PARTIAMO DA UN ESEMPIO
Ho creato un plugin
Il plugin svolge le sue funzioni sulla pagina /wpday
Se lo slug /wpdaye' gia' o...
ACCEPTANCE TEST
Questo e' un test di accettazione ("acceptance") scritto in
:Codeception
$I = new AcceptanceTester($scenar...
FUNCTIONAL/INTEGRATION TEST
Questo e' un test funzionale o di integrazione ("acceptance")
scritto in ed usandoCodeception ...
FUNCTIONAL/INTEGRATION TEST 2
Testiamo ora che un utente che puo' modificare la pagina
veda una notifica con un call to ac...
UNIT TEST
Questo e' uno unit test scritto usando :PhpUnit
public function test_notice_shows_link_to_edit_page()
{
$url = '...
TDD?
Test-Driven Development ("Sviluppo guidato dai test")
Perche'?
Come?
Come in WordPress?
PERCHE'? LE MIE RAGIONI
Possiamo parlare per ore di ragioni a favore e contro, queste
sono le mie.
Buone pratiche di progr...
BUONE PRATICHE DI PROGRAMMAZIONE
Un tweet di (quello di Laracasts)
Nessuno vuole ammettere che la maggiore parte delle buo...
ESPLORAZIONE CARATTERISTICHE
Il processo di "feature scoping" trasforma idee che sono
nella testa del cliente in codice: m...
CARATTERISTICHE E BUGS
Nuova feature? Nuovi test!
Bug? Un test che riproduce il bug!
Quali i passi per riprodurre un bug? ...
MEMORIA CONTESTUALE
Lui sa tutto... ma ha smesso di fare il
programmatore per fare la ballerina.
Le persone dimenticano. T...
PER ROMPERLO DEVI CONOSCERLO
Per essere piu' efficaci nell'uccidere gli umani
un Terminator ha una mappa dettagliata
della...
TL;DR
"Too long; did not read."
i test sono documentazione
i test costringono chi scrive codice a chiedersi se cio' che fa...
GAMIFICATION
Chi di voi sa che cosa e' questo?
RED LIGHT
GREEN LIGHT
GRATIFICAZIONE ISTANTANEA
A che punto siamo?
Cosa va? Cosa non va?
Quale il prossimo obiettivo?
COME SI FA?
Diversi approcci e framework
Io vi parlo di un approccio TDD composto da accettazione,
integrazione, unita'
Io...
APPROCCI
BDD - Behaviour-Driven Development ("Sviluppo guidato
dal comportamento")
TDD - Test-Driven Development ("Svilupp...
FRAMEWORKS
Sono tantissimi ed ognuno copre parti particolari, i principali:
Cucumber
Behat
Rspec
Codeception
PHPUnit
PHPSp...
ATTORI
E' importante capire chi e' l'attore simulato in ogni tipo di test
Accettazione - un utente che utilizza la applica...
FIXTURES
Ambiente, stato iniziale.
Impostare pre-condizioni
Eseguire una azione
Verificare effetto della azione sull'ambie...
IL COSTO DELLA SIMULAZIONE
Simulare la manipolazione di una stringa
Simulare il processo di aggiornamento del valore meta ...
LA FRAGILITA' DELLA SIMULAZIONE
Piu' una simulazione e' elaborata piu':
simula comportamenti e stati ognuno indipendenteme...
PIRAMIDE DEI TEST
Definizione varia ma circa va cosi'
100 unit tests
10 integration tests
1 acceptance test
STRUMENTI - PHPUNIT
https://phpunit.de/
libreria per il test di PHP scritto in PHP
nato per scrivere Unit Tests
permette d...
STRUMENTI - CODECEPTION
http://codeception.com/
estende
nato per scrivere Acceptance, Functional e Unit tests
le sue funzi...
STRUMENTI - WPBROWSER
https://github.com/lucatume/wp-browser
libreria di moduli aggiuntivi per
nato per facilitare la scri...
TEST SET UP - COMPOSER
https://getcomposer.org/
e' un tool scritto in PHP per gestire le
dipendenze di un progetto
il "pro...
TEST SET UP - COMPOSER 2
Una volta che e' inizializzato gli chiediamo di
installare come dipendenza del progetto
Composer
...
TEST SET UP - WPCEPT BOOTSTRAP
Inizializziamo ("bootstrap") la struttura dei tests
wpcept bootstrap
viene creato un file d...
TEST SET UP - CONFIGURAZIONE DEI MODULI
I moduli che fanno parte della libreria vengono inizializzati
con dei valori di de...
TEST SET UP - CONFIGURAZIONE DEI MODULI 2
I moduli che interagiscono con il database vanno "puntati"
su di esso
I moduli c...
TEST SET UP - GENERARE ACCEPTANCE TESTS
Generare un test di tipo Cest per la suite acceptance
wpcept generate:cest accepta...
TEST SET UP - GENERARE FUNCTIONAL TESTS
Generare un test di tipo Test per la suite acceptance
wpcept generate:wpunit funct...
TEST SET UP - GENERARE UNIT TESTS
Generare un test di tipo PHPUnit per la suite acceptance
wpcept generate:phpunit unit Ac...
TEST SET UP - WP UNIT
Il comando wpcept generate:wpunit ...genera uno
"unit" test alla maniera della Core suite
<?php
clas...
TEST SET UP - RUN
Finalmente facciamo partire i test
./bin/vendor/codecept run
DA FARE
installate WP Browser in una cartella vuota
configurate la suite
generate un WPTestCase
codecept runper controllar...
LINKS E LIBRI
Composer -
PhpUnit -
Codeception -
WP Browser -
Libro -
https://getcomposer.org/
https://phpunit.de/
http://...
FINE
Grazie a tutti dell'ascolto.
Domande?
TDD in WordPress
Upcoming SlideShare
Loading in …5
×

TDD in WordPress

1,514 views

Published on

Sviluppo guidato dai tests in ambiente WordPress. La prima parte della frase fa aggrottare la fronte in condizioni normali: in ambiente WordPress assume un che di mistico ed irraggiungibile. Non è così.

  • Be the first to comment

TDD in WordPress

  1. 1. TDD IN WORDPRESS WPDAY PORDENONE 13-11-2015 Luca Tumedei @lucatume http://theaveragedev.com
  2. 2. PARTIAMO DA UN ESEMPIO Ho creato un plugin Il plugin svolge le sue funzioni sulla pagina /wpday Se lo slug /wpdaye' gia' occupato da una vera pagina mostriamo una notice per l'utente proponendo soluzioni
  3. 3. ACCEPTANCE TEST Questo e' un test di accettazione ("acceptance") scritto in :Codeception $I = new AcceptanceTester($scenario); $I->wantTo('vedere una notifica senza potere modificare lo slug'); $I->loginAs('utente','password'); $I->activatePlugin('wpday/wpday.php') $I->see("Lo slug /wpday e' associato alla pagina "WPDay"!");
  4. 4. FUNCTIONAL/INTEGRATION TEST Questo e' un test funzionale o di integrazione ("acceptance") scritto in ed usandoCodeception PhpUnit public function test_shows_non_actionable_notice_to_not_editor() { $user = $this->getMock('WP_User'); $user->expects($this->any())->method('has_cap')->willReturn(false); global $current_user; $current_user = $user; $notice_generator = new Notice_Factory(); $notice = $notice_generator->make_notice(); $this->assertInstanceOf('NonActionableNotice', $notice); }
  5. 5. FUNCTIONAL/INTEGRATION TEST 2 Testiamo ora che un utente che puo' modificare la pagina veda una notifica con un call to action: public function test_shows_actionable_notice_to_editor() { $user = $this->getMock('WP_User'); $user->expects($this->any())->method('has_cap')->willReturn(true); global $current_user; $current_user = $user; $notice_generator = new Notice_Factory(); $notice = $notice_generator->make_notice(); $this->assertInstanceOf('ActionableNotice', $notice); }
  6. 6. UNIT TEST Questo e' uno unit test scritto usando :PhpUnit public function test_notice_shows_link_to_edit_page() { $url = 'http://local.dev/wp/wp-admin/post.php?post=2&action=edit'; $title = 'Pagina WPDay'; $sut = new ActionableNotice(); $notice_message = $sut->get_notice_for($url, $title); $expected = "<a href='{$url}'>modifica lo slug di {$title}</a>"; $this->assertContains( $expected, $notice_message); }
  7. 7. TDD? Test-Driven Development ("Sviluppo guidato dai test") Perche'? Come? Come in WordPress?
  8. 8. PERCHE'? LE MIE RAGIONI Possiamo parlare per ore di ragioni a favore e contro, queste sono le mie. Buone pratiche di programmazione Esplorazione caratteristiche Memoria contestuale Gamification
  9. 9. BUONE PRATICHE DI PROGRAMMAZIONE Un tweet di (quello di Laracasts) Nessuno vuole ammettere che la maggiore parte delle buone prassi di PHP spesso si riducono a "Bene, devi strutturarlo cosi' per poterlo testare o sostituire." @jeffrey_way
  10. 10. ESPLORAZIONE CARATTERISTICHE Il processo di "feature scoping" trasforma idee che sono nella testa del cliente in codice: ma dove avviene questa trasformazione? Si possono scrivere consegne vaghe ma non si puo' scrivere codice vago. I test costringono uno sviluppatore a porre domande al QA team, il QA team allo stratega, lo stratega al cliente.
  11. 11. CARATTERISTICHE E BUGS Nuova feature? Nuovi test! Bug? Un test che riproduce il bug! Quali i passi per riprodurre un bug? Esattemente.
  12. 12. MEMORIA CONTESTUALE Lui sa tutto... ma ha smesso di fare il programmatore per fare la ballerina. Le persone dimenticano. Tutto. Subito. I test sono memoria esterna. Fra un anno i test che ho scritto oggi funzioneranno ancora; la mia memoria...
  13. 13. PER ROMPERLO DEVI CONOSCERLO Per essere piu' efficaci nell'uccidere gli umani un Terminator ha una mappa dettagliata della anatomia umana. - Terminator 2 La necessita' di scrivere tests di accettazione, integrazione o unita' costringe a chiedersi: che cosa fa? che cosa non fa? come funziona?
  14. 14. TL;DR "Too long; did not read." i test sono documentazione i test costringono chi scrive codice a chiedersi se cio' che fa e' chiaro, se ha senso un test che fallisce segnala in maniera chiara cosa non va e dove
  15. 15. GAMIFICATION Chi di voi sa che cosa e' questo?
  16. 16. RED LIGHT
  17. 17. GREEN LIGHT
  18. 18. GRATIFICAZIONE ISTANTANEA A che punto siamo? Cosa va? Cosa non va? Quale il prossimo obiettivo?
  19. 19. COME SI FA? Diversi approcci e framework Io vi parlo di un approccio TDD composto da accettazione, integrazione, unita' Io vi parlo di test principalmente in PHP
  20. 20. APPROCCI BDD - Behaviour-Driven Development ("Sviluppo guidato dal comportamento") TDD - Test-Driven Development ("Sviluppo guidato dai test") DDD - Design-Driven Development ("Sviluppo guidato dal design") Vanno bene tutti! Basta che ne usiate uno.
  21. 21. FRAMEWORKS Sono tantissimi ed ognuno copre parti particolari, i principali: Cucumber Behat Rspec Codeception PHPUnit PHPSpec altri Io vi parlo di Codeception
  22. 22. ATTORI E' importante capire chi e' l'attore simulato in ogni tipo di test Accettazione - un utente che utilizza la applicazione mediante la sua interfaccia Integrazione - la applicazione che utilizza gli oggetti che la compongono per gesire una richiesta Unita' - un singolo ggetto/funzione che viene utilizzato da altri oggetti
  23. 23. FIXTURES Ambiente, stato iniziale. Impostare pre-condizioni Eseguire una azione Verificare effetto della azione sull'ambiente
  24. 24. IL COSTO DELLA SIMULAZIONE Simulare la manipolazione di una stringa Simulare il processo di aggiornamento del valore meta di un post Simulare il processo di login, modifica di un post, update e reload mediante interfaccia Queste simulazione hanno una crescente complessita'.
  25. 25. LA FRAGILITA' DELLA SIMULAZIONE Piu' una simulazione e' elaborata piu': simula comportamenti e stati ognuno indipendentemente variabile e' laboriosa da mantenere si presta all'abbandono
  26. 26. PIRAMIDE DEI TEST Definizione varia ma circa va cosi' 100 unit tests 10 integration tests 1 acceptance test
  27. 27. STRUMENTI - PHPUNIT https://phpunit.de/ libreria per il test di PHP scritto in PHP nato per scrivere Unit Tests permette di scrivere anche Functional Tests
  28. 28. STRUMENTI - CODECEPTION http://codeception.com/ estende nato per scrivere Acceptance, Functional e Unit tests le sue funzioni possono essere estese mediante moduli ed add-on PhpUnit
  29. 29. STRUMENTI - WPBROWSER https://github.com/lucatume/wp-browser libreria di moduli aggiuntivi per nato per facilitare la scrittura di Acceptance, Functional e Unit tests in ambiente WordPress estende la suite di tests sviluppata dal Core team Codeception
  30. 30. TEST SET UP - COMPOSER https://getcomposer.org/ e' un tool scritto in PHP per gestire le dipendenze di un progetto il "progetto" e' un plugin oppure un tema (ma anche un sito) Composer Una volta installato Composer composer init Seguono domande sul progetto...
  31. 31. TEST SET UP - COMPOSER 2 Una volta che e' inizializzato gli chiediamo di installare come dipendenza del progetto Composer wp-browser composer require --dev lucatume/wp-browser viene installato wp-browsercome dipendenza di sviluppo Segue (lunga) installazione...
  32. 32. TEST SET UP - WPCEPT BOOTSTRAP Inizializziamo ("bootstrap") la struttura dei tests wpcept bootstrap viene creato un file di configurazione di , composer.json viene creata la cartella tests Codeception
  33. 33. TEST SET UP - CONFIGURAZIONE DEI MODULI I moduli che fanno parte della libreria vengono inizializzati con dei valori di defaults vanno configurati per la installazione locale WPLoader: wpRootFolder: /Users/Luca/Sites/wp dbName: wordpress-tests dbHost: localhost dbUser: root dbPassword: password tablePrefix: wptests_ domain: wp.dev adminEmail: admin@wp.dev title: 'WordPress Tests' plugins: - plugin-a/plugin-a.php - plugin-b/plugin-b.php activatePlugins: - plugin-a/plugin-a.php - plugin-b/plugin-b.php
  34. 34. TEST SET UP - CONFIGURAZIONE DEI MODULI 2 I moduli che interagiscono con il database vanno "puntati" su di esso I moduli che "guidano" un browser vanno configurati WPWebDriver: url: 'http://wp-acceptance.dev' browser: phantomjs port: 4444 restart: true wait: 2 adminUsername: admin adminPassword: password adminUrl: /wp-admin Va fatto una volta sola!
  35. 35. TEST SET UP - GENERARE ACCEPTANCE TESTS Generare un test di tipo Cest per la suite acceptance wpcept generate:cest acceptance MyFirstAcceptance Output Test was created in plugin-a/tests/acceptance/MyFirstAcceptanceCest.php
  36. 36. TEST SET UP - GENERARE FUNCTIONAL TESTS Generare un test di tipo Test per la suite acceptance wpcept generate:wpunit functional PostSaver Output Test was created in plugin-a/tests/functional/PostSaveTest.php
  37. 37. TEST SET UP - GENERARE UNIT TESTS Generare un test di tipo PHPUnit per la suite acceptance wpcept generate:phpunit unit ActionableNotice Output Test was created in plugin-a/tests/unit/ActionableNoticeTest.php
  38. 38. TEST SET UP - WP UNIT Il comando wpcept generate:wpunit ...genera uno "unit" test alla maniera della Core suite <?php class PostSaverTest extends CodeceptionTestCaseWPTestCase { protected $backupGlobals = false; public function setUp() { // before parent::setUp(); // your set up methods here } public function tearDown() { // your tear down methods here // then parent::tearDown(); }
  39. 39. TEST SET UP - RUN Finalmente facciamo partire i test ./bin/vendor/codecept run
  40. 40. DA FARE installate WP Browser in una cartella vuota configurate la suite generate un WPTestCase codecept runper controllare che tutto vada scrivete un test scemo wpcept generate:wpunit functional SomeClass public function testICanUseWPFunctions(){ $this->assertEquals('foo/', trailingslashit('foo')); } Complimenti avete scritto un primo test per WordPress!
  41. 41. LINKS E LIBRI Composer - PhpUnit - Codeception - WP Browser - Libro - https://getcomposer.org/ https://phpunit.de/ http://codeception.com/ https://github.com/lucatume/wp-browser Growing Object-Oriented software, guided by tests
  42. 42. FINE Grazie a tutti dell'ascolto. Domande?

×