TDD in WordPress

Post on 13-Apr-2017

1,151 views 0 download

transcript

TDD IN WORDPRESSWPDAY PORDENONE 13-11-2015

Luca Tumedei@lucatume

http://theaveragedev.com

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

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

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

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

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

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

Perche'?Come?Come 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

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

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.

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

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...

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?

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

GAMIFICATIONChi di voi sa che cosa e' questo?

RED LIGHT

GREEN LIGHT

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

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

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.

FRAMEWORKSSono tantissimi ed ognuno copre parti particolari, i principali:

CucumberBehatRspecCodeceptionPHPUnitPHPSpecaltri

Io vi parlo di Codeception

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

FIXTURESAmbiente, stato iniziale.

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

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'.

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

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

PIRAMIDE DEI TESTDefinizione varia ma circa va cosi'

100 unit tests10 integration tests1 acceptance test

STRUMENTI - PHPUNIThttps://phpunit.de/

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

STRUMENTI - CODECEPTIONhttp://codeception.com/

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

PhpUnit

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

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...

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...

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

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: 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

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!

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

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

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

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

TEST SET UP - RUNFinalmente facciamo partire i test

./bin/vendor/codecept run

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!

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

FINEGrazie a tutti dell'ascolto.

Domande?