+ All Categories

TDD in WordPress

Date post: 13-Apr-2017
Category:
Upload: lucatume
View: 1,151 times
Download: 0 times
Share this document with a friend
43
TDD IN WORDPRESS WPDAY PORDENONE 13-11-2015 Luca Tumedei @lucatume http://theaveragedev.com
Transcript
Page 1: TDD in WordPress

TDD IN WORDPRESSWPDAY PORDENONE 13-11-2015

Luca Tumedei@lucatume

http://theaveragedev.com

Page 2: TDD in WordPress

PARTIAMO DA UN ESEMPIOHo creato un pluginIl plugin svolge le sue funzioni sulla pagina /wpdaySe lo slug /wpday e' gia' occupato da una vera paginamostriamo una notice per l'utente proponendo soluzioni

Page 3: TDD in WordPress

ACCEPTANCE TESTQuesto 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\"!");

Page 4: TDD in WordPress

FUNCTIONAL/INTEGRATION TESTQuesto e' un test funzionale o di integrazione ("acceptance")

scritto in ed usando Codeception 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);}

Page 5: TDD in WordPress

FUNCTIONAL/INTEGRATION TEST 2Testiamo 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);}

Page 6: TDD in WordPress

UNIT TESTQuesto 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);}

Page 7: TDD in WordPress

TDD?Test-Driven Development ("Sviluppo guidato dai test")

Perche'?Come?Come in WordPress?

Page 8: TDD in WordPress

PERCHE'? LE MIE RAGIONIPossiamo parlare per ore di ragioni a favore e contro, queste

sono le mie.

Buone pratiche di programmazioneEsplorazione caratteristicheMemoria contestualeGamification

Page 9: TDD in WordPress

BUONE PRATICHE DI PROGRAMMAZIONEUn tweet di (quello di Laracasts)

Nessuno vuole ammettere che la maggiore parte delle buoneprassi di PHP spesso si riducono a "Bene, devi strutturarlo

cosi' per poterlo testare o sostituire."

@jeffrey_way

Page 10: TDD in WordPress

ESPLORAZIONE CARATTERISTICHEIl processo di "feature scoping" trasforma idee che sononella testa del cliente in codice: ma dove avviene questatrasformazione?Si possono scrivere consegne vaghe ma non si puo'scrivere codice vago.I test costringono uno sviluppatore a porre domande al QAteam, il QA team allo stratega, lo stratega al cliente.

Page 11: TDD in WordPress

CARATTERISTICHE E BUGSNuova feature? Nuovi test!Bug? Un test che riproduce il bug!Quali i passi per riprodurre un bug? Esattemente.

Page 12: TDD in WordPress

MEMORIA CONTESTUALELui sa tutto... ma ha smesso di fare ilprogrammatore 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...

Page 13: TDD in WordPress

PER ROMPERLO DEVI CONOSCERLOPer essere piu' efficaci nell'uccidere gli umani

un Terminator ha una mappa dettagliatadella anatomia umana. - Terminator 2

La necessita' di scrivere tests di accettazione, integrazione ounita' costringe a chiedersi:

che cosa fa?che cosa non fa?come funziona?

Page 14: TDD in WordPress

TL;DR"Too long; did not read."

i test sono documentazionei test costringono chi scrive codice a chiedersi se cio' che fae' chiaro, se ha sensoun test che fallisce segnala in maniera chiara cosa non va edove

Page 15: TDD in WordPress

GAMIFICATIONChi di voi sa che cosa e' questo?

Page 16: TDD in WordPress

RED LIGHT

Page 17: TDD in WordPress

GREEN LIGHT

Page 18: TDD in WordPress

GRATIFICAZIONE ISTANTANEAA che punto siamo?Cosa va? Cosa non va?Quale il prossimo obiettivo?

Page 19: TDD in WordPress

COME SI FA?Diversi approcci e frameworkIo vi parlo di un approccio TDD composto da accettazione,integrazione, unita'Io vi parlo di test principalmente in PHP

Page 20: TDD in WordPress

APPROCCIBDD - Behaviour-Driven Development ("Sviluppo guidatodal comportamento")TDD - Test-Driven Development ("Sviluppo guidato daitest")DDD - Design-Driven Development ("Sviluppo guidato daldesign")

Vanno bene tutti! Basta che ne usiate uno.

Page 21: TDD in WordPress

FRAMEWORKSSono tantissimi ed ognuno copre parti particolari, i principali:

CucumberBehatRspecCodeceptionPHPUnitPHPSpecaltri

Io vi parlo di Codeception

Page 22: TDD in WordPress

ATTORIE' importante capire chi e' l'attore simulato in ogni tipo di test

