<?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>TecnoRetales &#187; Unit Test</title>
	<atom:link href="http://www.tecnoretales.com/tag/unit-test/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tecnoretales.com</link>
	<description>La experiencia no se olvida</description>
	<lastBuildDate>Mon, 13 Sep 2010 21:37:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<!-- google ad injected by adsense-optimizer http://www.adsenseoptimizer.de -->
			<div  style="padding:7px; float: right; padding-right: 0; margin: 3px;"><!-- Ad number: 1 --><script type="text/javascript"><!--
    	 
    	google_ad_client = "pub-7180773421652966"; google_alternate_color = "FFFFFF";
		google_ad_width = 468; google_ad_height = 60;
		google_ad_format = "468x60_as"; google_ad_type = "text";
		google_ad_channel =""; google_color_border = "FE8B00";
		google_color_link = "FE8B00"; google_color_bg = "FFFFFF";
		google_color_text = "000000"; google_color_url = "D9D9D9";
		google_ui_features = "rc:6"; //--></script>
		<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script></div>	<item>
		<title>Test-Driven Development</title>
		<link>http://www.tecnoretales.com/programacion/test-driven-development/</link>
		<comments>http://www.tecnoretales.com/programacion/test-driven-development/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 08:50:56 +0000</pubDate>
		<dc:creator>Manel Pérez Mata</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.tecnoretales.com/?p=649</guid>
		<description><![CDATA[
Hace algún tiempo, os hablaba de la importancia de usar Unit Testing en nuestros desarrollos para tender localizados los posibles errores en cada una de nuestras funciones y, de ese modo, hacer un cambio en cualquier función no nos será crítico, ya que el test nos informará si la función está devolviendo los resultados esperados [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><img class="alignleft size-full wp-image-650" title="test-driven_development" src="http://www.tecnoretales.com/wp-content/uploads/2009/09/test-driven_development.jpg" alt="test-driven_development" width="240" height="214" /></p>
<p>Hace algún tiempo, os hablaba de <a title="La importancia de usar Unit Testing" href="http://www.tecnoretales.com/programacion/unit-test-la-importancia-de-usar-tests-unitarios/" target="_blank">la importancia de usar Unit Testing</a> en nuestros desarrollos para tender localizados los posibles errores en cada una de nuestras funciones y, de ese modo, hacer un cambio en cualquier función no nos será crítico, ya que <strong>el test nos informará</strong> si la función está devolviendo los resultados esperados para cada cualquier.</p>
<p>Pero ¿y si al desarrollar el test me he dejado algún punto por comprobar? A menudo, tener una covertura del 100% resulta complicado debido al error humano, pero una vez detectado un error, debemos solventarlo y modificar el test para que no vuelva a darse ese error, y yendo un poco más allá, ¿por qué no <strong>pensar en los posibles errores</strong> que puede tener la función que desarrollemos antes de programarla? y ya que los hemos pensado, ¿por qué no realizar el test aunque todavía no hayamos desarrollado la función en questión? Pues precisamente, esa es la idea del Test-Driven Development (TDD a partir de ahora).</p>
<p>En resumen, podemos decir que el TDD es una práctica a la hora de programar que implica el desarrollo del <strong>test unitario</strong> antes de haber picado una sola línea del código de la función a testear&#8230; Pero, ¿qué ventajas tiene? ¿cuál es el workflow de esta práctica?<span id="more-649"></span></p>
<h3><span style="text-decoration: underline;">Ventajas de usar TDD</span></h3>
<p>Generalmente, somos <strong>escépticos a la hora de adoptar una nueva práctica</strong> como el Unit Testing o más aún, algo que parece tan ilógico como TDD, pues es costoso en tiempo para el programador el desarrollo del test (cuando lo que nos gusta es desarrollar cosas útiles y no aparentemente inútiles como una prueba) e implica tener que pensar un rato antes de desarrollar. Sin embargo, seguir esta forma de programación tiene una serie de ventajas que hacen decantar la balanza a su favor:</p>
<ol>
<li><strong><span style="text-decoration: underline;">Código de mayor calidad</span>:</strong> El hecho de desarrollar el test antes que la función a ser testeada, nos obliga a pensar en como será la función, ordenarla y ver que errores podrá haber. Esto hará que en el momento de empezar a picar la función, tengamos muy claro que es lo que queremos hacer y como, por tanto, el código será más limpio y concreto.</li>
<li><strong><span style="text-decoration: underline;">Desacoplo del código</span>:</strong> Cuando piensas en como será la función de manera que pueda ser testeada, te ves obligado a separar el bloque central en bloques más pequeños (que también serán testeados). De este modo, una función que podría ser muy compleja, acaba dividida en tres más pequeñas y fáciles de testear.</li>
<li><strong><span style="text-decoration: underline;">Disminución del tiempo de desarrollo</span>:</strong> Independientemente del coste en tiempo de desarrollar el test (pues doy por hecho de que estás convencido de su utilidad y lo desarrollarás igualmente), el desarollo de la función es más rápida porque ya hemos pensado que y como lo vamos a hacer, simplemente hay que picarlo.</li>
<li><strong><span style="text-decoration: underline;">Disminución del número de líneas</span>:</strong> TDD lleva implicita un proceso de refactorizando constante hasta que la función está acabada, gracias a eso, es fácil darnos cuenta que hemos complicado un proceso y lo podemos optimizar.</li>
</ol>
<h3><span style="text-decoration: underline;">Workflow</span></h3>
<p>Antes de comenzar el ciclo de trabajo se debe definir una lista de requerimientos. Luego se comienza el siguiente ciclo:</p>
<ol>
<li><strong>Elegir un requerimiento:</strong> Se elige de una lista el requrimiento que se cree que nos dará mayor conocimiento del problema y que a la vez sea fácilmente implementable.</li>
<li><strong>Escribir una prueba:</strong> Se comienza escribiendo una prueba para el requerimiento. Para ello el programador debe entender claramente las especificaciones y los requisitos de la funcionalidad que está por implementar. Este paso fuerza al programador a tomar la perspectiva de un cliente considerando el código a través de sus interfaces.</li>
<li><strong>Verificar que la prueba falla:</strong> Si la prueba no falla es porque el requerimiento ya estaba implementado o porque la prueba es errónea.</li>
<li><strong>Escribir la implementación:</strong> Escribir el código más sencillo que haga que la prueba funcione. Se usa la metáfora &#8220;Déjelo simple&#8221; (&#8221;Keep It Simple, Stupid&#8221; (KISS)).</li>
<li><strong>Ejecutar las pruebas automatizadas:</strong> Verificar si todo el conjunto de pruebas funciona correctamente.</li>
<li><strong>Eliminación de duplicación:</strong> El paso final es la refactorización, que se utilizará principalemente para eliminar código duplicado. Se hacen de a una vez un pequeño cambio y luego se corren las pruebas hasta que funcionen.</li>
<li><strong>Actualización de la lista de requerimientos:</strong> Se actualiza la lista de requerimientos tachando el requerimiento implementado. Asimismo se agregan requerimientos que se hayan visto como necesarios durante este ciclo y se agregan requerimientos de diseño (P. ej que una funcionalidad esté desacoplada de otra).</li>
</ol>
<p>Resumiendo en una imágen:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-653" title="20090712160619!Test-driven_development" src="http://www.tecnoretales.com/wp-content/uploads/2009/09/20090712160619Test-driven_development.PNG" alt="20090712160619!Test-driven_development" width="615" height="441" /></p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.tecnoretales.com/programacion/test-driven-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPUnit &#8211; Tests Unitarios en PHP</title>
		<link>http://www.tecnoretales.com/programacion/phpunit-tests-unitarios-en-php/</link>
		<comments>http://www.tecnoretales.com/programacion/phpunit-tests-unitarios-en-php/#comments</comments>
		<pubDate>Thu, 14 May 2009 17:37:52 +0000</pubDate>
		<dc:creator>Manel Pérez Mata</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.tecnoretales.com/?p=238</guid>
		<description><![CDATA[El otro día os hablaba de la importancia de usar test unitarios. Hoy os dejo un pequeño documento sobre PHPUnit, un framework para PHP que nos permite crear y ejecutar juegos de tests unitarios de manera sencilla, además de analizar por nosotros los resultados de los mismos.
Aunque inicialmente PHP empezó como complemento dinámico para pequeñas [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><a title="PHPUnit HomePage" href="http://www.phpunit.de/" target="_blank"><img class="alignleft size-full wp-image-228" title="PHPUnit Logo" src="http://www.tecnoretales.com/wp-content/uploads/2009/05/phpunit-logo.gif" alt="PHPUnit Logo" width="94" height="80" /></a>El otro día os hablaba de <a title="Importancia de usar test unitarios" href="http://www.tecnoretales.com/programacion/unit-test-la-importancia-de-usar-tests-unitarios/">la importancia de usar test unitarios</a>. Hoy os dejo un pequeño documento sobre PHPUnit, un <strong>framework para PHP</strong> que nos permite crear y ejecutar juegos de tests unitarios de manera sencilla, además de analizar por nosotros los resultados de los mismos.</p>
<p>Aunque inicialmente PHP empezó como complemento dinámico para pequeñas páginas web, actualmente PHP se utiliza para desarrollar aplicaciones web complejas, por lo que es importante poder realizar las pruebas pertinentes a nuestro código.<span id="more-238"></span></p>
<p>En la <a title="Features PHPUnit" href="http://www.phpunit.de/wiki/Features" target="_blank">web oficial</a> podemos ver todas las <strong>caractarísticas de PHPUnit</strong>, entre ellas encontramos:</p>
<p>* Puerto completo deJUnit para PHP5.<br />
* Soporte para Mock Objects (jMock).<br />
* Soporte para testeo de la base de datos<br />
* Forma parte del grupo de frameworks de xUnit<br />
* Almacena los resultados en una Test Database.<br />
* Se integra con varias aplicaciones de test (como Selenium RC para aplicaciones web).</p>
<h3>Instalar PHPUnit en Ubuntu</h3>
<p>Podemos instalar este framework desde los repositorios oficiales de Ubuntu. Para ponerlo en marcha:</p>
<pre>sudo apt-get update
sudo apt-get install phpunit</pre>
<p>y ya lo tenemos en nuestra máquina. Generalmente PHPUnit se instala en la ruta <em>/usr/share/php</em>, dentro encontraremos una carpeta PHPUnit con el código del framework, además, se habrá instalado un script <em>phpunit</em> con el cual, podremos lanzar las pruebas desde línea de comandos.</p>
<h3>Instalar PHPUnit con PEAR</h3>
<p>Si lo deseamos, también podemos hacer una instalación con <em>PEAR</em> (<strong>PHP Extensión and Application Repository</strong>), que es un entorno de desarrollo y sistema de distribución para componentes de código.</p>
<ol>
<li>Instalamos pear si no lo tenemos
<pre>sudo apt-get update
sudo apt-get install php-pear</pre>
</li>
<li>Actualizamos a la última versión de pear
<pre>sudo pear upgrade pear</pre>
</li>
<li>Por último, añadimos el canal desde donde encontraremos el código de PHPUnit al &#8220;repositorio&#8221; de pearl y lo instalamos
<pre>pear channel-discover pear.phpunit.de
# pear install phpunit/PHPUnit</pre>
</li>
</ol>
<h3>Realizando nuestro primer test</h3>
<p>Una vez lo tenemos instalado, haremos una prueba para asegurarnos de que funciona correctamente&#8230; para ello creamos un archivo <em>FirstTest.php</em> con la siguiente información:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> FirstTest <span class="kw2">extends</span> PHPUnit_Framework_TestCase <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; protected <span class="re0">$fixture</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; protected <span class="kw2">function</span> setUp<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Create the Array fixture.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">fixture</span> = <a href="http://www.php.net/array"><span class="kw3">Array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> testNewArrayIsEmpty<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Assert that the size of the Array fixture is 0.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="nu0">0</span>, <a href="http://www.php.net/sizeof"><span class="kw3">sizeof</span></a><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">fixture</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> testArrayContainsAnElement<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Add an element to the Array fixture.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">fixture</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="st0">&#8216;Element&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Assert that the size of the Array fixture is 1.</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">assertEquals</span><span class="br0">&#40;</span><span class="nu0">1</span>, <a href="http://www.php.net/sizeof"><span class="kw3">sizeof</span></a><span class="br0">&#40;</span><span class="re0">$this</span>-&gt;<span class="me1">fixture</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Nos situamos en el directorio en el que hemos creado el archivo y lo ejecutamos desde consola con:</p>
<pre>phpunit FirstTest.php</pre>
<p>Si todo ha ido bien, obtendremos un resultado por pantalla informándonos de que hemos pasado los tests de manera satisfactoria; algo similar a esto:</p>
<pre>PHPUnit 3.0.6 by Sebastian Bergmann.

..

Time: 00:00

OK (2 tests)</pre>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.tecnoretales.com/programacion/phpunit-tests-unitarios-en-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Unit Test: La importancia de usar tests unitarios</title>
		<link>http://www.tecnoretales.com/programacion/unit-test-la-importancia-de-usar-tests-unitarios/</link>
		<comments>http://www.tecnoretales.com/programacion/unit-test-la-importancia-de-usar-tests-unitarios/#comments</comments>
		<pubDate>Mon, 11 May 2009 14:58:13 +0000</pubDate>
		<dc:creator>Manel Pérez Mata</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Unit Test]]></category>

		<guid isPermaLink="false">http://www.tecnoretales.com/?p=227</guid>
		<description><![CDATA[ Un test unitario (Unit Test) es un trozo de código desarrollado con el único objetivo de verificar que una rutina o función de nuestro código está funcionando según esperamos.
En definitiva, lo que Unit Test pretende es tener trozos de código que se encargarán de testear por separado y de forma independiente cada uno de [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><img class="alignright size-full wp-image-229" title="Bug" src="http://www.tecnoretales.com/wp-content/uploads/2009/05/bug1.gif" alt="Bug" width="150" height="138" /> Un test unitario (Unit Test) es un trozo de código desarrollado con el único objetivo de verificar que una rutina o función de nuestro código está funcionando según esperamos.</p>
<p>En definitiva, lo que Unit Test pretende es tener trozos de código que se encargarán de <strong>testear por separado y de forma independiente</strong> cada uno de los métodos de las distintas clases que compongan el programa desarrollado, para que cuando se haga alguna modificación en el código, posibles errores derivados de esa modifiación puedan ser identificados y corregidos de manera rápida y eficaz.</p>
<p>La idea general que se destila de los tests unitarios es que si <strong>todas las partes de un código funcionan por separado</strong>, lo más probable es que el global que componen también funcione. Obviamente, siempre será necesario realizar un testeo general (o pruebas de integración) de la aplicación para comprobar que el todo que hemos compuesto funciona correctamente.<br />
<span id="more-227"></span></p>
<h3>¿Porqué usar Unit Test?</h3>
<p>Los más reticentes al desarrollo de tests os estareis preguntando&#8230; ¿Qué ventajas obtenemos de &#8220;perder tiempo&#8221; picando una serie de líneas de código que no están destinadas a hacer funcionar la aplicación?</p>
<p>Pues bien, estas pruebas aisladas proporcionan <strong>siete ventajas</strong> básicas:</p>
<ol>
<li><strong>Facilita los cambios</strong> en la aplicación ya que las pruebas nos asegurarán que los nuevos cambios no han introducido errores.</li>
<li><strong>Simplifica la integración</strong> gracias a que permiten llegar a la fase de integración con un grado alto de seguridad de que el código está funcionando correctamente. De esta manera se facilitan las pruebas de integración.</li>
<li><strong>Documenta el código</strong>. Las propias pruebas son un libro abierto sobre el funcionamiento de la función y los resultados esperados.</li>
<li><strong>Separación de la interfaz y la implementación</strong>. Dado que la única interacción entre los casos de prueba y las unidades bajo prueba son las interfaces de estas últimas, se puede cambiar cualquiera de los dos sin afectar al otro.</li>
<li><strong>Los errores están más acotados</strong> y son más fáciles de localizar: dado que tenemos preparado un test para cada función que puede desenmascararlo.</li>
<li>Aunque pueda parecer mentira, los test unitarios <strong>aceleran el desarrollo</strong> de nuestro software debido a que.</li>
<li>Ayuda a tener un <strong>código desacoplado</strong> gracias a que cada una de nuestras funciones está pensada para devolver un resultado que podrá ser testeado.</li>
</ol>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.tecnoretales.com/programacion/unit-test-la-importancia-de-usar-tests-unitarios/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

