<?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>Héctor Fuente Pérez &#187; Héctor Fuente Pérez</title>
	<atom:link href="http://fuenteperez.es/blog/author/admin/feed" rel="self" type="application/rss+xml" />
	<link>http://fuenteperez.es/blog</link>
	<description>Artículos técnicos, noticias y desarrollo aplicaciones Java, PL/SQL Server Pages (PSP), ...</description>
	<lastBuildDate>Fri, 20 Jan 2012 07:07:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Aprende las novedades sintácticas de Java 7</title>
		<link>http://fuenteperez.es/blog/aprende-las-novedades-sintacticas-de-java-7</link>
		<comments>http://fuenteperez.es/blog/aprende-las-novedades-sintacticas-de-java-7#comments</comments>
		<pubDate>Thu, 19 Jan 2012 20:11:51 +0000</pubDate>
		<dc:creator>Héctor Fuente Pérez</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://fuenteperez.es/blog/?p=203</guid>
		<description><![CDATA[Pues eso, que la gente de Java Code Geeks se han currado un pequeño pero muy útil tutorial donde nos explican la ultimas novedades incorporadas en Java7. Los pre requisitos según el tutorial  son instalar la Java 7 (evidentemente) e instalar Eclipse Indigo 3.7.1, sin embargo como bien indican los amigos de JavaHispano también se puede realizar con cualquier [...]]]></description>
			<content:encoded><![CDATA[<p>Pues eso, que la gente de <strong><a href="http://www.javacodegeeks.com/2012/01/java-7-project-coin-in-code-examples.html">Java Code Geeks</a></strong> se han currado un pequeño pero muy útil tutorial donde nos explican la ultimas novedades incorporadas en <strong><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java7</a></strong>.</p>
<p>Los pre requisitos según el tutorial  son instalar la <strong><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 7</a></strong> (evidentemente) e instalar <strong><a href="http://eclipse.org/downloads/">Eclipse Indigo 3.7.1</a></strong>, sin embargo como bien indican los amigos de<strong><a href="http://www.javahispano.org/portada/2012/1/18/buen-tutorial-con-ejemplos-para-aprender-las-novedades-sinta.html"> JavaHispano</a></strong> también se puede realizar con cualquier otro IDE.</p>
<p>El tutorial es muy bien ya que es corto y sencillo, y todo los fragmentos de código vienen con su correspondiente explicación.</p>
<p>Salu2. Héctor.</p>
]]></content:encoded>
			<wfw:commentRss>http://fuenteperez.es/blog/aprende-las-novedades-sintacticas-de-java-7/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pingdom Tools: Analiza tu web de forma fácil y gratuita</title>
		<link>http://fuenteperez.es/blog/pingdom-tools-analiza-tu-web-de-forma-facil-y-gratuita</link>
		<comments>http://fuenteperez.es/blog/pingdom-tools-analiza-tu-web-de-forma-facil-y-gratuita#comments</comments>
		<pubDate>Fri, 18 Nov 2011 17:22:23 +0000</pubDate>
		<dc:creator>Héctor Fuente Pérez</dc:creator>
				<category><![CDATA[Blogs]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://fuenteperez.es/blog/?p=194</guid>
		<description><![CDATA[¿Como es de rápida tu web? ¿Sabes que ficheros o scripts te están penalizando? ¿Tu web cumple con las practicas de Google Page Speed o Yahoo YSlow? Para analizar si tu web puede ser más rápida todavía de forma muy sencilla y practica puedes utilizar Pingdom Tools. Pingdom Tools es una web gratuita que analiza la velocidad de carga de tu [...]]]></description>
			<content:encoded><![CDATA[<p>¿Como es de rápida tu web? ¿Sabes que ficheros o scripts te están penalizando? ¿Tu web cumple con las practicas de <a href="https://developers.google.com/pagespeed/" target="_blank">Google Page Speed</a> o <a href="http://developer.yahoo.com/yslow/" target="_blank">Yahoo YSlow</a>?</p>
<p>Para analizar si tu web puede ser más rápida todavía de forma muy sencilla y practica puedes utilizar<a href="http://tools.pingdom.com" target="_blank"> Pingdom Tools</a>. Pingdom Tools es una web gratuita que analiza la velocidad de carga de tu sitio web y te propone recomendaciones para hacerla más rápida. Analiza que elementos son rapidas, lentos, que buenas practicas no se están siguiendo y muestra los resultados de manera que pueden ser útiles tanto para webmaster expertos como novatos.</p>
<p>Las principales características son:</p>
<ul>
<li><strong>Examina todas las partes de la web:</strong> Tamaños de archivos, tiempos de carga, y otros detalles de cada uno de los elementos que forman la web (HTML, JavaScript, css, imagenes, &#8230;). Una vez analizados muestra un listado que se puede ordenar por tiempos para identificar los cuellos de botella.</li>
<li><strong>Descripción general del rendimiento: </strong>Automáticamente analiza una gran cantidad de estadísticas para obtener el resultado de la prueba.</li>
<li><strong>Grado de rendimiento y consejos: </strong>Muestra como se adapta nuestra web a las buenas practicas marcadas por Google Page Speed o Yahoo YSlow, además muestra algunos consejos sobre como mejorar la velocidad de carga.</li>
<li><strong>Histórico de pruebas:</strong> Almacenan cada una de las pruebas que se realicen y muestras la diferencias entre cada una de ellas. Muy útil para analizar si los cambios están surtiendo el efecto deseado.</li>
<li><strong>Prueba en varias ubicaciones:</strong> Muestra las diferencias de cada de la web en Europa, Estados Unidos, &#8230;</li>
<li><strong>Compartir los resultados:</strong> Permite descargarse los resultados para compartirlos o analizarlos con detenimiento.</li>
</ul>
<p>La siguiente imagen muestra el análisis realizado sobre mi web:</p>
<p style="text-align: center;"><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/11/pingdomtools.jpg"><img class="aligncenter size-medium wp-image-197" title="pingdomtools" src="http://fuenteperez.es/blog/wp-content/uploads/2011/11/pingdomtools-300x243.jpg" alt="" width="300" height="243" /></a></p>
<p style="text-align: left;">Lo primero que muestra es un <strong>resultado global </strong>en el que dice que nota sobre 1oo tiene tu web, en mi caso casi notable <strong>69/100</strong>, además de las <strong>request realizadas (80)</strong>, el tiempo de carga (<strong>1,47sg</strong>) y el <strong>tamaño (677,4 kb)</strong>. Además muestra como es de rápida tu web respecto al resto de sitios analizados, en mi caso es más rápida que el 81% de web analizadas.</p>
<p style="text-align: left;">Un poco más abajo, muestra un listado que se puede modificar porque tiene varias pestañas. En la pestaña Waterfall muestra que elementos a cargado, su tamaño y tiempo de carga. En mi caso me penaliza el banner superior que tengo de la Fundación Vicente Ferrer ya que es una imagen de 50kb que comparado con el resto de elementos resulta un poco grande. No obstante, no pienso quitarlo ya que si consigo que uno de vosotros apadrine un niño estaría encantado.</p>
<p style="text-align: left;">Espero que os haga gustado. Si conoceis más herramientas de este tipo además de <a href="http://tools.pingdom.com/fpt/" target="_blank">Pingdom Tools</a>, <a href="https://developers.google.com/pagespeed/" target="_blank">Google Page Speed</a> o <a href="http://developer.yahoo.com/yslow/" target="_blank">Yahoo! YSlow</a> estaría encantado de probarlas.</p>
<p style="text-align: left;">Salu2. Héctor. <img src='http://fuenteperez.es/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: left;">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://fuenteperez.es/blog/pingdom-tools-analiza-tu-web-de-forma-facil-y-gratuita/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hudson vs. Jenkins: ¿Ya tenemos ganador?</title>
		<link>http://fuenteperez.es/blog/hudson-vs-jenkins-%c2%bfya-tenemos-ganador</link>
		<comments>http://fuenteperez.es/blog/hudson-vs-jenkins-%c2%bfya-tenemos-ganador#comments</comments>
		<pubDate>Wed, 09 Nov 2011 12:49:11 +0000</pubDate>
		<dc:creator>Héctor Fuente Pérez</dc:creator>
				<category><![CDATA[Integración Continua]]></category>

		<guid isPermaLink="false">http://fuenteperez.es/blog/?p=179</guid>
		<description><![CDATA[Después del debate en Rubalcaba vs Rajoy en el que los &#8220;únicos&#8221; que hemos perdido (el tiempo) somos lo 13.000.000 de españoles que los vimos. Hoy me apetece disfrazarme de Manuel Campo Vidal y os voy presentar el debate: Hudson vs Jenkins. Parece ser que la comunidad Jenkins esta promoviendo una serie de estadísticas y datos que indicarían que Hudson esta [...]]]></description>
			<content:encoded><![CDATA[<p>Después del debate en <em><a href="http://www.lasexta.com/sextatv/elintermedio/el_debate_que_todos_estabais_esperando/279463/121" target="_blank">Rubalcaba vs Rajoy</a></em> en el que los &#8220;únicos&#8221; que hemos perdido (el tiempo) somos lo 13.000.000 de españoles que los vimos. Hoy me apetece disfrazarme de<em> Manuel Campo Vidal</em> y os voy presentar el debate: <strong>Hudson vs Jenkins</strong>.</p>
<p style="text-align: center;"><a href="http://www.lasexta.com/sextatv/elintermedio/el_debate_que_todos_estabais_esperando/279463/121" target="_blank"><img class="aligncenter size-medium wp-image-187" title="PPvsPSOE" src="http://fuenteperez.es/blog/wp-content/uploads/2011/11/PPvsPSOE-300x168.jpg" alt="" width="300" height="168" /></a></p>
<p>Parece ser que la comunidad <a href="jenkins-ci.org/" target="_blank">Jenkins</a> esta promoviendo una serie de estadísticas y datos que indicarían que <a href="hudson-ci.org/" target="_blank">Hudson</a> esta perdiendo fuerza respecto a <em><a href="jenkins-ci.org/" target="_blank">Jenkins </a></em>. Según sus datos <a href="jenkins-ci.org/" target="_blank">Jenkins </a>ya supera tanto en reconocimiento de marca como en adopción, indicando que el 85% de las actualizaciones van hacia <a href="jenkins-ci.org/" target="_blank">Jenkins</a>.</p>
<p style="text-align: center;"><a style="text-decoration: none;" rel="lightbox" href="http://fuenteperez.es/blog/wp-content/uploads/2011/11/JenkinsHudsonTable1.jpg"><span style="text-decoration: underline;"><br style="text-decoration: underline;" /></span><span style="text-decoration: underline;"> </span><img style="width: 273px; height: 183px;" src="http://fuenteperez.es/blog/wp-content/uploads/2011/11/JenkinsHudsonTable1.jpg" alt="Pulsa para agrandar la imagen. Hudson vs Jenkins" width="273" height="183" /><br style="text-decoration: underline;" /></a></p>
<p>Según indican, desde que <a href="jenkins-ci.org/" target="_blank">Jenkins </a>se paso <a href="https://github.com/jenkinsci/jenkins" target="_blank">GitHub </a>y Oracle cedio <a href="hudson-ci.org/" target="_blank">Hudson </a>a Eclipse (<a href="http://www.eclipse.org/hudson/" target="_blank">Hudson se encuentra en Incubation</a>)  el ratio de descargas es de <strong>60 a 1</strong> a favor de <a href="jenkins-ci.org/" target="_blank">Jenkins</a>.</p>
<p>Es más que evidente el tremendo auge que ha tenido <a href="jenkins-ci.org/" target="_blank">Jenkins </a>y el gran apoyo que esta recibiendo por su comunidad los cuales han dado la espalda a <a href="hudson-ci.org/" target="_blank">Hudson</a>. Otra de los datos que aportan es el &#8220;<em>Ticket Activity</em>&#8221; como indicador de uso que es muy favorable a <a href="jenkins-ci.org/" target="_blank">Jenkins </a>como se puede observar en la siguiente gráfica.</p>
<p style="text-align: center;"><a style="text-decoration: none;" rel="lightbox" href="http://fuenteperez.es/blog/wp-content/uploads/2011/11/JenkinsHudsonTable2.jpg"><span style="text-decoration: underline;"><br style="text-decoration: underline;" /></span><span style="text-decoration: underline;"> </span><img style="width: 273px; height: 183px;" src="http://fuenteperez.es/blog/wp-content/uploads/2011/11/JenkinsHudsonTable2.jpg" alt="Pulsa para agrandar la imagen. Hudson vs Jenkins (comparación Ticket Activity)" width="273" height="183" /><br style="text-decoration: underline;" /><span style="color: #000000;"> </span></a></p>
<p><a style="text-decoration: none;" rel="lightbox" href="http://fuenteperez.es/blog/wp-content/uploads/2011/11/JenkinsHudsonTable2.jpg"> </a></p>
<p>En la siguiente imagen se puede observar en color rojo la actividad de <a href="jenkins-ci.org/" target="_blank">Jenkins </a>en el mundo (podrían haber puesto también la de <a href="hudson-ci.org/" target="_blank">Hudson </a>por comparar) y la gran difusión obtenida en todo el globo terráqueo.</p>
<p style="text-align: center;"><a style="text-decoration: none;" rel="lightbox" href="http://fuenteperez.es/blog/wp-content/uploads/2011/11/JenkinsActividadMundo.jpg"><span style="text-decoration: underline;"><br style="text-decoration: underline;" /></span><span style="text-decoration: underline;"> </span><img style="width: 273px; height: 183px;" src="http://fuenteperez.es/blog/wp-content/uploads/2011/11/JenkinsActividadMundo.jpg" alt="Pulsa para agrandar la imagen. Uso de Jenkins en el Mundo (Hudson vs Jenkins)" width="273" height="183" /><br style="text-decoration: underline;" /><span style="color: #000000;"> </span></a></p>
<p><a style="text-decoration: none;" rel="lightbox" href="http://fuenteperez.es/blog/wp-content/uploads/2011/11/JenkinsActividadMundo.jpg"> </a></p>
<p>Esta muy bien esta euforia por parte de <a href="jenkins-ci.org/" target="_blank">Jenkins</a>, pero me pregunto, ¿todo esto es  suficientes para dar por vencido a <a href="hudson-ci.org/" target="_blank">Hudson</a>? La división <a href="jenkins-ci.org/" target="_blank">Jenkins</a>/<a href="hudson-ci.org/" target="_blank">Hudson </a>es muy reciente (6 meses aprox.) , y teniendo a Oracle y Eclipse detrás, creo que es demasiado pronto para dar la victoria a <a href="jenkins-ci.org/" target="_blank">Jenkins</a>.</p>
<p>Qué opináis ¿quien lo tiene más complicado <a href="hudson-ci.org/" target="_blank">Hudson </a>o Rubalcaba?</p>
<p>Tenéis toda la info en este documento: <a href="http://www.cloudbees.com/sites/default/files/whitepapers/Jenkins_Safe_Investment_Final.pdf" target="_blank">Jenkins: The Safe and Sensible Choice for Your Continuous Integration (CI) Investment</a></p>
<p>Salu2. Héctor. <img src='http://fuenteperez.es/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://fuenteperez.es/blog/hudson-vs-jenkins-%c2%bfya-tenemos-ganador/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SLF4J Migrator: Migra tus Proyectos de log4j a slf4j (Especial impacientes)</title>
		<link>http://fuenteperez.es/blog/slf4j-migrator-migra-tus-proyectos-de-log4j-a-slf4j-especial-impacientes</link>
		<comments>http://fuenteperez.es/blog/slf4j-migrator-migra-tus-proyectos-de-log4j-a-slf4j-especial-impacientes#comments</comments>
		<pubDate>Fri, 04 Nov 2011 07:52:38 +0000</pubDate>
		<dc:creator>Héctor Fuente Pérez</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://fuenteperez.es/blog/?p=156</guid>
		<description><![CDATA[Muchas son las bondades de SFL (Simple Logging Facade) y sus implementaciones para Java (slf4j y logback) frente a sus predecesores pero aun mayoritariamente utilizados JCL (Jakarta Commons Logging) y log4j. De forma resumida podríamos nombrar: Se acabaron los problemas con los class loaders, dada su vinculación (binding) estática con la implementación subyacente (con JCL es [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas son las bondades de <strong><a href="http://www.slf4j.org/" target="_blank">SFL </a></strong>(Simple Logging Facade) y sus implementaciones para Java (<a href="http://www.slf4j.org/" target="_blank">slf4j </a>y <a href="http://logback.qos.ch/" target="_blank">logback</a>) frente a sus predecesores pero aun mayoritariamente utilizados <strong><a href="http://commons.apache.org/logging/" target="_blank">JCL </a></strong>(Jakarta Commons Logging) y <a href="http://logging.apache.org/log4j/1.2/" target="_blank">log4j</a>. De forma resumida podríamos nombrar:</p>
<ul>
<li>Se acabaron los problemas con los <a href="http://www.qos.ch/logging/classloader.jsp">class loaders</a>, dada su vinculación (binding) estática con la implementación subyacente (con JCL es dinámica en tiempo de ejecución).</li>
<li><a href="http://logback.qos.ch/manual/architecture.html#ParametrizedLogging">Trazado con parámetros mucho más sencillo</a> y eficiente.</li>
<li><a href="http://www.slf4j.org/manual.html#binding">Independencia</a>, dado que puedes usar múltiples vinculaciones con sólo añadir otro &#8220;.jar&#8221; (p.e.: desde &#8220;<em>slf4j-simple-x.x.x.jar</em>&#8220;, para pequeñas aplicaciones que usen System.err hasta &#8220;<em>slf4j-log4j12-x.x.x.jar</em>&#8220;, para servir de puente a log4j.)</li>
</ul>
<p>Si queréis conocer más sobre ello, os invito a que echéis un vistazo <a href="http://balteus.blogspot.com/2009/05/banco-de-experiencias-ii-logback-la.html" target="_blank">al articulo de Balteus</a> donde enumera algunas de las mejoras que ofrece <em>logback</em>.</p>
<p>En este caso yo os presento a <strong><a href="http://www.slf4j.org/migrator.html" target="_blank">SLF4J Migrator </a></strong>que es es una herramienta Java para migrar tus fuentes Java de Jakarta Commons Logging(JCL) a SLF4J. También puede migrar de la API log4j a SLF4J, o  de java.util.logging a SLF4J.</p>
<p>Para poder utilizarlo, lo primero que debemos hacer es descargarnos la <a href="http://www.slf4j.org/dist/slf4j-1.6.4.zip" target="_blank">distribución de slf4j</a> que incluye el slf4j-migrator-version.jar (en mi caso 1.6.4). Una vez lo tenemos ejecutamos lo siguiente:</p>
<p style="text-align: center;"><em>java -jar slf4j-migrator-1.6.4.jar</em></p>
<p style="text-align: left;">Si esta todo correcto, nos tiene que aparecer la siguiente pantalla:</p>
<p style="text-align: center;"><a style="text-decoration: none;" rel="lightbox" href="http://fuenteperez.es/blog/wp-content/uploads/2011/11/slf4jmigrator.jpg"><span style="text-decoration: underline;"><br style="text-decoration: underline;" /></span><span style="text-decoration: underline;"> </span><img style="width: 273px; height: 183px;" src="http://fuenteperez.es/blog/wp-content/uploads/2011/11/slf4jmigrator.jpg" alt="Pulsa para agrandar la imagen (SLF4J Migrator)" width="273" height="183" /><br style="text-decoration: underline;" /><span style="color: #000000;"><br />
</span></a></p>
<p style="text-align: left;">Lo primero que llama la atención es el <strong><span style="color: red;">WARNING</span> </strong>en color rojo y que dice: Cuidado, si me utilizas voy a cambiar tus fuentes y no voy hacer ningún tipo de copia de seguridad, ¿eres consciente? Vamos que no se hace responsable de la que te puede liar (por eso lo llamo especial para impacientes).</p>
<p><span style="color: red;"> </span></p>
<p style="text-align: center;"><a rel="lightbox" href="http://fuenteperez.es/blog/wp-content/uploads/2011/11/slf4jmigrator2.jpg"><br />
<img style="width: 273px; height: 183px;" src="http://fuenteperez.es/blog/wp-content/uploads/2011/11/slf4jmigrator2.jpg" alt="Pulsa para agrandar la imagen (SLF4J Migrator)" width="273" height="183" /></a></p>
<p><a rel="lightbox" href="http://fuenteperez.es/blog/wp-content/uploads/2011/11/slf4jmigrator2.jpg"> </a></p>
<p style="text-align: left;">A continuación seleccionamos la migración, en mi caso de log4j a sfl4j y marcamos el check diciendo  que sabemos lo que estamos haciendo y &#8230;</p>
<p style="text-align: left;">En este caso solamente tenía una clase Java. Como veréis a continuación, esta herramienta hace las tareas más básicas, como modificar los imports  y la declaración del logger. Esta era mi clase que utiliza log4j antes de la migración:</p>
<pre class="brush: java;">package es.fuenteperez;

import org.apache.log4j.Logger;

public class Main {

	private static Logger log = Logger.getLogger(Main.class);

	public static void main(String[] args) {
			try {
				logger.info("Hola Mundo INFO!!");

				if(logger.isDebugEnabled()){
					logger.debug("Hola mundo DEBUG!");
				}

			} catch (Exception e) {
				logger.error("Se ha producido un error: ", e);
			}
		}

	}
}</pre>
<p>y esta es la nueva clase que utiliza sfl4j</p>
<pre class="brush: java;">package es.fuenteperez;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {

	private static Logger logger = LoggerFactory.getLogger(Main.class);

	public static void main(String[] args) {
		try {
			logger.info("Hola Mundo INFO!!");

			if (logger.isDebugEnabled()) {
				logger.debug("Hola mundo DEBUG!");
			}

		} catch (Exception e) {
			logger.error("Se ha producido un error: ", e);
		}
	}
}</pre>
<p><strong>Limitaciones Generales</strong></p>
<p>No todo iba a ser maravilloso, a continuación enumero algunas limitaciones generales en los 3 tipos de migraciones.</p>
<ul>
<li>Solo modifica ficheros Java, por tanto tendras que modificar todos tus scripts (Ant/Maven/Ivy) manualmente.</li>
<li>Únicamente esta soportados los mensajes de tipo String.  Por ejemplo:</li>
</ul>
<p style="text-align: center;"><em>logger.debug(new Object()); &#8211;&gt; logger.debug(<strong>new Object().toString()</strong>);</em></p>
<ul>
<li>El nivel FATAL no está soportado. ¿Quien utiliza FATAL? <img src='http://fuenteperez.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>Si un método declara varios logger la transformación no funciona correctamente ya que únicamente modifica el primero, p.e:</li>
</ul>
<pre class="brush: java;">public void someMethod(Log l1, Log l2) {
   ...
  }

lo convierte a

  public void someMethod(Log l1, Logger l2) {
   ...
  }</pre>
<p><strong>Limitaciones cuando migramos desde log4j</strong></p>
<ul>
<li>Las declaraciones <strong>NDC (Nested Diagnostic Context)</strong> no estan soportadas y se quedan como están y deben ser migradas manualmente a <strong>MDC (Mapped Diagnostic Context)</strong>. Un <strong>NDC </strong>es un instrumento para distinguir salidas de  log intercaladas que provienen de distintas fuentes. Las salidas de log suelen  ser intercaladas cuando un servidor maneja varios clientes al mismo tiempo. El <strong>MDC </strong>es lo mismo que el NDC solo que usando un Map como implementación. <a href="http://www.javatutoriales.com/2011/04/log4j-para-creacion-de-eventos-de-log.html" target="_blank">Más i</a><a href="http://www.javatutoriales.com/2011/04/log4j-para-creacion-de-eventos-de-log.html" target="_blank">nformación sobre el tema</a>.</li>
<li>Llamadas a <em>PropertyConfigurator </em>o <em>DomConfigurator </em>no se pueden migar porque no estan soportadas por sfl4j.</li>
</ul>
<p><strong>Limitaciones cuando migramos desde JUL</strong></p>
<ul>
<li>No se modifican las llamadas a los métodos <em>finest(), finer() o finest()</em> de<em> java.logging.Logger</em>. Esto es debido a que estas llamadas se pueden corresponder con los métodos <em>trace()</em> o <em>debug()</em>, por tanto será tarea del desarrollador decidir porque método deseas sustituirlos.</li>
<li>Todas las cadenas de caracteres que correspondas con &#8220;<em>.severe(</em>&#8220; serán sustituidas por &#8220;<em>.error(</em>&#8220;, así como todas las cadenas &#8220;<em>.warning(</em>&#8220; serán sustituidas por &#8220;.<em>warn(</em>&#8221; sin realizar ningún análisis contextual. Dado que la operación de comprobación/sustitución no es contextual, si  nuestro código contiene métodos llamados &#8220;<em>severe</em>&#8221; o &#8220;<em>warning</em>&#8221;  (p.e. <em>servicioEjemplo.warning(String cadena)</em> ) se generaran errores de compilación. Yo  nunca he creado en alguna de mis clases un método con  este nombre pero si alguno de vosotros lo hace que  sepáis que con la migración va a fallar.</li>
<li>Las llamadas a los siguientes métodos de la clase<em> java.util.logging.Logger</em> deben migrarse manualmente: <em>log, logp, logrb, entering y exiting</em>.</li>
</ul>
<p>Ya veis que existen una serie de limitaciones que pueden echaros un poco para atrás a la hora de hacer la migración con <em><strong>SFL4J Migrator</strong></em>, sin embargo creo que son casos muy concreto, y en mi caso probablemente el 95% de mis proyectos se migrarían sin problemas, eso si no os olvidéis de quitar los antiguos jars y añadir los nuevos que eso tampoco lo hace la herramienta. <img src='http://fuenteperez.es/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Salu2. Héctor.</p>
]]></content:encoded>
			<wfw:commentRss>http://fuenteperez.es/blog/slf4j-migrator-migra-tus-proyectos-de-log4j-a-slf4j-especial-impacientes/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Obtener el numero de visitas de cualquier web</title>
		<link>http://fuenteperez.es/blog/obtener-el-numero-de-visitas-de-cualquier-web</link>
		<comments>http://fuenteperez.es/blog/obtener-el-numero-de-visitas-de-cualquier-web#comments</comments>
		<pubDate>Thu, 03 Nov 2011 13:00:18 +0000</pubDate>
		<dc:creator>Héctor Fuente Pérez</dc:creator>
				<category><![CDATA[Blogs]]></category>

		<guid isPermaLink="false">http://fuenteperez.es/blog/?p=138</guid>
		<description><![CDATA[Alguna a vez habéis pensado, ¿cuantas visitas tendrá tal web? ¿Por qué tiene tantas visitas mi colega y a mí no me entra ni el Tato? En este post  vamos a ver cuatro herramientas online que realizan una estimación del número de visitas de una determinada web, número de backlinks e incluso cual es el valor de  dicha [...]]]></description>
			<content:encoded><![CDATA[<p>Alguna a vez habéis pensado, ¿cuantas visitas tendrá tal web? ¿Por qué tiene tantas visitas mi colega y a mí no me entra ni el Tato? En este post  vamos a ver cuatro herramientas online que realizan una estimación del número de visitas de una determinada web, número de backlinks e incluso cual es el valor de  dicha web.</p>
<p><a href="http://www.alexa.com" target="_blank"><img class="alignnone" src="http://www.alexa.com/images/layout/logo_tagline.png" alt="" width="225" height="86" /></a></p>
<p><strong><a href="http://www.alexa.com/" target="_blank">Alexa </a></strong>es el sitio web por excelencia para obtener información acerca de la cantidad de  visitas que recibe un  sitio web determinado. Alexa recoge información de los usuarios que tienen instalado <strong>Alexa Toolbar</strong>, lo cual le permite generar estadísticas acerca de la cantidad de visitas y de los enlaces relacionados. Alexa es una empresa subsidiaria de Amazon.</p>
<p><a href="http://www.alexa.com/siteinfo/fuenteperez.es" target="_blank"><img class="size-medium wp-image-148 aligncenter" title="alexa" src="http://fuenteperez.es/blog/wp-content/uploads/2011/11/alexa-300x178.jpg" alt="" width="300" height="178" /></a></p>
<p><a href="http://www.trafficestimate.com/" target="_blank"><img class="alignnone" src="http://www.trafficestimate.com/images/TEGREENNICE.png" alt="" width="350" height="84" /></a></p>
<p><strong><a href="http://www.trafficestimate.com" target="_blank">Traffic Estimate</a></strong> lleva funcionando desde 2004. Da información sobre visitas, enlaces, etc pero lo que más me llama la atención es que hacen especial hincapié en el tema de la competencia, indicando cuantos competidores utilizan palabras clave tuyas e incluso de dan el nombre (URL) de los que cree que son tus competidores.</p>
<p><a href="http://www.statbrain.com/" target="_blank"><img class="alignnone" src="http://www.statbrain.com/img/logo.gif" alt="" width="198" height="44" /></a></p>
<p><strong><a href="http://www.statbrain.com/" target="_blank">Statbrain </a></strong>utiliza varias fuentes para realizar una aproximación bastante acertada del número de visitas que tiene una web. Este servicio online toma como referencia desde el ranking de Alexa hasta los enlaces de Google, Altavista o Yahoo para realizar su propia estimación.</p>
<p><a href="http://www.mydnstats.com/" target="_blank"><img class="size-full wp-image-142 alignleft" title="mydnstats" src="http://fuenteperez.es/blog/wp-content/uploads/2011/11/mydnstats.jpg" alt="" width="253" height="38" /></a></p>
<p>En este caso, <strong><a href="http://www.mydnstats.com" target="_blank">My Domain Stats</a></strong> explica que su estimación de tráfico no tiene acceso directo a los datos de DNS o registros de acceso. Se  basa en un modelo estadístico  que trata de extrapolar el tráfico existente en un  dominio, basado únicamente  en los indicadores presentados.</p>
<p>Lo más curioso de esta web es que se atreve a dar un valor aproximado de la web, además de que te permite introducir el número de visitas reales  si las conoces.</p>
<p>En mi caso My Domain Stats dice que tengo 202 visitas únicas en el último mes, cuando realmente he tenido 1.052 según Google Analytics y que su precio es de 65$ (que es más de lo que yo pensaba <img src='http://fuenteperez.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<p><a href="http://www.mydnstats.com/index.php?a=search&amp;q=www.fuenteperez.es" target="_blank"><img class="size-medium wp-image-147 aligncenter" title="mydnstatsVisitas" src="http://fuenteperez.es/blog/wp-content/uploads/2011/11/mydnstatsVisitas1-300x204.jpg" alt="" width="300" height="204" /></a></p>
<p>Mi opinión es que estas web están bien para hacerte una leve idea de si una página tiene un número superior de visitas que la tuya o pasar un rato entretenido viendo estadísticas pero que no son ninguna maravilla.</p>
<p>A mí la que más me gusta es Alexa aunque me de un Ranking bastante patético <img src='http://fuenteperez.es/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Salu2. Héctor.</p>
]]></content:encoded>
			<wfw:commentRss>http://fuenteperez.es/blog/obtener-el-numero-de-visitas-de-cualquier-web/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Post Patrocinados: PayPerPost, ReviewMe, Zync, PagoPorPost, &#8230;</title>
		<link>http://fuenteperez.es/blog/post-patrocinados-payperpost-reviewme-zync-pagoporpost</link>
		<comments>http://fuenteperez.es/blog/post-patrocinados-payperpost-reviewme-zync-pagoporpost#comments</comments>
		<pubDate>Wed, 02 Nov 2011 13:30:38 +0000</pubDate>
		<dc:creator>Héctor Fuente Pérez</dc:creator>
				<category><![CDATA[Adsense]]></category>
		<category><![CDATA[Blogs]]></category>
		<category><![CDATA[Publicidad]]></category>

		<guid isPermaLink="false">http://fuenteperez.es/blog/?p=127</guid>
		<description><![CDATA[El post de un Murciano en el Polo me abrió la curiosidad de cómo hacerme rico con mi blog, y descubrí que hay afortunados  a los que les pagan por escribir post  en sus blog y que existe una gran controversia que enfrenta a los que están de acuerdo con los sistema de pago por post y los que creen que no es ético. [...]]]></description>
			<content:encoded><![CDATA[<p>El <a href="http://jpascu.blogspot.com/2011/10/ganar-dinero-con-tu-blog-adsense_26.html" target="_blank">post de un Murciano en el Polo</a> me abrió la curiosidad de cómo hacerme rico con mi blog, y descubrí que hay afortunados  a los que les pagan por escribir post  en sus blog y que existe una gran controversia que enfrenta a los que están de acuerdo con los sistema de pago por post y los que creen que no es ético.</p>
<p>Para situarnos, existen una serie de paginas como <a href="https://payperpost.com/" target="_blank">PayPerPost</a>, <a href="http://www.reviewme.com/" target="_blank">ReviewMe</a>, <a href="http://zync.es/" target="_blank">Zync </a>y <a href="www.pagoporpost.com/" target="_blank">PagoPorPost</a> que se encarga de poner en contacto blogs con anunciantes. Los anunciantes pagan para que blogs hablen de sus productos, estos son los post patrocinados. Evidentemente estos sistemas se llevan parte del dinero del anunciante.</p>
<p>Dentro de estos sistemas existen diferencias como los que <em>permiten hablar bien o mal del producto</em> o <em>los que solo permiten hablar bien</em>; <em>sistemas que obligan a indicar que el post es publicidad</em> y <em>los que promueven el disimulo</em>.  Entre los primero se encuentran ReviewMe y Zinc y en los segundos PayPerPost y PagoPorPost.</p>
<p>Entrar a formar parte de estos sistemas no es complicado siempre que tenga un blog con <strong>muchas <em>visitas</em></strong>, un <strong><a href="http://es.wikipedia.org/wiki/PageRank" target="_blank">buen </a><em><a href="http://es.wikipedia.org/wiki/PageRank" target="_blank">PageRank</a></em></strong>, <em>índices de <strong><a href="www.alexa.com/" target="_blank">Alexa </a>y <a href="technorati.com/ " target="_blank">Technorati</a></strong></em><strong><a href="technorati.com/ " target="_blank"> </a></strong>aceptables, gran <strong>frecuencia de actualización </strong>del blog, &#8230; vamos que no dejan entrar a cualquiera personaje como el que escribe.</p>
<p>Además parece que participar en estos sistemas tampoco sale gratis. Por ejemplo WordPress dice lo siguiente al respecto:</p>
<p><em>“WordPress está tratando de crear un servicio y una marca de calidad, y piensan que PayPerPost no es más que otro intento de jugar con los motores de búsqueda. Así que si usted quiere usar esa fórmula, búsquese otro sitio porque no podrá hacerlo en WordPress.com”.</em></p>
<p>Y además equipara PayPerPost con spam. A Google tampoco es que le hagan mucha gracia estos sistemas (tal vez porque no se les ha ocurrido a ellos) y piensan que es un intento de manipular el algoritmo de relevancia y conseguir enlaces de manera artificial y añade:</p>
<p><em>“Por ello, desde Google ya han tomado cartas en el asunto, y el propio Matt Cutts (responsable de la calidad del buscador) asegura en <a href="http://www.seomoz.org/blogdetail.php?ID=1576&amp;jump_to_comment=13001">este comentario en un blog</a>que pretenden “llevar a cabo un buen trabajo detectando venta de enlaces”. “Los enlaces pagados que afectan a los buscadores (tanto enlaces de texto como posts patrocinados) pueden suponer una pérdida de confianza por parte de Google”, subraya”.</em></p>
<p>Por lo que parece Google penaliza a los blog que utilizan estos sistemas,  aunque existen algunas formas de intentar engañar a Google como ref=”nofollow” para que el robot de Google no te siga el link.</p>
<p>Existen multitud de opiniones en la web, desde los que están <a href="http://rubisf.wordpress.com/2007/11/26/google-y-los-posts-patrocinados/" target="_blank">a favor y creen  que Google quiere todo el mercado para ellos</a>, los que piensan como Matt Cutts o los están a favor siempre que  se indique, que es un enlace patrocinado y la opinión es sincera y objetiva.</p>
<p>Yo soy de la opinión de estos últimos, ya que la persona esta advertida de que me han pagado por evaluar el &#8220;producto&#8221; y por tanto puede ser una opinión sesgada.</p>
<p>Imaginemos el siguiente escenario: blog de atletismo escribe un artículo  sobre unas zapatillas que le gustan mucho al blogger y este es usuario de Adsense. Mi pregunta es: <em>¿Google Adsense mostrara primero la mejor oferta o mostrara la del anunciante que más le interese?</em></p>
<p>Vosotros que pensáis. ¿Alguien nos pueden contar su experiencia con alguno de estos sistemas?</p>
<p>Salu2. Héctor. <img src='http://fuenteperez.es/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://fuenteperez.es/blog/post-patrocinados-payperpost-reviewme-zync-pagoporpost/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Visual Adsense: Analiza tus datos de Adsense de una forma más amena</title>
		<link>http://fuenteperez.es/blog/visual-adsense-analiza-tus-datos-de-adsense-de-una-forma-mas-amena</link>
		<comments>http://fuenteperez.es/blog/visual-adsense-analiza-tus-datos-de-adsense-de-una-forma-mas-amena#comments</comments>
		<pubDate>Thu, 27 Oct 2011 17:25:38 +0000</pubDate>
		<dc:creator>Héctor Fuente Pérez</dc:creator>
				<category><![CDATA[Adsense]]></category>
		<category><![CDATA[Blogs]]></category>
		<category><![CDATA[Publicidad]]></category>

		<guid isPermaLink="false">http://fuenteperez.es/blog/?p=118</guid>
		<description><![CDATA[El otro día mi buen amigo de Un murciano en el Polo (Muncho Murcia!!) publico un interesante post sobre Adsense.  En este post  nos cuenta que temáticas son las mejor pagadas, diferentes conceptos de Adsense o que es el Eye Tracking. Yo tengo Adsense desde los inicios  del blog y la verdad es no he ganado todavía ni un céntimo de €, pero me [...]]]></description>
			<content:encoded><![CDATA[<p>El otro día mi buen amigo de <a href="http://jpascu.blogspot.com" target="_blank">Un murciano en el Polo</a> (Muncho Murcia!!) publico un interesante <a href="http://jpascu.blogspot.com/2011/10/ganar-dinero-con-tu-blog-adsense_26.html" target="_blank">post sobre Adsense</a>.  En este post  nos cuenta que temáticas son las mejor pagadas, diferentes conceptos de Adsense o que es el Eye Tracking.</p>
<p>Yo tengo <a href="www.google.com/adsense/?hl=es" target="_blank">Adsense </a>desde los inicios  del blog y la verdad es no he ganado todavía ni un céntimo de €, pero me parece gracioso ver como me dan 0,10€ por un click y cuantas impresiones tengo al día.</p>
<p>La verdad es que las tablas que salen en Adsense son un poco rollo, y se echa en falta alguna gráfica que haba más ameno el entorno como en Google Analytics. Puse en el Google Adsense graficas y me encontré <a href="http://visualadsense.com" target="_blank">Visual Adsense</a>.</p>
<p><a href="http://visualadsense.com" target="_blank">Visual Adsense</a> es una página web que analiza tus informes de Google Adsense, para mostrarte gráficas dinámicas de datos útiles y comprensibles sobre los ingresos que obtienes con Adsense.</p>
<p style="text-align: center;"><img class="  aligncenter" title="Grafica de Visual Adsense" src="http://i236.photobucket.com/albums/ff45/knxdt/articulos/visual-adsense.jpg" alt="Grafica de Visual Adsense" width="400" height="294" /></p>
<p>Yo la verdad es que si le he pasado unos cuantos informes, lo que sucede  que las graficas que salen son tan cutres (por las pocas visitas e ingresos)  que  las imágenes  que os pongo aquí son de otras páginas. Para los desconfiados o que tengan datos más interesantes que los míos, <a href="http://visualadsense.com" target="_blank">Visual Adsense</a> informa de que <strong>NO GUARDA</strong> los informes una vez usados para la generación de gráficas.</p>
<p>Además no es necesario darse de alta y los datos que se almacenan en el fichero CSV no contiene información de tu cuenta Adsense. En la siguiente imagen se muestra la tabla CSV obtenida de mi sitio web en el mes de Octubre:</p>
<p style="text-align: center;"><img class="size-medium wp-image-120 aligncenter" title="TablaAdsenseCSV" src="http://fuenteperez.es/blog/wp-content/uploads/2011/10/TablaAdsenseCSV-300x179.jpg" alt="Tabla Adsense CSV" width="300" height="179" /></p>
<p>Espero que vuestras gráficas de impresiones y ganancias muestren resultados mejores que los míos.</p>
<p>Salu2. Héctor <img src='http://fuenteperez.es/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://fuenteperez.es/blog/visual-adsense-analiza-tus-datos-de-adsense-de-una-forma-mas-amena/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obtener parametros de la URL en Adobe Flex (HTML Wrapper)</title>
		<link>http://fuenteperez.es/blog/obtener-parametros-de-la-url-en-adobe-flex-html-wrapper</link>
		<comments>http://fuenteperez.es/blog/obtener-parametros-de-la-url-en-adobe-flex-html-wrapper#comments</comments>
		<pubDate>Thu, 13 Oct 2011 12:08:43 +0000</pubDate>
		<dc:creator>Héctor Fuente Pérez</dc:creator>
				<category><![CDATA[Adobe Flex]]></category>

		<guid isPermaLink="false">http://fuenteperez.es/blog/?p=86</guid>
		<description><![CDATA[Después de ver varias búsquedas en el Google Analytics preguntando sobre este tema me he animado a postear. En este articulo os voy a proponer dos opciones para obtener los parámetros que viajan en una URL. En Flex existen varias formas de pasar parámetros a una aplicación mediante la URL, ya sea mediante variables flashVars o añadiendo los parámetros como si fuese un get [...]]]></description>
			<content:encoded><![CDATA[<p>Después de ver varias búsquedas en el Google Analytics preguntando sobre este tema me he animado a postear.</p>
<p>En este articulo os voy a proponer dos opciones para obtener los parámetros que viajan en una URL. En Flex existen varias formas de pasar parámetros a una aplicación mediante la URL, ya sea mediante variables flashVars o añadiendo los parámetros como si fuese un get (p.e for example, MyApp.<strong>swf</strong>?value1=x&amp;value2=y).</p>
<p>En este post, lo que quiero mostrar son dos soluciones para cuando nuestro swf este embebido dentro del wrapper HTML.</p>
<p>La primera solución y la que yo utilizo, es la propuesta por <a href="http://www.abdulqabiz.com/blog/archives/2006/03/06/how-to-get-url-query-string-variables-within-flex-application/" target="_blank">Abdul Qabiz</a>. Es una clase ActionScript la cual echa mano de la clase <a href="http://fuenteperez.es/blog/invocar-funciones-javascirpt-desde-flex-externalinterface" target="_blank">ExternalInterface</a> para obtener la URL mediante JavaScript, una vez recuperada realiza un parseo para obtener los pares variable-valor. Esta es la parte central del código se basa en la clase ExternalInterface para obtener los parametros mediante JS:</p>
<pre class="brush: as3;">
private function readQueryString():void
{
	_params = {};
	try
	{
		_all =  ExternalInterface.call("window.location.href.toString");
		_queryString = ExternalInterface.call("window.location.search.substring", 1);
		if(_queryString)
		{
			var params:Array = _queryString.split('&#038;');
			var _length:uint = params.length;

			for (var i:uint=0,index:int=-1; i < _length; i++)
			{
				var kvPair:String = params[i];
				if((index = kvPair.indexOf("=")) > 0)
				{
					var key:String = kvPair.substring(0,index);
					var value:String = kvPair.substring(index+1);
					_params[key] = value;
				}
			}
		}
	}catch(e:Error) { trace("Some error occured. ExternalInterface doesn't work in Standalone player."); }
}
</pre>
<p>La segunda solución es la ofrecida por Adobe. A mi personalmente no me gusta demasiado, ya que para poder utilizar esta solución hay que introducir el caracter <strong># </strong>antes de los parámetros de la URL, por ejemplo:</p>
<p><em>http://www.mydomain.com/MyApp.html<strong>#firstName=Nick&amp;lastName=Danger</strong></em></p>
<p>Esto es debido a que utiliza la clase <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=deep_linking_3.html" target="_blank">BrowserManager</a> (que nos permite realizar diferentes tareas con la URL) junto con la clase <a href="http://help.adobe.com/es_ES/FlashPlatform/reference/actionscript/3/mx/utils/URLUtil.html" target="_blank">URLUtil</a> que nos permite parsea la URL y pasarlo a un Object. En el siguiente código se puede ver más claramente.</p>
<pre class="brush: as3;">private function init(e:Event):void {
    bm = BrowserManager.getInstance();
    bm.init("", "Welcome!");

   /* The following code will parse a URL that passes firstName and lastName as
       query string parameters after the "#" sign; for example:
   http://www.mydomain.com/MyApp.html#firstName=Nick&amp;lastName=Danger */
   var o:Object = URLUtil.stringToObject(bm.fragment, "&amp;");
   fName = o.firstName;
   lName = o.lastName;
}</pre>
<p style="text-align: left;">Supongo que conoceréis más maneras de acceder a los parámetros de la URL desde Flex, <a href="http://fuenteperez.es/blog/wp-content/uploads/2011/10/testParametrosURL.zip">aquí podéis descargar </a>esta dos soluciones en un proyecto Eclipse por si os apetece probarlo.</p>
<p style="text-align: left;">Salu2. Héctor.</p>
]]></content:encoded>
			<wfw:commentRss>http://fuenteperez.es/blog/obtener-parametros-de-la-url-en-adobe-flex-html-wrapper/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Live-Android: Android OS en tu PC</title>
		<link>http://fuenteperez.es/blog/live-android-android-os-en-tu-pc</link>
		<comments>http://fuenteperez.es/blog/live-android-android-os-en-tu-pc#comments</comments>
		<pubDate>Wed, 23 Mar 2011 16:16:37 +0000</pubDate>
		<dc:creator>Héctor Fuente Pérez</dc:creator>
				<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://fuenteperez.es/blog/?p=59</guid>
		<description><![CDATA[El crecimiento de Android no deja de sorprendernos y a todos nos gustaría tener un Smartphone de ultima generación para poder jugar con el marcianito verde.  Si no tienes la suerte de disponer de uno de estos móviles (Samsung Nexus S) o una tablet (Motorola Xoom), podéis disponer del Android OS en vuestro PC. Antes de intentar instalar Android en vuestro [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">El crecimiento de <strong>Android </strong>no deja de sorprendernos y a todos nos gustaría tener un Smartphone de ultima generación para poder jugar con el marcianito verde.  Si no tienes la suerte de disponer de uno de estos móviles (<a title="Samsung Nexus S" href="http://www.samsungnexuss.com/" target="_blank">Samsung Nexus S</a>) o una tablet (<a title="Motorola  XOOM" href="http://www.motorola.com/Consumers/US-EN/Consumer-Product-and-Services/Tablets/ci.MOTOROLA-XOOM-US-EN.overview" target="_blank">Motorola Xoom</a>), podéis disponer del Android OS en vuestro PC.</p>
<p>Antes de intentar instalar Android en vuestro PC, podéis echarle un vistazo a este <a title="Evolución de Android" href="http://fuenteperez.es/blog/android-y-su-dulce-evolucion-de-magdalena-cupcake-a-panal-de-miel-honeycomb" target="_blank">post </a>donde muestro la evolución de Android.</p>
<p>En este articulo voy a describir los pasos para crear una maquina virtual con el sistema operativo Android OS. Para crear la maquina virtual vamos a utilizar <a title="Oracle VirtualBox" href="http://www.virtualbox.org/" target="_blank">Oracle VirtualBox</a>, pero podriamos utilizar otros software como <a title="VMWare" href="http://www.vmware.com/es/" target="_blank">VMWare</a>, <a title="QEMU" href="http://wiki.qemu.org/Index.html" target="_blank">QEMU</a>, &#8230; <a title="Virtualización. Maquinas Virtuales." href="http://www.devjoker.com/contenidos/Articulos/73/Vitualizaci%C3%B3n-Maquinas-Virtuales.aspx" target="_blank">más  info sobre Maquinas Virtuales</a>.</p>
<p>Para el sistema operativo vamos a utilizar <a title="Live Android" href="http://code.google.com/p/live-android/downloads/list" target="_blank">Live Android</a>. Live Android es un proyecto que un LiveCD para hacer funcionar Android en plataformas x86. El liveCD es similar a otras distribuciones Live CD Linux como <a title="Live CD Knoppix" href="http://www.knoppix.net/" target="_blank">Knoppix</a>, la cual es suficiente con introducir el CD en el arranque de nuestro equipo e indicar que nuestro equipo tire de la unidad donde tengamos el CD/DVD. De esta forma podemos probar un sistema operativo sin alterar o modificar el SO y los archivos instalados en nuestro PC.  Indicar que Live Android no es 100% compatible con Android, sin embargo nos servirá para ver las cosas más importantes.</p>
<p>Además del LiveCD, tambien podemos instalarlo dentro de una maquina virtual. Para ello vamos a la zona de descargas del proyecto.  Descargamos la iso que se encuentra en dos archivos<a title="LiveAndroid ISO 1" href="http://code.google.com/p/live-android/downloads/detail?name=liveandroidv0.3.iso.001&amp;can=2&amp;q="> liveandroidv.0.3.iso.001</a> y <a title="LiveAndroid ISO 2" href="http://code.google.com/p/live-android/downloads/detail?name=liveandroidv0.3.iso.002&amp;can=2&amp;q=" target="_blank">liveandroidv.0.3.iso.002</a>.</p>
<p>También existe la posibilidad de descargarse el <a title="Live Android torrent" href="http://code.google.com/p/live-android/downloads/detail?name=liveandroidv0.3%20%5Bmininova%5D.torrent&amp;can=2&amp;q=" target="_blank">torrent</a>. Para crear el ISO podemos hacer con <a title="Download HJSpit" href="http://www.freebyte.com/hjsplit/" target="_blank">HJSplit </a>en Windows o en el caso de Linux mediante la sentencia: <em>cat liveandroidv0.3.iso.001 liveandroidv0.3.iso.002 &gt; liveandroidv0.3.iso.</em></p>
<p>Una vez tenemos la ISO completa ya podemos comenzar a crear la maquina virtual. Para ello ejecutamos VirtualBox y pulsamos sobre Nueva Maquina Virtual.</p>
<ul>
<li>Nos aparece un wizart que nos solicita el nombre que le vamos a dar a la maquina virtual, el sistema operativo y la versión. En nuestro caso introducimos:</li>
</ul>
<p><strong>Nombre</strong>: AndroidOS</p>
<p><strong>Sistema Operativo</strong>: Linux</p>
<p><strong></strong><strong>Versión</strong>: Linux 2.6</p>
<p style="text-align: center;"><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_MaquinaVitual.jpg"><img class="size-medium wp-image-60" title="LiveAndroid_MaquinaVirtual" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_MaquinaVitual-300x207.jpg" alt="LiveAndroid: Establecer Nombre y tipo de la maquina virtual" width="300" height="207" /></a></p>
<ul>
<li>En el siguiente paso, nos van a solicitar el tamaño de la RAM de nuestra maquina virtual. Dejamos los 256 MB por defecto, pero podríamos establecer 128 MB sin ningún problema.</li>
</ul>
<p><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_Establecer_Memoria.jpg"><img class="size-medium wp-image-64 aligncenter" title="LiveAndroid_Establecer_Memoria" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_Establecer_Memoria-300x208.jpg" alt="LiveAndroid: VirtualBox Asignar Memoria a la maquina" width="300" height="208" /></a></p>
<ul>
<li>El siguiente paso es crear el disco duro de nuestra maquina virtual. Para esto, VirtualBox no solicita una serie de datos. En nuestro caso vamos a crear un nuevo disco duro virtual, con un tamaño fijo de 512 MB. Podeis verlo en las imágenes.</li>
</ul>
<p><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_DiscoDuro.jpg"><img class="size-medium wp-image-62 aligncenter" title="LiveAndroid_DiscoDuro" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_DiscoDuro-300x208.jpg" alt="LiveAndroid: VirtualBox Crear Disco Duro Virtual" width="300" height="208" /></a></p>
<p><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_DiscoVirtual.jpg"><img class="size-medium wp-image-63 aligncenter" title="LiveAndroid_DiscoVirtual" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_DiscoVirtual-300x209.jpg" alt="LiveAndroid: VirtualBox Establecer tamaño Disco Duro Virtual" width="300" height="209" /></a></p>
<ul>
<li>Después de realizar los pasos anteriores, nos debe mostrar la configuración del nuevo disco duro creado en una pantalla como la que se muestra en la siguiente imagen:</li>
</ul>
<p><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_ResumenDiscoVirtual.jpg"><img class="size-medium wp-image-67 aligncenter" title="LiveAndroid_ResumenDiscoVirtual" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_ResumenDiscoVirtual-300x208.jpg" alt="LiveAndroid: VirtualBox Resumen Disco Virtual" width="300" height="208" /></a></p>
<ul>
<li>Pulsamos el botón Terminar, y nos aparece una pantalla como el resumen de la maquina virtual que hemos creado.</li>
</ul>
<p><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_ResumenMaquinaVirtual.jpg"><img class="aligncenter size-medium wp-image-68" title="LiveAndroid_ResumenMaquinaVirtual" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_ResumenMaquinaVirtual-300x207.jpg" alt="LiveAndroid: VirtualBox Resumen Maquina Virtual" width="300" height="207" /></a></p>
<ul>
<li>Hasta aquí ya tenemos configurada nuestra maquina virtual.</li>
</ul>
<p><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_MenuVirtualBox.jpg"><img class="aligncenter size-medium wp-image-65" title="LiveAndroid_MenuVirtualBox" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_MenuVirtualBox-300x209.jpg" alt="LiveAndroid: Menu Principal VirtualBox" width="300" height="209" /></a></p>
<ul>
<li>Ahora debemos configurar el dispositivo para booterla. Para ello seleccionamos la maquina virtual que hemos creado y pulsamos sobre Iniciar.  Nos aparece la siguiente pantalla:</li>
</ul>
<p><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_Asistente.jpg"><img class="aligncenter size-medium wp-image-61" title="LiveAndroid_Asistente" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_Asistente-300x254.jpg" alt="LiveAndroid: Asistente primera Ejecución VirtualBox" width="300" height="254" /></a></p>
<ul>
<li>En este punto, en el campo Fuente de medios debemos ir hasta la ruta donde hemos dejado la ISO liveandroidv0.3.iso y establecerla como medio de instalación. Pulsamos finalizar y arranca nuestra maquina virtual con <strong>Android</strong>. Nos aparecerá la siguiente pantalla para establecer la resolución:</li>
</ul>
<p><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_Resolucion.png"><img class="aligncenter size-medium wp-image-66" title="LiveAndroid_Resolucion" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_Resolucion-300x255.png" alt="LiveAndroid: Selecionar Resolucion" width="300" height="255" /></a></p>
<ul>
<li>Seleccionamos la resolución que más nos guste 800*600 o 1024*768 y continua el arranque de la maquina virtual. Cuando se haya cargado por completo Android nos debe mostrar la siguiente imagen:</li>
</ul>
<p><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_Pantalla_Inicial.png"><img class="size-medium wp-image-81 aligncenter" title="LiveAndroid_Pantalla_Inicial" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/LiveAndroid_Pantalla_Inicial-300x242.png" alt="Live Android: Pantalla Inicial" width="300" height="242" /></a></p>
<p>Ahora ya podéis cacharrear con <strong>Android </strong>sin necesidad de disponer de un Smartphone o una Tablet con <strong>Android</strong>.</p>
<p>Salu2. Héctor.</p>
]]></content:encoded>
			<wfw:commentRss>http://fuenteperez.es/blog/live-android-android-os-en-tu-pc/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JUnit: Manual Básico</title>
		<link>http://fuenteperez.es/blog/junit-manual-basico</link>
		<comments>http://fuenteperez.es/blog/junit-manual-basico#comments</comments>
		<pubDate>Mon, 14 Mar 2011 16:57:09 +0000</pubDate>
		<dc:creator>Héctor Fuente Pérez</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://fuenteperez.es/blog/?p=22</guid>
		<description><![CDATA[JUnit es un &#8220;framework&#8221; para automatizar las pruebas unitarias de aplicaciones Java. Se utiliza en la fase de desarrollo, su utilización por parte de los desarrolladores permite la creación de software de mayor calidad. JUnit es un conjunto de clases que permite realizar la ejecución de clases Java de manera controlada, para poder evaluar si  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.junit.org/" target="_blank"><strong>JUnit</strong> </a>es un &#8220;framework&#8221; para automatizar las pruebas unitarias de aplicaciones Java. Se utiliza en la fase de desarrollo, su utilización por parte de los desarrolladores permite la creación de software de mayor calidad.</p>
<p>JUnit es un conjunto de clases que permite realizar la ejecución de clases Java de manera controlada, para poder evaluar si  el funcionamiento de cada uno de los métodos de la clase se comporta como se espera.</p>
<p>Es decir, en función de algún valor de entrada se evalúa el valor de retorno esperado, si la clase cumple la especificación, entonces JUnit devolverá que el método de la clase pasó exitosamente la preuba. En caso de que el valor esperado sea diferente al retornado por el método durante la ejecución, Juni devolverá un fallo en el método correspondiente.</p>
<p>JUnit es tambien un medio para controlar las prueba de regresión, necesarias cuando una parte del código ha sido modificado y se desea ver que el nuevo código cumple los requisitos anteriores y que no se ha alterado su funcionalidad después de la nueva modificación.</p>
<p>Este framework se encuentra en el momento de escribir el post en la versión 4.5, con algunas mejoras:</p>
<ul>
<li>Incluye soporte para anotaciones (Java 5 Annotations).</li>
<li>Permite timeouts en  los test.</li>
<li>Configurar excepciones esperadas.</li>
<li>Ordenación, priorización, categorización y filtrado de tests.</li>
<li>Más tipos de aserciones (ej: assertEquals(Object[], Object[]).</li>
<li>Se elimina la distinción entre errores (errors) y fallos (failures).</li>
<li>&#8230;</li>
</ul>
<p>A continuación vamos a ver un ejemplo de utilización de JUnit. La sobre la cual vamos  a realizar las pruebas se llama ArrayWrapper, consiste en una simple implementación de un wrapper sobre int array[], el cual tendra una serie de métodos. El código es el siguiente:</p>
<pre class="brush: java; title: ; notranslate">
package es.fuenteperez.junit.base;
public class ArrayWrapper {
	int arr[];
	//Constructor
	public ArrayWrapper(int par[]){
		this.arr = par;
	}
	public int size(){
		return this.arr.length;
	}

	public String toString(){
		StringBuffer str = new StringBuffer();
		int i = 0;
		str.append(&quot;[&quot;);
		for (i = 0; i &lt; this.arr.length - 1; i++) {
			str.append(arr[i] + &quot;,&quot;);
		}
		str.append(arr[i] + &quot;]&quot;);
		return str.toString();
	}
	public void setElementAt(int elemento, int indice){
		arr[indice] = elemento;
	}
	public int[] getArray(){
		return this.arr;
	}
}
</pre>
<p>Tiene una serie de metodos (constructor, size, toString, setElementAt y getArray).</p>
<p>Para poder realizar la prueba sobre una clase Java con JUnit, debemos seguir los siguientes pasos:</p>
<ol>
<li><a href="http://sourceforge.net/projects/junit/files/junit/" target="_blank">Descargar </a>una versión de JUnit, y añadir la librería junit-version.jar al proyecto sobre el cual vamos a realizar las pruebas.</li>
<li>Crear la clase que  contrendrá las pruebas. En nuestro caso la hemos llamado TestArrayWrapper, por convenio el nombre  de la clase comienza por Test seguido del nombre de la clase sobre la cual realizamos las pruebas.</li>
<li>Importar el paquete <em>junit.framework.TestCase.</em>
<pre class="brush: java; title: ; notranslate">import junit.framework.TestCase;</pre>
</li>
<li>Extender nuestra clase de prueba de TestCase.
<pre class="brush: java; title: ; notranslate">public class TestArrayWrapper extends TestCase{</pre>
</li>
<li>Crear un método tipo void por cada prueba que se quiera  realizar. El nombre del método que va a probarse, debe empezar por el prefijo test.
<pre class="brush: java; title: ; notranslate">
public void testSize(){
}
public void testToString(){
}
public void testSetElementAt(){
}
</pre>
</li>
<li>Los casos de prueba se consideran exitosos o fallidos dependiendo de una  sentencia que se incluye en los casos de prueba y que es de tipo assert.</li>
</ol>
<p>Siguiendo los pasos anteriores creamos nuestra clase Test. El código generado es el siguiente:</p>
<pre class="brush: java; title: ; notranslate">
package es.fuenteperez.junit.test;
import es.fuenteperez.junit.base.ArrayWrapper;
import junit.framework.TestCase;
public class TestArrayWrapper extends TestCase{
	private int arr[];
	private ArrayWrapper arrayWrapper;
	private int TAMANO = 5;
	protected void setUp() throws Exception {
		super.setUp();
		arr = new int[TAMANO];
		for (int i = 0; i &lt; arr.length; i++) {
			arr[i] = i;
		}
		arrayWrapper = new ArrayWrapper(arr);
	}
	protected void tearDown() throws Exception {
		super.tearDown();
             arrayWrapper = null;
	}
	public void testSize(){
	          assertEquals(TAMANO, arrayWrapper.size());
	}
	public void testToString(){
		arrayWrapper.getArray();
		assertEquals(&quot;[0,1,2,3,4]&quot;, arrayWrapper.toString());
	}
	public void testSetElementAt(){
		arrayWrapper.setElementAt(99, 2);
		int ret[] = arrayWrapper.getArray();
		assertEquals(99, ret[2]);
	}
}
</pre>
<p>Podemos observar dos métodos de los  cuales no habiamos hablado anteriormente, setUp() y tearDown(), son dos métodos que nos proporciona JUnit.</p>
<p>El método setUp() se ejecutara justo antes de la ejecución de cada uno de los metodos test. El método tearDown() se ejecuta justo después de la ejecución de cada uno de los test.</p>
<p>Por tanto podemos utilizar estos métodos para inicializar recursos, variables de clase o instanciar un atributo, basicamente se utiliza cuando la inicialización de estas variables es igual para todos los metodos, p.e realizar una conexión a una base de datos.</p>
<p>En nuestro caso, los métodos son muy sencillos y consiste en inicializar el int[] que vamos a utilizar en todos los métodos.</p>
<p><strong>Ejecutar las pruebas</strong></p>
<p>A continuación, se muestran dos formas de ejecutar los test unitarios:</p>
<p><em>- TestRunner de JUnit</em></p>
<p>JUnit proporciona varios TestRunner, como <strong>junit.textui.TestRunner </strong>(muestra los resultados en modo texto) o <strong>junit.swingui.TestRunner </strong>(muestra los resultados gráficamente).</p>
<pre class="brush: java; title: ; notranslate">
java –cp junit-version.jar junit.textui.TestRunner
java –cp junit-version.jar junit.swingui.TestRunner
</pre>
<p>Nos aparece una ventana donde indicamos el nombre del caso de preuba que queremos ejecutar (o lo elegimos de una lista), y luego pulsamos Run:</p>
<p><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/junit1.png"><img class="size-medium wp-image-43 aligncenter" title="junit1" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/junit1-300x297.png" alt="" width="300" height="297" /></a></p>
<p>La barra verde aparece si las pruebas han ido bien, y si no aparece en rojo. En la pestaña Failures podemos ver que pruebas han fallado, y en Test Hierarchy se muestra todas las pruebas realizadas, y los resultados de cada una. En el cuadro inferior nos aparecen los errores que se han producido en la pruebas.</p>
<p>Para ejecutar el TestRunner u otro ejecutor de pruebas, podemos también definirnos un método main en nuestra clase de prueba que lo lance, en nuestro caso:</p>
<pre class="brush: java; title: ; notranslate">
public static void main(String[] args){
       String[] nombreTest = {TestArrayWrapper.class.getName()};
       Junit.swingui.TestRunner.main(nombresTest);
}
</pre>
<p>Vemos que al main del TestRunner se le pueden pasar como parametros los nombres de las clases de prueba que queremos ejecutar.</p>
<p>El TestRunner junit.swingui.TestRunner a partir de la distribución 4.x fue eliminado por decisión del core de JUnit debido a que existen plugins para los IDEs más utilizados (Eclipse, NetBeans, &#8230;).</p>
<p><em>- Ejecución desde Eclispe</em></p>
<p>Antes de comenzar a detallar como crear y ejecutar los test unitarios desde Eclipse, vamos a mostrar la estructura de carpetas.</p>
<p>Teóricamente, la clase de pruebas debe crearse en el mismo paquete  donde se encuentra nuestra clase. Esto nos permitirá tener acceso a las variables declaradas sin identificador de acceso, sin necesidad de un metodo alterno como un setter. Esto es correcto  para proyectos pequeños con pocas clases, pero en proyectos más grandes tiene inconvenientes.</p>
<ul>
<li>El paquete tendra el doble de clases</li>
<li>Aumenta la dificultad de &#8216;depurar&#8217; el paquete, ya que antes de entregarlo al cliente debemos encargarnos de eliminar esas clases, siel cliente no las desea.</li>
<li>La búsqueda de un archivo en particular se vuelve dificil al tener más archivos donde hacerlo.</li>
</ul>
<p>Un método común para hacer pruebas es crear un directorio con una estructura paralela a nuestro directorio. De esta manera, la estructurade carpetas quedaría de las siguiente manera:</p>
<p><em>/src/main/utils   &#8211;&gt;  /src/test/utils</em></p>
<p><em>/src/main/date   &#8211;&gt; /src/test/date</em></p>
<p><em>/src/main/dao    &#8211;&gt; /src/test/dao</em></p>
<p>Una vez determinada la estructura de directorios y partiendo de que se dispone de un proyecto Eclipse previamente creado, se van a determinar los pasos a seguir para la utilización de JUnit desde Eclipse. Eclipse incorpora opciones para poder trabajar con JUnit desde él.</p>
<p>Al proyecto Java creado en Eclipse, debemos añadir la libreria de JUnit en el Build Path. Para ello  se realiza click con el botón derechos  sobre el proyecto, aparece un desplegable, realizamos click sobre Properties y a continuación sobre Java Build Path seleccionamos la pestaña Libraries.</p>
<p>Nos apareceran varias opciones Add Jars, Add External Jars &#8230;, como se va añadir la libre junit-version.jar,  se debe seleccionar Add Jars si la libreria se encuentra en alguna de las carpetas del proyecto a probar, si la librería se encuentra en cualquier otra ubicación se debe seleccionar Add External Jars.</p>
<p>En la siguiente imagen podemos ver como añadir la librería junit-4.5. jar a nuestro proyecto:</p>
<p style="text-align: center;"><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/junit2.png"></a><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/junit2.png"><img class="aligncenter size-medium wp-image-44" title="junit2" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/junit2-300x185.png" alt="" width="300" height="185" /></a></p>
<p>Una vez asociado el jar, se crean los paquetes y las clases para realizar las pruebas. Desde el menú File&#8211;&gt;New&#8211;&gt;Other&#8211;&gt;JUnit&#8211;&gt;TestCase, Eclipse crear una clase de pruebas, para ello se debe incluir una serie de datos como son la carpeta y el paquete donde lo vamos a crear, el nombre de la clase de pruebas, la superclase (junit.framework.TestCase), la clase sobre la que vamos a realizar las pruebas, y una serie de valores opcionales.</p>
<p style="text-align: center;"><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/junit3.png"><img class="size-full wp-image-45" title="junit3" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/junit3.png" alt="" width="324" height="347" /></a></p>
<p>Llegados a este punto ya podemos implementar nuestra clase de pruebas como se mostro al comienzo del post. Una vez definida la clase de prueba, vamos a ejecutar las pruebas, para ello se pulsa el botón derecho  sobre la clase de prueba, y se selecciona  Run &#8211;&gt; Run As &#8211;&gt; JUnit Test.</p>
<p style="text-align: center;"><a href="http://fuenteperez.es/blog/wp-content/uploads/2011/03/junit4.png"><img class="aligncenter size-full wp-image-46" title="junit4" src="http://fuenteperez.es/blog/wp-content/uploads/2011/03/junit4.png" alt="" width="321" height="401" /></a></p>
<p>A continuación se deben analizar los resultados obtenidos. Como se puede comprobar la prueba realizada no se completo con éxito. De 3 metodos solamente uno se ejecuto satisfactoriamente (testSize).</p>
<p>JUnit indica que el método testToString tiene errores y testSetElementAt se ejecuto con Failure. La diferencia entre Error y Failure es que si se produjo un Error es porque efectivamente existe un error en ejecución en nuestro caso en el método testToString se intento acceder a un elemento 10 de un arrary que solamente tiene definidos 5 elementos.</p>
<p>Para ver la excepción enviada por Java, basta con pulsar sobre el método testToString y en la sección Failure Trace nos mostrar la traza de error.</p>
<p>En el caso de Failure, la ejecución del método se realizo correctamente, esto significa que no ha devuelto ninguna excepción, pero la salida retornada no era la esperada, por tanto no cumple e l Assert establecido en el método de prueba. De igual manera si se selecciona el método con Failure, automaticamente nos aparece la traza, en nuestro caso no indica el siguiente mensajes:</p>
<p><em>junit.framework.AssertionFailedError: expected &lt;100&gt; but was &lt;99&gt;</em></p>
<p>Lo cual significa que la salida espera era 100 y el valor retornado fue 99. Una vez realizados los cambios para solucionar tanto los errores como los failures, se vuelve a lanzar los test.</p>
<p><strong><em>Conclusiones</em></strong></p>
<p>JUnit es una herramienta Open Source para la realización de test unitarios en la fase de desarrollo para el entorno Java.</p>
<p>Es la herramienta de test más utilizada en entornos Java, lo suficientemente madura para su implantación en entornos comerciales y con un coste cero.</p>
<p>Por todo ello, los principales IDEs de desarrollo (Eclipse, NetBeans, RAD, etc) incorporan plugins para  su utilización.</p>
<p>Además es complementaria con otras herramientas de pruebas como <a href="http://cobertura.sourceforge.net/" target="_blank">Cobertura</a>, el cual facilita la creación de informes HTML y XML de cobertura de las pruebas realizadas mediante JUnit (% de código probado, % métodos correctos, errores y failures, líneas de código probadas, etc) en un proyecto.</p>
<p>Salu2. Héctor.</p>
]]></content:encoded>
			<wfw:commentRss>http://fuenteperez.es/blog/junit-manual-basico/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