Accettazione - un utente che utilizza la applicazionemediante la sua interfacciaIntegrazione - la applicazione che utilizza gli oggetti che lacompongono per gesire una richiestaUnita' - un singolo ggetto/funzione che viene utilizzato daaltri oggetti

Page 23: TDD in WordPress

FIXTURESAmbiente, stato iniziale.

Impostare pre-condizioniEseguire una azioneVerificare effetto della azione sull'ambiente

Page 24: TDD in WordPress

IL COSTO DELLA SIMULAZIONESimulare la manipolazione di una stringaSimulare il processo di aggiornamento del valore meta diun postSimulare il processo di login, modifica di un post, update ereload mediante interfaccia

Queste simulazione hanno una crescente complessita'.

Page 25: TDD in WordPress

LA FRAGILITA' DELLA SIMULAZIONEPiu' una simulazione e' elaborata piu':

simula comportamenti e stati ognuno indipendentementevariabilee' laboriosa da manteneresi presta all'abbandono

Page 26: TDD in WordPress

PIRAMIDE DEI TESTDefinizione varia ma circa va cosi'

100 unit tests10 integration tests1 acceptance test

Page 27: TDD in WordPress

STRUMENTI - PHPUNIThttps://phpunit.de/

libreria per il test di PHP scritto in PHPnato per scrivere Unit Testspermette di scrivere anche Functional Tests

Page 28: TDD in WordPress

STRUMENTI - CODECEPTIONhttp://codeception.com/

estende nato per scrivere Acceptance, Functional e Unit testsle sue funzioni possono essere estese mediante moduli edadd-on

PhpUnit

Page 29: TDD in WordPress

STRUMENTI - WPBROWSERhttps://github.com/lucatume/wp-browser

libreria di moduli aggiuntivi per nato per facilitare la scrittura di Acceptance, Functional eUnit tests in ambiente WordPressestende la suite di tests sviluppata dal Core team

Codeception

Page 30: TDD in WordPress

TEST SET UP - COMPOSERhttps://getcomposer.org/

e' un tool scritto in PHP per gestire ledipendenze di un progettoil "progetto" e' un plugin oppure un tema (ma anche un sito)

Composer

Una volta installato Composer

composer init

Seguono domande sul progetto...

Page 31: TDD in WordPress

TEST SET UP - COMPOSER 2Una volta che e' inizializzato gli chiediamo diinstallare come dipendenza del progetto

Composerwp-browser

composer require --dev lucatume/wp-browser

viene installato wp-browser come dipendenza di sviluppo

Segue (lunga) installazione...

Page 32: TDD in WordPress

TEST SET UP - WPCEPT BOOTSTRAPInizializziamo ("bootstrap") la struttura dei tests

wpcept bootstrap

viene creato un file di configurazione di ,composer.jsonviene creata la cartella tests

Codeception

Page 33: TDD in WordPress
Page 34: TDD in WordPress

TEST SET UP - CONFIGURAZIONE DEI MODULII moduli che fanno parte della libreria vengono inizializzaticon dei valori di defaultsvanno 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: [email protected] 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

Page 35: TDD in WordPress

TEST SET UP - CONFIGURAZIONE DEI MODULI 2I moduli che interagiscono con il database vanno "puntati"su di essoI 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!

Page 36: TDD in WordPress

TEST SET UP - GENERARE ACCEPTANCE TESTSGenerare 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

Page 37: TDD in WordPress

TEST SET UP - GENERARE FUNCTIONAL TESTSGenerare 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

Page 38: TDD in WordPress

TEST SET UP - GENERARE UNIT TESTSGenerare 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

Page 39: TDD in WordPress

TEST SET UP - WP UNITIl comando wpcept generate:wpunit ... genera uno"unit" test alla maniera della Core suite

<?phpclass PostSaverTest extends \Codeception\TestCase\WPTestCase {

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(); }

Page 40: TDD in WordPress

TEST SET UP - RUNFinalmente facciamo partire i test

./bin/vendor/codecept run

Page 41: TDD in WordPress

DA FAREinstallate WP Browser in una cartella vuotaconfigurate la suitegenerate un WPTestCase

codecept run per controllare che tutto vadascrivete un test scemo

wpcept generate:wpunit functional SomeClass

public function testICanUseWPFunctions(){ $this->assertEquals('foo/', trailingslashit('foo'));}

Complimenti avete scritto un primo test per WordPress!

Page 42: TDD in WordPress

LINKS E LIBRIComposer - 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

Page 43: TDD in WordPress

FINEGrazie a tutti dell'ascolto.

Domande?


Recommended