<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PHPBlog.it &#187; phpunit</title>
	<atom:link href="http://phpblog.it/tag/phpunit/feed/" rel="self" type="application/rss+xml" />
	<link>http://phpblog.it</link>
	<description>Solo un altro blog targato WordPress</description>
	<lastBuildDate>Mon, 30 Jan 2012 10:36:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Un nuovo metro per valutare i framework: dove sono i test?</title>
		<link>http://phpblog.it/2008/10/13/un-nuovo-metro-per-valutare-i-framework-dove-sono-i-test/</link>
		<comments>http://phpblog.it/2008/10/13/un-nuovo-metro-per-valutare-i-framework-dove-sono-i-test/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 05:00:12 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[dalla rete]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://phpblog.it/2008/10/13/un-nuovo-metro-per-valutare-i-framework-dove-sono-i-test/</guid>
		<description><![CDATA[Dare delle valutazioni ai vari framework di sviluppo disponibili al giorno d&#8217;oggi non è mai cosa semplice. Ne abbiamo parlato spesso anche qui in articoli passati e siamo giunti alla conclusione che oltre alle preferenze personali ogni soluzione ha pregi e difetti rispetto alle altre. Trincerarsi dietro a convinzioni o fare delle &#8220;guerre sante&#8221; per [...]]]></description>
			<content:encoded><![CDATA[<p>Dare delle valutazioni ai vari framework di sviluppo disponibili al giorno d&#8217;oggi non è mai cosa semplice. Ne abbiamo parlato spesso anche qui in articoli passati e siamo giunti alla conclusione che oltre alle preferenze personali ogni soluzione ha pregi e difetti rispetto alle altre. Trincerarsi dietro a convinzioni o fare delle &#8220;guerre sante&#8221; per i nomi che ci piacciono di più non ha senso e quello che si deve cercare di mantenere è l&#8217;obiettività.</p>
<p><span id="more-182"></span> Riguardo alla faccenda mi preme segnalare <a href="http://www.littlehart.net/atthekeyboard/2008/10/09/a-new-way-of-judging-frameworks-where-are-the-tests/" title="un nuovo punto di vista per affrontare il problema della valutazione di un framework proposto da Chris Hartjes"><strong>un nuovo punto di vista per affrontare il problema della valutazione di un framework</strong> proposto da Chris Hartjes</a> che sul suo blog parla per esperienza diretta data dall&#8217;ultimo progetto su cui sta lavorando. A poco dal rilascio (colpevolmente) si è trovato a dover scrivere dei test per verificare in modo semplice e sicuro che le varie parti funzionassero a dovere anche dopo l&#8217;inserimento di nuove funzionalità o modifiche, utilizzando Code Igniter per il progetto si è posto una semplice domanda: <strong>dove sono i test e gli strumenti per realizzarli?</strong></p>
<p>Allargando anche agli altri framework sulla piazza ne esce quanto segue:</p>
<ul>
<li>Code Igniter: 0 test per il core, atto di fede verso gli sviluppatori</li>
<li>Zend Framework: ha una grossa quantità di test che vengono richiesti per ogni contributo dalla community</li>
<li>CakePHP: vedi sopra, i test coprono l&#8217;80% del codice</li>
<li>symfon: ha il suo testing framework dalla nascita con oltre 8800 test per la copertura dell&#8217;80% del codice base</li>
</ul>
<p>Chris aggiunge che vista la disponibilità di strumenti per il testing non ci possano essere scuse per la mancanza di test a supporto delle funzionalità di un&#8217;applicazione. <strong>Pagare adesso, o paga dopo, sicuramente dovrai pagare per risolvere qualche bug nella tua applicazione. Pagare ora è semplicemente più economico.</strong></p>
<p>I test sono la prova che il codice si comporta come ci si aspetta, inoltre il codice testabile è molto spesso più facile da modificare man mano che il tempo passa.</p>
]]></content:encoded>
			<wfw:commentRss>http://phpblog.it/2008/10/13/un-nuovo-metro-per-valutare-i-framework-dove-sono-i-test/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Refactoring: migliorare la struttura del codice</title>
		<link>http://phpblog.it/2008/05/19/refactoring-migliorare-la-struttura-del-codice/</link>
		<comments>http://phpblog.it/2008/05/19/refactoring-migliorare-la-struttura-del-codice/#comments</comments>
		<pubDate>Mon, 19 May 2008 06:00:24 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[phpblog]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[code design]]></category>
		<category><![CDATA[martin fowler]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[unit test]]></category>

		<guid isPermaLink="false">http://phpblog.it/2008/05/19/refactoring-migliorare-la-struttura-del-codice/</guid>
		<description><![CDATA[Il refactoring è una pratica di sviluppo, il cui scopo fondamentale è di migliorare la struttura del codice, per favorire il riutilizzo di porzioni di esso, per migliorarne la leggibilità e prepararne l&#8217;evoluzione. Il principio fondamentale sul quale si basa il refactoring, è riassunto molto bene dalla definizione che ne da Martin Fowler, primo fra [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://172.18.0.13/wordpress/wp-content/uploads/2008/05/369500852_25a2c45a69_m.jpg" alt="migliorare la struttura del codice" />Il refactoring è una pratica di sviluppo, il cui scopo fondamentale è di migliorare la struttura del codice, per favorire il riutilizzo di porzioni di esso, per migliorarne la leggibilità e prepararne l&#8217;evoluzione. Il principio fondamentale sul quale si basa il refactoring, è riassunto molto bene dalla definizione che ne da Martin Fowler, primo fra tutti a teorizzare tale pratica: <em>Refactoring is a disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior</em>. In altre parole: il refactoring rappresenta la necessità di modificare una porzione di codice, possibilmente di dimensioni limitate, senza alterare il compito che essa svolge e quindi senza alterarne il risultato.</p>
<p><span id="more-97"></span></p>
<p>Quando si scrivono applicazioni e programmi in genere <strong>si cerca di partire sempre con il piede giusto</strong> prestando particolare attenzione alla struttura del codice per avere sorgenti &#8220;puliti&#8221; e facilmente mantenibili da noi o da terze parti. Si scrive quindi con un occhio di riguardo al futuro cercando di scrivere codice migliore e più aperto possibile. Tuttavia è pressochè certo che durante la fase di sviluppo (e non durante la progettazione o la stesura delle specifiche) <strong>il committente varierà le specifiche iniziali o i tempi ed i modi in cui vuole che la sua applicazione venga realizzata</strong>. Questo porterà inesorabilmente il programmatore di inserire parti di codice non previste, sviluppate in poco tempo e contro i propri consigli che andranno a degradare la qualità del codice prodotto facendogli perdere leggibilità ed apertura a modifiche future.</p>
<p>Purtroppo visto che i tempi da dedicare allo sviluppo sono sempre inferiori a quelli che realmente servirebbero per scrivere delle applicazioni in modo pulito e ragionato non è possibile concentrarsi contemporaneamente sulla scrittura del codice e sul suo refactoring. <strong>Quando impegnarsi quindi per migliorare il design del proprio codice?</strong> Esisteranno sicuramene molte scuole di pensiero a riguardo (se ve ne piace qualcuna in particolare ditecelo pure nei commenti) ma quella che preferisco è quella teorizzata da Fowler come &#8220;<strong>La regola del 3</strong>&#8221; (<em>Rule of Three</em>):</p>
<p><em>La prima volta che fai qualcosa, semplicemente la fai. La seconda volta che farai qualcosa di simile, probabilmente controvoglia la duplicherai comunque. La terza volta che farai qualcosa di simile sarà arrivato il momento di compiere il refactoring.</em></p>
<p>Gli approcci alle attività di refactoring sono sostanzialmente due e possono essere svolte <strong>prima</strong> di introdurre una nuova modifica o <strong>dopo</strong> la sua introduzione. Nel primo caso si tratterà di preparare il codice per ospitare nuove funzionalità andando a migliorare il design dell&#8217;applicazione dove possibile al fine di rendere meno vincolanti alcune operazioni presenti nel codice già scritto. In questo modo si potrà risparmiare tempo nel momento in cui si renderà necessaria l&#8217;implementazione di nuove funzioni. Nel secondo caso, forse quello più comune, si lavora sul codice presente al fine di migliorarne la sua strutturazione immediatamente dopo aver aggiunto una nuova funzionalità. In questo modo il codice sarà lasciato sempre nella migliore delle condizioni per poterci lavorare in seguito. Le fasi di sviluppo saranno quindi due: inizialmente ci si concentra sul raggiungimento dell&#8217;obiettivo della funzionalità per poi passare al refactoring per ristrutturare e riorganizzare quanto appena prodotto.</p>
<p><strong>Di pari passo con il refactoring va il testing che deve accompagnare l&#8217;implementazione in tutto il suo processo</strong> al fine di evitare spiacevoli sorprese al momento della messa in produzione della nuova funzionalità. Quando si applicano delle modifiche al codice sorgente è possibile che si inseriscano degli errori nel codice. Spesso capita che una modifica in un punto generi un errore in un&#8217;altra parte del programma come abbiamo visto quando abbiamo parlato di PHPUnit. Ogni volta che aggiungete una funzione scrivete subito un piccolo test che controlli il suo funzionamento, poi sviluppate la funzione ed eseguitelo. Se tutto va bene siete sicuri che il codice inserito funziona e che la modifica di questo non ha influito in modo distruttivo sul resto del codice. <strong>Quando applicate refactoring del codice eseguite spesso questi test; questo vi assicura che l&#8217;interfaccia del software sia sempre la stessa, e che tutto funzioni correttamente.</strong></p>
<p><strong>Alcuni link consigliati:</strong></p>
<ul>
<li><a href="http://www.refactoring.com/" rel="nofollow">Il sito di Martin Fowler sul Refactoring</a></li>
<li><a href="http://wiki.ugidotnet.org/default.aspx/UGIdotNETWiki/LibriSuObjectOrientedDesign.html#Refactoring">Refactoring: Improving the Design of Existing Code</a></li>
<li><a href="http://en.wikipedia.org/wiki/Refactoring" title="Code refactoring">Code refactoring</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://phpblog.it/2008/05/19/refactoring-migliorare-la-struttura-del-codice/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>10 strumenti per uno sviluppatore moderno</title>
		<link>http://phpblog.it/2008/03/27/10-strumenti-per-uno-sviluppatore-php-moderno/</link>
		<comments>http://phpblog.it/2008/03/27/10-strumenti-per-uno-sviluppatore-php-moderno/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 06:00:32 +0000</pubDate>
		<dc:creator>Davide Borsatto</dc:creator>
				<category><![CDATA[dalla rete]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[Phing]]></category>
		<category><![CDATA[PHP CodeSniffer]]></category>
		<category><![CDATA[PHPDocumentor]]></category>
		<category><![CDATA[phpUnderControl]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[Selenium Rc]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[xdebug]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://php5blog.it/2008/03/27/10-strumenti-per-uno-sviluppatore-php-moderno/</guid>
		<description><![CDATA[Tramite un giro di link partito da Technorati sono finito in una lista di dieci strumenti utili allo sviluppatore PHP. Eccoli: PHPUnit Selenium RC PHP CodeSniffer Phing XDebug PHPDocumentor phpUnderControl Zend Framework (o un framework a piacere) Subversion Jira Escludendo PHPUnit (al quale anche noi stiamo dedicando una serie di articoli), XDebug (personalmente non l&#8217;ho [...]]]></description>
			<content:encoded><![CDATA[<p>Tramite un giro di link partito da <a href="http://technorati.com/">Technorati</a> sono finito in una <a href="http://www.davedevelopment.co.uk/2008/03/20/10-tools-for-modern-php-development/">lista</a> di dieci strumenti utili allo sviluppatore PHP.</p>
<p><span id="more-74"></span></p>
<p>Eccoli:</p>
<ul>
<li><a href="http://www.phpunit.de/">PHPUnit</a></li>
<li><a href="http://selenium-rc.openqa.org/">Selenium RC</a></li>
<li><a href="http://pear.php.net/PHP_CodeSniffer">PHP CodeSniffer</a></li>
<li><a href="http://phing.info/trac/">Phing</a></li>
<li><a href="http://xdebug.org/">XDebug</a></li>
<li><a href="http://www.phpdoc.org/">PHPDocumentor</a></li>
<li><a href="http://www.phpunit.de/wiki/phpUnderControl">phpUnderControl</a></li>
<li><a href="http://framework.zend.com/">Zend Framework</a> (o un framework a piacere)</li>
<li><a href="http://subversion.tigris.org/">Subversion</a></li>
<li><a href="http://www.atlassian.com/software/jira/">Jira</a></li>
</ul>
<p>Escludendo <strong>PHPUnit</strong> (al quale anche noi stiamo dedicando <a href="http://php5blog.it/2008/03/10/phpunit-tecniche-avanzate/">una serie di articoli</a>), <strong>XDebug</strong> (personalmente non l&#8217;ho mai usato, ma ha una buona fama), <strong>PHPDoc</strong> (che conosciamo quasi tutti, e al quale credo in un futuro non troppo remoto dedicherò qualche post), a <strong>Subversion</strong> (indispensabile per lo sviluppo di software in collaborativa) e al framework di turno, gli altri strumenti mi risultano se non nuovi quantomeno poco conosciuti.</p>
<p>Cosi scopro che <strong>Selenium RC</strong> è un tool che può essere utilizzato insieme a PHPUnit allo stesso scopo; <strong>PHP CodeSniffer</strong> invece è un pacchetto disponibile su <em>Pear</em> che analizza il codice scritto e rileva eventuali infrazioni rispetto ad un insieme di standard di programmazione.</p>
<p><strong>Phing</strong> invece opera sulla falsariga di <a href="http://ant.apache.org/">Ant</a> (per Java), il quale se non ricordo male è implementato pure su symfony. Diciamo che è un utility per automatizzare certe operazioni da linea di comando.</p>
<p><strong>PHPUnderControl</strong> sinceramente ho capito solo che serve per tenere il controllo sullo stato dell&#8217;applicazione. Rimando al <a href="http://www.phpunit.de/wiki/phpUnderControl">sito</a> per ulteriori informazioni.</p>
<p>Last but not least, <strong>Jira</strong>. Da quanto leggo si tratta di un tool per il bug tracking, simile a <a href="http://trac.edgewall.org/">trac</a>., e per progetti &#8220;seri&#8221; strumenti simili sono sempre consigliati.</p>
<p>Non sono strumenti assolutamente <em>indispensabili</em>, ma almeno alcuni sono <strong>più che consigliati</strong> nella realizzazione di progetti di una certa consistenza.</p>
<p>E voi? Avete i vostri strumenti ai quali non rinuncereste mai? Ditecelo nei commenti!</p>
]]></content:encoded>
			<wfw:commentRss>http://phpblog.it/2008/03/27/10-strumenti-per-uno-sviluppatore-php-moderno/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHPUnit: tecniche avanzate</title>
		<link>http://phpblog.it/2008/03/10/phpunit-tecniche-avanzate/</link>
		<comments>http://phpblog.it/2008/03/10/phpunit-tecniche-avanzate/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 06:00:04 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[phpblog]]></category>
		<category><![CDATA[code coverage]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[unit testing]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://php5blog.it/2008/03/10/phpunit-tecniche-avanzate/</guid>
		<description><![CDATA[Continua il nostro viaggio all&#8217;interno dello unit testing, dopo l&#8217;introduzione e il passaggio dalla teoria alla pratica con i primi semplici esempi è ora di analizzare nel dettaglio le funzioni avanzate di PHPUnit. Per chi avesse cominciato a leggere la serie solo ora consiglio vivamente di fare un passo indietro ed iniziare dai post precedenti [...]]]></description>
			<content:encoded><![CDATA[<p>Continua il nostro viaggio all&#8217;interno dello unit testing, dopo <a title="l'introduzione" href="http://phpblog.it/2008/02/25/phpunit-introduzione-allo-unit-testing/">l&#8217;introduzione</a> e <a title="il passaggio dalla teoria alla pratica" href="http://phpblog.it/2008/03/03/php-unit-dalla-teoria-alla-pratica-esempi-di-utilizzo/">il passaggio dalla teoria alla pratica</a> con i primi semplici esempi è ora di analizzare nel dettaglio le funzioni avanzate di PHPUnit. Per chi avesse cominciato a leggere la serie solo ora consiglio vivamente di fare un passo indietro ed iniziare dai post precedenti al fine di avere una visione completa del quadro della situazione.</p>
<p><span id="more-56"></span></p>
<p>Se ricordate le puntate precedenti <strong>uno dei compiti di un framework come PHPUnit è quello di far risparmiare tempo al programmatore</strong> che sarà meno impegnato in compiti di debug potendosi concentrare maggiormente sullo sviluppo e l&#8217;implementazione delle funzionalità delle proprie classi. Vediamo quindi alcune delle funzioni avanzate più importanti in termini di tempo risparmiato e di utilità all&#8217;interno del framework.</p>
<p><strong>Fixtures</strong><br />
Sicuramente una delle funzionalità che permette di risparmiare più tempo quando si devono preparare ed eseguire i test per la verifica del corretto funzionamento delle nostre classi. <a title="Le fixtures permettono di partire con i test da uno stato ben preciso" href="http://www.phpunit.de/pocket_guide/3.2/en/fixtures.html">Le fixtures permettono di partire con i test da uno stato ben preciso</a> per tornarvi poi quando ogni singolo test è stato eseguito. Immaginate di dover testare dei metodi che abbiano a che fare una base di dati: invece che ripetere ogni volta il codice per la connessione al database, l&#8217;inizializzazione dei dati, la pulizia delle tabelle alla fine del test basterà definire tutte queste operazioni una singola volta per poi richiamare semplicemente il metodo così definito. I metodi in questione sono <strong>setUp()</strong> e <strong>tearDown() </strong>che conterranno rispettivamente il codice di inizializzazione e di pulizia dell&#8217;ambiente di test.  In questo modo eviteremo la scrittura di codice ridondante e renderemo più semplici e chiari i nostri test.</p>
<p>Questi due metodi vengono richiamati automaticamente dal framework ogni volta che viene eseguito un metodo di test. Inoltre,  per fare in modo che ogni test non sia per assolutamente influenzato dagli altri, i metodi vengono richiamati ogni volta su nuove istanze della classe che implementa il TestCase.</p>
<p><strong>I metodi setUp() e tearDown() sono in teoria simmetrici ma non lo sono in pratica.</strong> Infatti l&#8217;implementazione di tearDown() è richiesta solo quando nel setUp() sono state allocate risorse esterne come socket o file. Se nel setUp() sono solo stati allocati oggetti PHP appartenenti alla classe l&#8217;implementazione di tearDown() può essere tralasciata. Ad ogni modo se nel setUp() sono stati creati molti oggetti è sempre buona cosa eseguire l&#8217;unset() delle variabili che puntanto agli oggetti nel tearDown() per fare in modo che vengano gestiti dalla <a title="garbage collection" href="http://it.wikipedia.org/wiki/Garbage_collection">garbage collection</a>.</p>
<p><strong>Performance</strong><br />
Un concetto molto importante parlando di testing è sicuramente quello che riguarda le performance. Volendo eseguire dei semplici test sulle performance di un metodo possiamo ricorrere alla classe <em>PHPUnit_Extensions_PerformanceTestCase</em> da cui estendere le nostre classi di test. Grazie a questa classe possiamo verificare che il test in esame venga eseguito entro un termine di tempo ben preciso che passiamo che parametro.</p>
<p><img src="http://172.18.0.13/wordpress/wp-content/uploads/2008/03/performancetesting.png" alt="PerformanceTestCase" /></p>
<p><strong>Code coverage</strong><br />
Ora che siamo in grado di scrivere i test per il nostro codice non resta che fare di quest&#8217;esperienza un&#8217;abitudine. Lavorare con classi semplici non implica nessun tipo di problema,<strong> man mano che il codice e la portata del nostro progetto aumentano diventa più complesso anche avere una visione d&#8217;insieme dei test e dei metodi che realmente sono coperti da un test</strong>.</p>
<p><a title="Il framework PHPUnit ci viene ancora una volta in soccorso" href="http://www.phpunit.de/pocket_guide/3.2/en/code-coverage-analysis.html">Il framework PHPUnit ci viene ancora una volta in soccorso</a>: sfruttando una funzionalità di <a href="http://www.xdebug.org/">Xdebug</a> permette di analizzare la copertura del codice da parte dei test scritti. Si parla proprio di <em><strong>Code Coverage Analysis</strong> </em>ed è la rappresentazione del codice delle nostre classi che viene utilizzato mentre si eseguono i test. Grazie a quest&#8217;analisi otterremo una serie di file di report che specificano le righe di codice interessate dall&#8217;esecuzione di un determinato test. In rosso saranno evidenziate le righe non interessate, in verde quello eseguite. Sulla base dei risultati ottenuti si potranno quindi affinare i propri test al fine di ottenere una copertura del 100% del codice in esame.</p>
<p>Sulla base del randomPasswordTest per la classe di generazione casuale delle password realizzato la nella puntata precedente <a title="report di code coverage" href="http://php5blog.it/downloads/php5blog/report/">ho realizzato i report che potete analizzare qui</a>. Come potete vedere la coperturaè del 100%.</p>
<p><strong>Generazione automatica dei test</strong><br />
Aggiungendo alcune annotazioni ai metodi delle proprie classi <a title="PHPUnit fornisce la possibilità di generare automaticamente semplici test partendo dal codice sorgente stesso" href="http://www.phpunit.de/pocket_guide/3.2/en/skeleton-generator.html">PHPUnit fornisce la possibilità di generare automaticamente semplici test partendo dal codice sorgente stesso</a>. Queste annotazioni verranno interpretate da PHPUnit e serviranno da base per la generazione dei test. Si parla in questo caso di <em>Skeleton Generator.</em></p>
<p>Le annotazioni sui test da far generare al framework vanno aggiunte utilizzando il solito <em>@assert</em>, quindi per una semplice classe Calculator avremo il seguente codice:</p>
<p><img src="http://172.18.0.13/wordpress/wp-content/uploads/2008/03/skeleton1.png" alt="Skeleton Generator" /></p>
<p>Le possibilità di test con @assert sono molteplici, non prevedono solo l&#8217;uguaglianza, rimando alla documentazione ufficiale per l&#8217;elenco completo.</p>
<p><strong>CONCLUSIONE</strong><br />
In questa mini serie di tre articoli sullo unit testing <strong>abbiamo coperto l&#8217;argomento dalla teoria alla pratica</strong> focalizzando la nostra attenzione sul framework PHPUnit che è lo strumento di unit testing per eccellenza del campo della programmazione PHP. Abbiamo parlato dei vantaggi legati allo unit testing e del perchè è bene scrivere i test mentre si scrive il codice e non solamente alla fine, abbiamo visto come applicare queste regole al fine di migliorare il codice prodotto ed anche il proprio lavoro nel senso dell&#8217;azione e non del fine.</p>
<p>Chiaramente <strong>questa piccola guida non è esaustiva sull&#8217;argomento ma spero serva da introduzione ad un mondo che vorrete scoprire da soli</strong> affascinati ed incuriositi da quello che avete letto qui. Ora tocca a voi, come diceva un mio illustre docente universitario di Sistemi Operativi &#8220;<strong>è ora di sporcarsi le mani, alzate il cofano e guardate cosa c&#8217;è sotto</strong>&#8220;.</p>
<p>I commenti sono sempre apprezzati, sentitevi liberi di esprimere le vostre idee e i vostri dubbi siamo qui per parlarne.</p>
]]></content:encoded>
			<wfw:commentRss>http://phpblog.it/2008/03/10/phpunit-tecniche-avanzate/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PHPUnit: dalla teoria alla pratica</title>
		<link>http://phpblog.it/2008/03/03/php-unit-dalla-teoria-alla-pratica-esempi-di-utilizzo/</link>
		<comments>http://phpblog.it/2008/03/03/php-unit-dalla-teoria-alla-pratica-esempi-di-utilizzo/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 06:00:13 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[phpblog]]></category>
		<category><![CDATA[bergmann]]></category>
		<category><![CDATA[fowler]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://php5blog.it/2008/03/03/php-unit-dalla-teoria-alla-pratica-esempi-di-utilizzo/</guid>
		<description><![CDATA[Seconda puntata della mini serie dedicata allo Unit Testing con un occhio di riguardo al framework PHPUnit, dopo la prima parte di teoria passiamo oggi alla pratica vedendo alcuni esempi. Prendiamo in esame la classe per la generazione di password casuali presentata non molto tempo fa, lavoreremo su quel codice per realizzare i primi test [...]]]></description>
			<content:encoded><![CDATA[<p>Seconda puntata della <strong>mini serie dedicata allo Unit Testing</strong> con un occhio di riguardo al <a title="framework PHPUnit" href="http://www.phpunit.de/">framework PHPUnit</a>, <a title="introduzione allo unit testing" href="http://phpblog.it/2008/02/25/phpunit-introduzione-allo-unit-testing/">dopo la prima parte di teoria</a> passiamo oggi alla pratica vedendo alcuni esempi. Prendiamo in esame <a title="la classe per la generazione di password casuali" href="http://phpblog.it/2008/02/18/classe-php5-generazione-password-casuali/">la classe per la generazione di password casuali</a> presentata non molto tempo fa, lavoreremo su quel codice per realizzare i primi test ed i primi esempi. Pronti? Partiamo!</p>
<p><span id="more-48"></span><br />
PHPUnit è un framework scritto da Sebastian Bergmann per lo Unit testing in PHP, la sua distribuzione avviene attraverso <a title="PEAR" href="http://pear.php.net/">PEAR</a> ed è composto essenzialmente da uno script richiamato da linea di comando per l&#8217;esecuzione dei test e da una libreria che ci guida nella realizzazione dei test stessi. Segnalo subito il <a title="link alla documentazione" href="http://www.phpunit.de/wiki/Documentation">link alla documentazione</a> che vi tornerà molto utile, viste la sua chiarezza e completezza sotto ogni aspetto ogni vostro dubbio troverà risposta lì.</p>
<p>Come detto nella puntata precedente lo Unit Testing è un&#8217;attività di supporto allo sviluppo e al programmatore che permette di risparmiare parecchio tempo altrimenti destinato al debug potendolo assegnare ad altri compiti maggiormente utili. Realizzare degli unit test utilizzando un framework permette di risparmiare tempo prezioso per la loro scrittura e sfruttare in futuro gli stessi test massimizzando il riutilizzo del codice anche sotto quest&#8217;aspetto.</p>
<p>Il primo passo (una tantum) è quello di installare PHPUnit sul proprio sistema utilizzando PEAR:<br />
<code><br />
pear channel-discover pear.phpunit.de<br />
pear install phpunit/PHPUnit<br />
</code></p>
<p>Ora siamo veramente pronti. Vediamo quindi quali sono i passaggi che affronteremo per la realizzazione dei nostri test:</p>
<ol>
<li>individuazione delle funzionalità implementate e loro isolamento</li>
<li>scrittura di <strong>snippet</strong> di codice necessari alla verifica delle singole funzionalità identificate al passo precedente sia per casi di successo che di insuccesso</li>
<li>raggruppamento degli <strong>snippet</strong> in <strong>TestCase</strong></li>
<li>raggruppamento dei <strong>TestCase</strong> in <strong>TestSuite</strong></li>
<li>eventuale raggruppamento di più TestSuite tra di loro</li>
<li>esecuzione delle TestSuite e correzione degli errori verificatisi</li>
</ol>
<p>Nella classe di generazione casuale di password abbiamo un solo metodo <em>getPassword()</em>, in questo caso il punto 1 della lista precedente è molto semplice. La funzionalità da testare è solamente quella. Dovremo quindi scrivere uno snippet di codice che verifichi in primo luogo che la lunghezza della password generata coincida con la lunghezza richiesta e passata come parametro alla classe, in secondo luogo verificheremo anche che la quantità di cifre inserite nella password genera sia conforme alla richiesta anch&#8217;essa eseguita via parametro.</p>
<p><img src="http://172.18.0.13/wordpress/wp-content/uploads/2008/03/phpunit.png" alt="PHPUnit" /></p>
<p>In questo semplice test possiamo vedere alcune convenzioni adottate nella scrittura del test stesso:</p>
<ul>
<li>la classe che rappresenta il TestCase ha il nome della classe da testare seguito da Test, questo per identificare in modo semplice la classe che si sta testando</li>
<li>la classe di test estende PHPUnit_Framework_TestCase</li>
<li>i vai <em>snippet</em> di codice che compongono un test sono metodi pubblici che non accettano parametri ed iniziano con la parola test*</li>
<li>all&#8217;interno del codice, per controllare che le operazioni eseguite abbiano avuto il risultato corretto, vengono utilizzati i metodi <em>assert*</em>. Questi metodi controllano che un&#8217;operazione abbia fornito un risultato adeguato quando eseguita</li>
</ul>
<p>A questo punto non resta che eseguire il test e vedere se il codice scritto è corretto:</p>
<p><code>phpunit randomPasswordTest.php</code></p>
<p>che restituisce i seguenti dati:</p>
<p><code>PHPUnit 3.2.15 by Sebastian Bergmann.<br />
..<br />
Time: 0 seconds<br />
OK (2 tests)<br />
</code></p>
<p>I test presenti nel TestCase vengono eseguiti uno alla volta in modo sequenziale ed il loro esito è specificato attraverso un carattere:</p>
<ul>
<li><strong>.</strong> (punto) test eseguito correttamente</li>
<li><strong>F</strong> test fallito</li>
<li><strong>E</strong> errore nell&#8217;esecuzione del metodo di test</li>
<li><strong>S</strong> test saltato</li>
<li><strong>I</strong> test incompleto o non ancora implementato</li>
</ul>
<p>In questa seconda puntata <strong>abbiamo introdotto in modo pratico lo Unit Testing e la sua realizzazione attraverso il framework PHPUnit</strong>. Il mio consiglio è quello di fare alcune prove in prima persona magari <a title="partendo dal codice completo che potete scaricare come sempre" href="http://phpblog.it/downloads/php5blog/randomPasswordTest.php.txt">partendo dal codice completo che potete scaricare come sempre</a> passando poi all&#8217;applicazione su qualche vostro progetto implementando quindi dei test da zero.</p>
<p>Ricordate sempre Martin Fowler:        <em>Whenever you are tempted to type something into a       <code>print</code> statement or a debugger expression, write it       as a test instead. &#8211; </em>Ogni volta che siete tentati di scrivere qualcosa in un print o in un&#8217;espressione di debug scrivetela invece come un test.</p>
<p>I commenti qui sotto sono a vostra disposizione per domande, critiche, suggerimenti&#8230;che aspettate?</p>
<p><strong>TERZA PUNTATA<br />
</strong><a title="tecniche avanzate" href="http://phpblog.it/2008/03/10/phpunit-tecniche-avanzate/">PHPUnit: tecniche avanzate</a></p>
]]></content:encoded>
			<wfw:commentRss>http://phpblog.it/2008/03/03/php-unit-dalla-teoria-alla-pratica-esempi-di-utilizzo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHPUnit: introduzione allo unit testing</title>
		<link>http://phpblog.it/2008/02/25/phpunit-introduzione-allo-unit-testing/</link>
		<comments>http://phpblog.it/2008/02/25/phpunit-introduzione-allo-unit-testing/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 06:00:19 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[phpblog]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[unit testing]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://php5blog.it/2008/02/25/phpunit-introduzione-allo-unit-testing/</guid>
		<description><![CDATA[Inizia qui una mini serie di articoli dedicati allo Unit Testing grazie ai quali introdurremo inizialmente la teoria legata a questa pratica e successivamente parleremo di pratica. Iniziamo. Sappiamo tutti che l&#8217;approccio di un programmatore verso un progetto è qualcosa di puramente soggettivo, le tecniche utilizzate ed il metodo con cui si procede sono quelli [...]]]></description>
			<content:encoded><![CDATA[<p>Inizia qui una <strong>mini serie di articoli dedicati allo Unit Testing</strong> grazie ai quali introdurremo inizialmente la teoria legata a questa pratica e successivamente parleremo di pratica. Iniziamo.</p>
<p>Sappiamo tutti che l&#8217;approccio di un programmatore verso un progetto è qualcosa di puramente soggettivo, le tecniche utilizzate ed il metodo con cui si procede sono quelli dettati dall&#8217;(in)esperienza del programmatore stesso e dalle convinzioni che ognuno ha nei propri mezzi. <strong>Purtroppo nella maggior parte dei casi queste convinzioni sono alla base dei problemi che affliggono gran parte dei progetti software nei primi mesi di vita: scadenze non rispettate, bug, funzionalità non implementate secondo specifiche&#8230;</strong></p>
<p><span id="more-44"></span>Chiaramente ogni progetto è qualcosa di unico visto che le variabili in gioco sono talmente tante che non si può definire un metodo di sviluppo minuzioso, è perciò fondamentale sfruttare la tecnologia che viene in nostro aiuto approfittando del testing automatico al fine di limitare gli errori in fase di rilascio di un&#8217;applicazione garantendo il corretto funzionamento del prodotto.</p>
<p>Il funzionamento corretto di ogni componente di un sistema dipende dalla correttezza delle funzioni che implemente e dall&#8217;interazione con gli altri componenti con cui comunica. Quindi ma mano che si sviluppano le varie classi e si modificano i package ci si deve ricordare di verificare il funzionamento corretto di tutto ciò che ha a che fare con il codice aggiornato. <strong>Piccoli cambiamenti in una classe possono causare danni inauditi a del codice che riteniamo molto distante dalle modifiche apportate.</strong> Molta attenzione e perfetta conoscenza di un sistema possono non bastare ad evitare disastri. Una strada per evitare questo tipo di problemi è rappresentato dal test dei singoli componenti eseguito in modo regolare e magari automatizzato.</p>
<p><strong>Lo Unit Testing ha un approccio di tipo bottom-up lavorando sulle classi con metodi di test raggruppati in test case</strong> che si occupano di verificare in modo rigoroso il corretto funzionamento di ogni componente che deve rispondere come specificato nel test.  Sfruttare lo Unit Testing è un buon metodo per assicurare la qualità della progettazione di un sistema infatti esso permette di tenere sotto controllo le responsabilità di ogni classe e di ogni funzione.</p>
<p>Pensate ora ad una piccola modifica al codice apportata un venerdì sera (cosa che sconsiglio sempre) senza un framework per eseguire tutti i test del caso. Alcune prove di funzionamento fatte manualmente non hanno manifestato errori e date per scontato che tutto funzioni correttamente. Pensate ora alla telefonata che vi arriva dal cliente o dal capo e vi fa uscire dal pub, dal ristorante o peggio vi toglie dal vostro divano &#8220;<em>Cosa hai fatto a $applicazione? I clienti non riescono ad entrare nel sistema!</em>&#8220;.</p>
<p>Ricordate: i bug peggiori non provocano errori che si manifestano bloccando in modo palese l&#8217;applicazione, sono quelli che senza creare segnali agiscono sulla logica del vostro progetto. I peggiori bug non si manifestano dove state lavorando, sono causati lì ma si manifestano da tutt&#8217;altra parte magari giorni se non settimane dopo. <strong>Eseguire test regolari vi può salvare nella maggior parte di questi casi, quindi scrivete i test mentre scrivete il codice. Se qualcuno vi riporta un bug scrivete prima il test che lo conferma e poi eseguite il fix richiesto, i bug hanno l&#8217;abitudine di ripresentarsi.</strong></p>
<p><strong>In PHP il framework per lo unit testing si chiama <a title="PHPUnit" href="http://www.phpunit.de/">PHPUnit</a></strong> che contiene vari tool e librerie che permettono di eseguire tutte le azioni utili al test del codice. Nella prossima puntata vedremo come sfruttare PHPUnit con degli esempi pratici sul codice della classe per la generazione casuale di password presentata poco tempo fa.</p>
<p><strong>SECONDA PUNTATA</strong><br />
<a title="dalla teoria alla pratica " href="http://phpblog.it/2008/03/03/php-unit-dalla-teoria-alla-pratica-esempi-di-utilizzo/">PHPUnit: dalla teoria alla pratica</a></p>
]]></content:encoded>
			<wfw:commentRss>http://phpblog.it/2008/02/25/phpunit-introduzione-allo-unit-testing/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

