<?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>Gabriele Lana &#187; test</title>
	<atom:link href="http://www.gabrielelana.it/archives/category/test/feed" rel="self" type="application/rss+xml" />
	<link>http://www.gabrielelana.it</link>
	<description>on Agile Methodologies and Programming</description>
	<lastBuildDate>Fri, 07 May 2010 14:12:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Bowling kata in Erlang</title>
		<link>http://www.gabrielelana.it/archives/102</link>
		<comments>http://www.gabrielelana.it/archives/102#comments</comments>
		<pubDate>Fri, 24 Jul 2009 14:10:54 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[erlang]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/102</guid>
		<description><![CDATA[Qualche giorno fa Robert Martin come esercizio per imparare Clojure ha risolto il kata del bowling (da lui stesso ideato). Qualche programmatore più avvezzo al mondo funzionale ha cassato la soluzione ritenendola troppo &#8220;imperativa&#8221;, accusando non tanto Martin stesso quanto la presenza dei test :-D
L&#8217;argomentazione utilizzata per minimizzare l&#8217;utilità dei test è la semplicità dell&#8217;esercizio, [...]]]></description>
			<content:encoded><![CDATA[<p>Qualche giorno fa <a href="http://objectmentor.com/omTeam/martin_r.html">Robert Martin</a> come esercizio per imparare <a href="http://clojure.org/">Clojure</a> ha <a href="http://blog.objectmentor.com/articles/2009/07/19/uncle-bob-jsps-learning-clojure">risolto</a> il <a href="http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata">kata del bowling</a> (da lui stesso ideato). Qualche programmatore più avvezzo al mondo funzionale ha cassato la soluzione ritenendola troppo &#8220;imperativa&#8221;, accusando non tanto Martin stesso quanto la presenza dei test :-D</p>
<p>L&#8217;argomentazione utilizzata per minimizzare l&#8217;utilità dei test è la semplicità dell&#8217;esercizio, al che ho pensato a come l&#8217;avrei risolto in <a href="http://erlang.org/">Erlang</a>, mi sono detto che &#8220;effettivamente la soluzione è semplice&#8221;, ho iniziato a scriverla provandola nella shell del linguaggio e subito ho provato un senso di fastidio</p>
<p>Continuavo a scrivere e riscrivere (va bhe, la shell ti da la possibilità di richiamare i comandi passati, ma il discorso non cambia) le stesse invocazioni verificando ad occhio il risultato, al che ho capito il senso di fastidio: che differenza c&#8217;è fra quello che stavo facendo e scrivere dei test unitari? Nessuna, tranne che i primi sono effimeri e non ti possono venire in aiuto quando sarai chiamato a fare refactoring. Quindi, amici dei linguaggi funzionali, perchè non vedete i test unitari come delle sessioni di interazione con la shell permanenti e automatiche?</p>
<p>Vi dirò di più, la soluzione che avevo inizialmente pensato era sbagliata :-) Dopo aver passato tutti i test che Martin aveva fatto nella presentazione di cui sopra, mi sono chiesto se potevo rompere il codice in qualche modo, ho visto che non erano coperti dei corner case, per esempio c&#8217;è la partita peggiore (tutti 0), ma non c&#8217;è la partita migliore (tutti strike), scrivo un test&#8230; e non passa :-)</p>
<p>Come vedete qui sotto, utilizzo una variabile per tenere il conto dei frame elaborati, inizialmente non lo facevo e nel caso di uno strike nell&#8217;ultimo frame, i due tiri di bonus successivi metchavano con la terza clausola e venivano considerati dei frame normali, quindi il &#8220;perfect game&#8221; che dovrebbe avere uno score di 300 aveva score 320</p>
<p><script src="http://gist.github.com/154187.js"></script></p>
<p>Alla fine ho guardato il codice e quella variabile arbitraria per contare il numero dei frame proprio non mi andava giù e senza cambiare i test sono arrivato a questa seconda soluzione</p>
<p><script src="http://gist.github.com/154189.js"></script></p>
<p>Che non mi piace perchè anche se rende più esplicito (forse anche più imperativo?) il conto dei frame, secondo me si capisce di meno, sopratutto non mi piace <strong>score_frame</strong> perchè si occupa sia di calcolare lo score di un frame (e fin qui), sia di selezionare i tiri rimanenti eliminando quelli del frame corrente</p>
<p>Cosa ne dite? Quale vi piace di più?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/102/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Perfect Software</title>
		<link>http://www.gabrielelana.it/archives/80</link>
		<comments>http://www.gabrielelana.it/archives/80#comments</comments>
		<pubDate>Tue, 11 Nov 2008 07:15:45 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[book]]></category>
		<category><![CDATA[fun]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/80</guid>
		<description><![CDATA[Sto leggendo l&#8217;ultimo fantastico libro di Gerald M. Weinberg &#8220;Perfect Software: And Other Illusions about Testing&#8221;, grazie al quale sto iniziando a capire meglio l&#8217;essenza dell&#8217;attività di un tester. Volevo solo quotare un passaggio che ho letto questa mattina sulla metropolitana

&#8220;Why do we never have enough time to do it right, but always have enough [...]]]></description>
			<content:encoded><![CDATA[<p>Sto leggendo l&#8217;ultimo fantastico libro di Gerald M. Weinberg <a href="http://www.amazon.com/Perfect-Software-Other-Illusions-Testing/dp/0932633692">&#8220;Perfect Software: And Other Illusions about Testing&#8221;</a>, grazie al quale sto iniziando a capire meglio l&#8217;essenza dell&#8217;attività di un tester. Volevo solo quotare un passaggio che ho letto questa mattina sulla metropolitana</p>
<blockquote><p>
&#8220;Why do we never have enough time to do it right, but always have enough time to do it over?
</p></blockquote>
<p>LOL! Nel libro ci sono anche spunti interessanti che riguardano l&#8217;attività di planning, infatti visto che ufficialmente non terrò nessun talk all&#8217;<a href="http://www.agileday.it/">AgileDay</a> almeno porterò un paio di argomenti sul planning da discutere in uno degli <a href="http://en.wikipedia.org/wiki/Open_Space_Technology">open space</a> disponibili, sempre che ci sia qualcuno interessato :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/80/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Se devi duplicare il codice almeno non duplicare i test</title>
		<link>http://www.gabrielelana.it/archives/76</link>
		<comments>http://www.gabrielelana.it/archives/76#comments</comments>
		<pubDate>Sat, 04 Oct 2008 09:55:59 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/76</guid>
		<description><![CDATA[Ci sono volte in cui è veramente difficile evitare di duplicare un pezzo di codice, tipicamente quando devi rappresentare lo stesso concetto in contesti differenti all&#8217;interno della stessa architettura. Il software è per sua natura estremamente flessibile ed è quindi sempre possibile inventarsi qualcosa, infatti nel passato mi sono sempre sforzato tantissimo per trovare soluzioni [...]]]></description>
			<content:encoded><![CDATA[<p>Ci sono volte in cui è veramente difficile evitare di duplicare un pezzo di codice, tipicamente quando devi rappresentare lo stesso concetto in contesti differenti all&#8217;interno della stessa architettura. Il software è per sua natura estremamente flessibile ed è quindi sempre possibile inventarsi qualcosa, infatti nel passato mi sono sempre sforzato tantissimo per trovare soluzioni <em>&#8220;creative&#8221;</em> per evitare questo tipo di duplicazione, in retrospettiva posso dire che tutte queste soluzioni sono risultate un po&#8217; <em>&#8220;tirate&#8221;</em>, artefatte, soluzioni che non mi davano quel senso di affidabilità che voglio dal mio codice e che mi fa dormire bene la notte.</p>
<p>Ultimamente ho dovuto affontare uno di questi problemi: in <a href="http://www.yourank.com">YouRank</a> abbiamo una definizione di <strong>domain</strong> che consente data un&#8217;url di ricavare quello che noi consideriamo essere il dominio di quell&#8217;url. Quello che facciamo è eliminare il protocollo, generalmente <strong>&#8220;http://&#8221;</strong> e la parte iniziale dell&#8217;url se e solo se questa corrisponde a <strong>&#8220;[wW]{3}[^.]+\.&#8221;</strong>. Quindi l&#8217;url <strong>&#8220;http://www.gabrielelana.it&#8221;</strong> avrebbe come identificativo di dominio <strong>&#8220;gabrielelana.it&#8221;</strong></p>
<p>Questo tipo di operazione (estrazione dell&#8217;identificativo univoco del dominio di un&#8217;url) deve essere eseguita in contesti differenti: sia durante l&#8217;elaborazione dei dati di navigazione grezzi (quindi in javascript), sia durante l&#8217;esecuzione di query sul database (banalmente per raggruppare i risultati per dominio). Inizialmente, proprio per evitare di duplicare il codice, ho optato per un&#8217;implementazione in javascript <strong>&#8220;yr.uri.Http#domainWithoutPrefix&#8221;</strong> (metodo domainWithoutPrefix della classe yr.uri.Http), che richiamavo all&#8217;interno delle query di sqlite <strong>&#8220;JS_CALL(&#8220;DOMAIN_WITHOUT_PREFIX&#8221;, urlOfDomain)&#8221;</strong> <a href="#1">[1]</a>, per ogni record del result set dovevo creare un oggetto <strong>&#8220;yr.uri.Http&#8221;</strong> solo per poter utilizzare il metodo <strong>&#8220;domainWithoutPrefix</strong>, questo unito al costo del marshalling fra sqlite e javascript, si è rivelato essere superiore al budget :-)</p>
<p>I miei sensi di ragno mi facevano venire la nausea tutte le volte che pensavo all&#8217;ovvia soluzione del problema: implementare in C la funzione <strong>&#8220;DOMAIN_WITHOUT_PREFIX&#8221;</strong> da richiamare direttamente in sqlite. Ho passato giorni a tentare di immaginarmi soluzioni alternative al problema senza trovare niente. Alla fine ho mollato, ho iniziato a scrivere il primo test automatico e subito ho capito</p>
<p>Stavo sostanzialmente riscrivendo i test che a suo tempo scrissi per <strong>&#8220;yr.uri.Http#domainWithoutPrefix&#8221;</strong>, questo si che sarebbe stato veramente sbagliato! Potevo ancora <strong>conservare in un&#8217;unico punto autorevole</strong> la definizione del concetto di identificato di dominio: nei <strong>test</strong>. In pseudo codice</p>
<pre class="code">
assertDomainWithoutPrefixIs("gabrielelana.it", "http://www.gabrielelana.it")
assertDomainWithoutPrefixIs("blog.yourank.com", "http://blog.yourank.com")
assertDomainWithoutPrefixIs("example.com", "http://www1.example.com")
assertDomainWithoutPrefixIs("example.com", "http://www123.example.com")
assertDomainWithoutPrefixIs("w12.example.com", "http://w12.example.com")
...
</pre>
<p>dove</p>
<pre class="code">
assertDomainWithoutPrefixIs = function(expected, given) {
    assertEquals(expected, storage.call("DOMAIN_WITHOUT_PREFIX", given));
    assertEquals(expected, yr.uri.Http(given).domainWithoutPrefix);
}
</pre>
<p>Quindi, la lezione che ho imparato è: <em>&#8220;Se non è possibile mantenere la definizione di un concetto in un unico punto all&#8217;interno del codice, testa tutte le implementazioni esistenti con un unico test automatico, in modo da far diventare il test quell&#8217;unico punto&#8221;</em></p>
<p><strong><a href="http://www.infoq.com/presentations/archaeopteryx-bowkett">Link of the week</a></strong><br />
<strong><a href="http://www.codeodor.com/index.cfm/2008/10/1/Ideas-for-Repetition-Detection-Automation-and-The-Importance-of-DRY/2546">Quote of the week</a></strong> </p>
<blockquote><p>
No problem. &#8220;Easy&#8221; in the developer sense, of course, which translates in real life to &#8220;theoretically possible and I have a vague plan&#8221;
</p></blockquote>
<p><a name="1">[1]</a> Abbiamo implementato un meccanismo attraverso il quale è possibile invocare delle funzioni javascript (previo setup) da delle query sqlite, niente di esoterico (anche il wrapper a sqlite di mozilla implementa lo stesso meccanismo) solo una precisazione nel caso qualcuno se lo fosse chiesto</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/76/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La legge implicita del test unitario</title>
		<link>http://www.gabrielelana.it/archives/75</link>
		<comments>http://www.gabrielelana.it/archives/75#comments</comments>
		<pubDate>Sat, 27 Sep 2008 08:49:05 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/75</guid>
		<description><![CDATA[Uno degli ultimi post dal blog di Roy Osherove ha scatenato parecchie reazioni nella blogosfera. Roy sostiene, fra le altre cose (vi consiglio di leggere il post originale e il suo seguito), che per permettere la scrittura di test unitari sono stati introdotti talmente tanti concetti

mocks, stubs, dependency injection, IoC containers, Extract &#038; override technique, [...]]]></description>
			<content:encoded><![CDATA[<p>Uno degli ultimi <a href="http://weblogs.asp.net/rosherove/archive/2008/09/26/unit-testing-decoupled-from-design-adoption.aspx">post</a> dal <a href="http://weblogs.asp.net/rosherove/default.aspx">blog</a> di Roy Osherove ha scatenato parecchie reazioni nella blogosfera. Roy sostiene, fra le altre cose (vi consiglio di leggere il post originale e il suo <a href="http://weblogs.asp.net/rosherove/archive/2008/09/26/unit-testing-decoupled-from-design-adoption.aspx">seguito</a>), che per permettere la scrittura di test unitari sono stati introdotti talmente tanti concetti</p>
<blockquote><p>
mocks, stubs, dependency injection, IoC containers, Extract &#038; override technique, Record\Replay, AAA and more
</p></blockquote>
<p>da rendere troppo ripida la curva d&#8217;apprendimento per un programmatore inesperto. Questa secondo Roy sarebbe uno dei freni alla diffusione dei test unitari (e a seguire del TDD) come pratica di programmazione</p>
<p>Concordo sul fatto che nella maggior parte dei casi tutta la sovrastruttura messa in campo per abilitare/facilitare la scrittura di test unitari sia sostanzialmente un <strong>bad smell</strong>. E&#8217; inutile proporre il test unitario come strumento di design dicendo che il <em>&#8220;codice facilmente testabile è anche dotato di buone proprietà quali basso accoppiamento, alta coesione, ecc&#8230;&#8221;</em> quando poi vengono proposti framework e strategie per facilitare il test unitario di codice difficilmente testabile :-) I framework citati sono nati per permettere ai programmatori di testare in maniera automatica</p>
<ul>
<li>codice legacy</li>
<li>codice che &#8220;vive&#8221; hai confini del proprio sistema e che &#8220;parla&#8221; con altri sistemi (ex: DBMS, file system, network, ecc&#8230;)</li>
<li>codice che usa librerie proprietarie</li>
<li>ecc&#8230;</li>
</ul>
<p>Nel resto dei casi sarebbe meglio rifattorizzare il codice per renderlo facilmente testabile e fargli acquisire le buone proprietà di cui sopra, da qui la legge implicita del test unitario: <em>&#8220;Se scrivere un test unitario per un pezzo di codice è troppo difficile, non riscrivere il test, riscrivi il codice&#8221;</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/75/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PhpDay 2007</title>
		<link>http://www.gabrielelana.it/archives/27</link>
		<comments>http://www.gabrielelana.it/archives/27#comments</comments>
		<pubDate>Thu, 29 Mar 2007 19:06:37 +0000</pubDate>
		<dc:creator>Gabriele Lana</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.gabrielelana.it/archives/27</guid>
		<description><![CDATA[ E&#8217; ufficiale il 18 Maggio terrò un talk al PhpDay. Questa per me sarà la terza partecipazione come speaker a questa conferenza, volevo ringraziare gli organizzatori che anche quest&#8217;anno mi hanno invitato :-)
Il talk sarà sulle tecniche di test automatico, porrà l&#8217;accento sul test di applicazioni web ed in particolare quelle sviluppate con il [...]]]></description>
			<content:encoded><![CDATA[<p><img class="on_the_left" src='http://www.gabrielelana.it/wp-content/uploads/2007/03/phpday-logo.png' alt='phpday' /> E&#8217; <a href="http://www.phpday.it/site/phpday-2007/calendario-conferenze/canale-developers/gabriele-lana-testing-web-applications/">ufficiale</a> il 18 Maggio terrò un talk al <a href="http://www.phpday.it/site/">PhpDay</a>. Questa per me sarà la terza partecipazione come speaker a questa conferenza, volevo ringraziare gli <a href="http://www.grusp.it/">organizzatori</a> che anche quest&#8217;anno mi hanno invitato :-)</p>
<p>Il talk sarà sulle tecniche di test automatico, porrà l&#8217;accento sul test di applicazioni web ed in particolare quelle sviluppate con il linguaggio di programmazione <a href="http://php.net/">php</a>, ovviamente non mancheranno riferimenti al mondo delle <a href="http://www.agilemanifesto.org/">metodologie agili</a> e quindi su come i test dovrebbero essere integrati nel ciclo di sviluppo del software. Ho scelto di affrontare questo argomento perchè nella mia esperienza di coach/mentore/trainer/? ho notato che molti team possono ottenere grandi guadagni in termini di produttività e qualità dedicando maggiore attenzione ai test e sopratutto ai test di tipo automatico. Volete sapere perchè? Volete sapere come? Ci vediamo il <a href="http://www.phpday.it/site/">18 Maggio a Verona</a> ;-)</p>
<p><span id="more-27"></span></p>
<h4>Titolo:</h4>
<p>Testing Web Applications</p>
</p>
<h4>Abstract:</h4>
<p>Lo scopo del talk sarà quello di portare all’attenzione della comunità la “pratica” del “test automatico” come mezzo per aumentare non solo la robustezza, ma anche la qualità e la flessibilità, del codice sviluppato</p>
<p>Verranno elencate le principali tipologie di test automatici per applicazioni web, si parlera’ di: test unitari, test di integrazione, test di accettazione, smoke tests e database tests. Per ogni tipo di test presentato, verra’ data risposta alle seguenti domande:</p>
<ul>
<li>Quali obiettivi possono essere raggiunti?</li>
<li>Come posso realizzare questo tipo di test? (per ogni tipo di test verranno presentati framework, tools e best practices)</li>
<li>La scrittura di questo tipo di test dove si colloca all’interno del ciclo di sviluppo? (verranno fatti particolari riferimenti alle metodologie agili)</li>
<li>Ci sono controindicazioni?</li>
</ul>
<p>Parleremo inoltre di pratiche agili a sostegno dei test come la continuous integration</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gabrielelana.it/archives/27/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
