<?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>Se hace camino al andar... &#187; maven</title>
	<atom:link href="http://blog.jmbeas.es/tag/maven/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jmbeas.es</link>
	<description>Experiencias de un informático vocacional buscando la calidad y sus efectos colaterales.</description>
	<lastBuildDate>Mon, 16 Jan 2012 07:25:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>

   <image>
    <title>Se hace camino al andar...</title>
    <url>http://0.gravatar.com/avatar/8c024022cec721aaa11dc3b092e2c29c.png?s=48</url>
    <link>http://blog.jmbeas.es</link>
   </image>
		<item>
		<title>Sincronizar de GoogleCode al Repositorio Central de Maven</title>
		<link>http://blog.jmbeas.es/2009/03/27/sincronizar-de-googlecode-al-repositorio-central-de-maven/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sincronizar-de-googlecode-al-repositorio-central-de-maven</link>
		<comments>http://blog.jmbeas.es/2009/03/27/sincronizar-de-googlecode-al-repositorio-central-de-maven/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 11:43:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[concordion]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/sincronizar-de-googlecode-al-repositorio-central-de-maven/</guid>
		<description><![CDATA[Finalmente lo conseguí y la versión 1.3.1-RC5 de Concordion ya está en el repo1 de Maven. Y ahora está sincronizado el repositorio de GoogleCode con el repo1, con lo que ya no tenemos que depender de construir manualmente un bundle y abrir una petición en JIRA, como he explicado en una entrada anterior. ¡Guau! Esto [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente lo conseguí y la versión 1.3.1-RC5 de Concordion <a href="http://repo2.maven.org/maven2/org/concordion/concordion/" target="_blank">ya está en el repo1 de Maven</a>. Y ahora está sincronizado <a href="http://concordion.googlecode.com/svn/repos/releases/">el repositorio de GoogleCode</a> con el repo1, con lo que ya no tenemos que depender de construir manualmente un bundle y abrir una petición en JIRA, como he explicado en <a href="http://jmbeas.blogspot.com/2009/03/subir-una-version-en-googlecode-al.html">una entrada anterior</a>. ¡Guau! Esto es <a href="http://www.microsiervos.com/archivo/ciencia/frase-neil-armstrong.html" target="_blank">un avance</a>. Ahora sólo hay que hacer release con los comandos &#8220;mvn release:prepare&#8221; y &#8220;mvn release:perform&#8221; y esperar a que ocurra la sincronización&#8230; <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/03/27/sincronizar-de-googlecode-al-repositorio-central-de-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Concordion 1.3.1-RC5</title>
		<link>http://blog.jmbeas.es/2009/03/24/concordion-1-3-1-rc5/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=concordion-1-3-1-rc5</link>
		<comments>http://blog.jmbeas.es/2009/03/24/concordion-1-3-1-rc5/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 19:44:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[concordion]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/concordion-1-3-1-rc5/</guid>
		<description><![CDATA[Ya está disponible la versión 1.3.1-RC5 de Concordion. Podéis usarlo con Maven (de momento, hasta que se publique en el Repositorio Central de Maven) declarando el repositorio remoto del proyecto: http://concordion.googlecode.com/svn/repos/releases Para los que tengáis un proyecto en GoogleCode y no sepáis cómo publicarlos en el Repositorio Central de Maven, podéis echar un vistazo al [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>Ya está disponible la versión 1.3.1-RC5 de Concordion. Podéis usarlo con Maven (de momento, hasta que se publique en el Repositorio Central de Maven) declarando el repositorio remoto del proyecto:</p>
<p><a href='http://concordion.googlecode.com/svn/repos/releases' target='_blank'>http://concordion.googlecode.com/svn/repos/releases</a></p>
<p>Para los que tengáis un proyecto en GoogleCode y no sepáis cómo publicarlos en el Repositorio Central de Maven, podéis echar un vistazo al wiki del proyecto Concordion donde explico (en inglés) <a href='http://code.google.com/p/concordion/wiki/HowToMakeARelease' target='_blank'>cómo hacer una release usando maven-release-plugin</a>. También os resultará útil ver la solicitud que hice en el <a href='http://jira.codehaus.org/browse/MAVENUPLOAD-2393' target='_blank'>JIRA</a> pues allí he ido relatando cómo he ido resolviendo el asunto. Lo siento, todo está en inglés, pero os lo puedo resumir:</p>
<p>1) Usar Maven 2.0.9 (yo utilizaba el embedder y hasta que no pasé a la 2.0.9 no conseguí avanzar)<br />2) Usar dav:https://concordion.googlecode.com/svn/repos/releases en la sección distributionManagement del pom.xml<br />3) Incluir username y password en nuestro settings.xml (tenemos que ser desarrolladores del proyecto para poder hacer commit en SVN, así que también para hacer deploy con Maven)</p>
<p>El último paso es, depués de hacer release, crear una entrada en el <a target='_blank' href='http://jira.codehaus.org/secure/CreateIssue.jspa?pid=10367&amp;issuetype=5'>JIRA</a> solicitando la sincronización. Yo he utilizado estos valores y estoy a la espera de conocer el veredicto. <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>&#8220;org.concordion&#8221;,&#8221;/home/maven/repository-staging/to-ibiblio/maven-svn&#8221;,&#8221;svn&#8221;,&#8221;Jose M Beas&#8221;,&#8221;jose.m.beas@gmail.com&#8221;,,&#8221;http://concordion.googlecode.com/svn/repos/releases/&#8221;<br /><br/><br/>
<div class='zemanta-pixie'><img src='http://img.zemanta.com/pixy.gif?x-id=84be7745-6558-41d7-93e5-68e7e5cf9d5e' class='zemanta-pixie-img'/></div>
</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/03/24/concordion-1-3-1-rc5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subir una versión en GoogleCode al Repositorio Central de Maven</title>
		<link>http://blog.jmbeas.es/2009/03/18/subir-una-version-en-googlecode-al-repositorio-central-de-maven/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=subir-una-version-en-googlecode-al-repositorio-central-de-maven</link>
		<comments>http://blog.jmbeas.es/2009/03/18/subir-una-version-en-googlecode-al-repositorio-central-de-maven/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 02:30:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[concordion]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/subir-una-version-en-googlecode-al-repositorio-central-de-maven/</guid>
		<description><![CDATA[Acabo de terminar de solicitar la publicación en el Repositorio Central de Maven de la versión 1.3.1-RC5 de Concordion. Hasta aquí nada novedoso, pero resulta que nuestro código está alojado en Google Code y no es tan fácil automatizar todo este proceso.He utilizado maven-release-plugin para conseguir que ejecutando mvn release:prepare me haga en Subversion los [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>Acabo de terminar de solicitar la publicación en el Repositorio Central de Maven de la versión 1.3.1-RC5 de <a target='_blank' href='http://www.concordion.org'>Concordion</a>. Hasta aquí nada novedoso, pero resulta que nuestro código está alojado en <a target='_blank' href='http://code.google.com/p/concordion/'>Google Code</a> y no es tan fácil automatizar todo este proceso.<br/><br/>He utilizado <a target='_blank' href='http://maven.apache.org/plugins/maven-release-plugin/howto.html'>maven-release-plugin</a> para conseguir que ejecutando <tt>mvn release:prepare</tt> me haga en Subversion los siguientes cambios:<br/>1) commit tras quitar el -SNAPSHOT de la versión y poner el número de versión 1.3.1-RC5 en el pom.xml<br/>2) copia de esa revisión a la rama de etiquetas (tags) con el nombre adecuado (en mi caso concordion-1.3.1-RC5)<br/>3) commit tras quitar el número de versión de la release y en mi caso dejar 1.3.1-SNAPSHOT, pero si hubiera sido la final hubiera puesto 1.3.2-SNAPSHOT, por ejemplo<br/><br/>Y luego, ejecutando <tt>mvn release:perform</tt>, Maven descarga el código etiquetado y ejecuta repository:create-bundle para obtener el bundle que <b>manualmente</b> debo subir al <a target='_blank' href='http://code.google.com/p/concordion/downloads/list'>area de Downloads</a> de mi proyecto. <br/><br/>Finalmente, con el bundle ya en un sitio público (y relacionado claramente con mi proyecto), <a target='_blank' href='http://jira.codehaus.org/browse/MAVENUPLOAD-2393'>solicito el &#8220;upload&#8221; en JIRA</a>.<br/><br/>Todo el proceso lo he documentado en <a target='_blank' href='http://code.google.com/p/concordion/wiki/HowToMakeARelease'>el wiki del proyecto</a> (aunque, claro, está en inglés).<br/><br/>Espero que os ayude y si por casualidad os enteráis de cómo hacer &#8220;sync&#8221; desde GoogleCode, por favor, contadmelo porque quiero poder automatizar completamente el proceso. Yo, por mi parte, en cuanto tenga tiempo echaré un vistazo a <a target='_blank' href='http://maven.riedelcastro.org/gcupload-maven-plugin/index.html'>Google Code Upload Maven Plugin</a>.<br/><br/><br /><b>Actualización:</b><br/><br />He modificado el procedimiento para solicitar la publicación en el Repositorio Central de Maven para que se sincronice con un repositorio remoto (también en el SVN de GoogleCode). Más detalles en <a href="http://jmbeas.blogspot.com/2009/03/concordion-131-rc5.html">el siguiente post</a>.</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/03/18/subir-una-version-en-googlecode-al-repositorio-central-de-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Versionado automático con Maven</title>
		<link>http://blog.jmbeas.es/2009/03/16/versionado-automatico-con-maven/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=versionado-automatico-con-maven</link>
		<comments>http://blog.jmbeas.es/2009/03/16/versionado-automatico-con-maven/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 03:32:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[integración continua]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/versionado-automatico-con-maven/</guid>
		<description><![CDATA[Este fin de semana he estado jugando con maven-release-plugin con el objetivo de automatizar el versionado de mi código y, bueno, el resultado ha sido un tanto agridulce porque por un lado ha sido muy sencillo pero por otro me he encontrado con un defecto de esos que cuesta encontrar, sobre todo cuando no estás [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>Este fin de semana he estado jugando con <a target='_blank' href='http://maven.apache.org/plugins/maven-release-plugin/'>maven-release-plugin</a> con el objetivo de automatizar el versionado de mi código y, bueno, el resultado ha sido un tanto agridulce porque por un lado ha sido muy sencillo pero por otro me he encontrado con un defecto de esos que cuesta encontrar, sobre todo cuando no estás seguro de lo que tienes entre manos porque ni lo has hecho tú ni está suficientemente documentado.</p>
<p><big>La parte fácil</big></p>
<p>Antes que nada, os cuento lo que yo suelo hacer con el código cada vez que termino una iteración.</p>
<p>Supongamos que la versión actual es la 0.0.1-SNAPSHOT. </p>
<p>1) Me recorro todos los pom.xml donde he puesto 0.0.1-SNAPSHOT y le quito el -SNAPSHOT. <br />2) Hago commit de los pom.xml que he cambiado.<br />3) Etiqueto esta versión del código en el repositorio (en mi caso Subversion).<br />4) Vuelvo a recorrer todos los pom.xml para dejar la siguiente versión: 0.0.2-SNAPSHOT.<br />5) Hago commit de los pom.xml.</p>
<p>Y eso todas las veces&#8230;</p>
<p>Pues bien, resulta que hay un plugin de Maven que hace todo eso por mi: <a target='_blank' href='http://maven.apache.org/plugins/maven-release-plugin/'>maven-release-plugin</a>.</p>
<p>Antes de empezar yo aconsejo también hacer <tt>mvn clean install</tt>, pero no es obligatorio. Yo es que soy un poco obsesivo con estas cosas.</p>
<p>Para usarlo no puedo tener ningún &#8220;commit&#8221; pendiente, de lo contrario, el plugin se quejará. Es obligatorio también proporcionar la información de dónde está nuestro repositorio, para ello debemos incluir el apartado &#8220;scm&#8221; en los pom.xml que lo requieran (según los tengamos organizados):
<pre name='code' class='xml'> <scm>  <url>https://shopaas.googlecode.com/svn/trunk/shopaas</url>  <connection>scm:svn:http://shopaas.googlecode.com/svn/trunk/shopaas</connection>  <developerConnection>scm:svn:https://shopaas.googlecode.com/svn/trunk/shopaas</developerConnection> </scm></pre>
<p>El plugin sustituirá en estas cadenas los valores adecuados, por eso es aconsejable revisar cómo quedan estas secciones de los pom.xml las primeras veces.</p>
<p>Lo primero que hay que hacer es:<br /><tt><br />mvn release:prepare -DdryRun=true<br /></tt></p>
<p>Esta instrucción cubre los pasos 1, 2 y 3. La propiedad &#8220;dryRun&#8221; nos sirve para decirle al plugin si queremos o no hacer efectivos los cambios, si le damos el valor &#8220;true&#8221;, el plugin NO hará commit ni tag. También comprueba si hay dependencias con artefactos cuya versión aún es SNAPSHOT, pero esto no lo he probado, la verdad. Además, &#8220;release:prepare&#8221; ejecuta por defecto los siguientes &#8220;goals&#8221; sobre el proyecto: &#8220;clean verify&#8221;. Esto hace que se ejecuten las pruebas.</p>
<p>Cuando lo ejecutemos, por la consola Maven nos preguntará la versión de cada pom.xml (él no quita el &#8220;-SNAPSHOT&#8221; sino que pone la versión que nosotros le digamos). También nos pregunta cuál es el nombre con el que va a etiquetar esta versión en el repositorio de control de versiones. Y por último nos pregunta cuál es la versión que vamos a tener para trabajar después de este versionado (que suele ser la siguiente con el &#8220;-SNAPSHOT&#8221;). El plugin nos propone valores por defecto que podemos aceptar pulsando &#8220;intro&#8221;. Para cada pom.xml, la ejecución con &#8220;dryRun=true&#8221; nos dejará 3 ficheros: pom.xml.releaseBackup, pom.xml.tag y pom.xml.next, que se corresponden con el que tenemos antes de ejecutar (0.0.1-SNAPSHOT), el que se etiquetará como versión estable (0.0.1) y el que quedará en el &#8220;trunk&#8221; con la nueva versión de trabajo (0.0.2-SNAPSHOT). Pero el plugin no hará efectivos estos cambios porque le hemos dicho &#8220;dryRun=true&#8221;.</p>
<p><big>La parte difícil</big></p>
<p>Hasta aquí todo iba bien, pero el siguiente paso me dio problemas. Pero primero hay que ejecutar sin &#8220;dryRun&#8221; para que se hagan efectivos los cambios en SVN.</p>
<p><tt><br />mvn release:clean release:prepare<br /></tt></p>
<p>release:clean sirve para limpiar los ficheros que haya podido dejar una ejecución anterior. También podemos usar releas:rollback para deshacer los cambios efectuados en SVN.</p>
<p>El primer obstáculo fue al usar el Maven embebido que viene con m2eclipse. Así que tuve que pasar a usar una instalación externa (concretamente la 2.0.9).</p>
<p>El segundo obstáculo fue al ejecutar el comando y encontrarme con el siguiente mensaje de error:</p>
<pre name="code" class="text">[INFO] Executing: cmd.exe /X /C "svn --non-interactive commit --file C:\Temp\maven-scm-2032301768.commit --targets C:\Temp\maven-scm-5209016095571570993-targets"[INFO] Working directory: C:\eclipseWorkspaces\MiTienda\shopaas[INFO] Tagging release with the label shopaas-0.0.1...[INFO] Executing: cmd.exe /X /C "svn --non-interactive copy --file C:\Temp\maven-scm-328141097.commit . https://shopaas.googlecode.com/svn/tags/shopaas-0.0.1"[INFO] Working directory: C:\eclipseWorkspaces\MiTienda\shopaas[INFO] ------------------------------------------------------------------------[ERROR] BUILD FAILURE[INFO] ------------------------------------------------------------------------[INFO] Unable to tag SCMProvider message:The svn tag command failed.Command output:svn: Commit failed (details follow):svn: File '/svn/tags/shopaas-0.0.1/domain/pom.xml' already exists</pre>
<p>El caso es que hay un <a href="http://jira.codehaus.org/browse/SCM-406" target="_blank">bug</a> (¡cómo no!) que, para colmo, no parece estar claro si está del lado de Maven o de <a href="http://subversion.tigris.org/issues/show_bug.cgi?id=3119" target="_blank">SVN</a>. Parece que maven-release-plugin hace &#8220;svn copy&#8221; para crear el tag y que, a partir de la versión 1.5.1 de Subversion esto mismo ha comenzado a fallar. Así que hay que hacer manualmente la siguiente chapu:</p>
<pre name="code" class="text"># mvn release:prepare=> fails# svn up -r head # mvn release:prepare -Dresume</pre>
<p>De esta manera, los ficheros en .svn que han quedado chungos se arreglan con &#8220;svn up&#8221; y luego se continúa por donde se había quedado (con -Dresume). Con Eclipse consiste en primero hacer &#8220;Team / Update&#8221; y a continuación ejecutar Maven con el goal &#8220;release:prepare&#8221; y el Parameter &#8220;resume&#8221; (al que tenemos que ponerle el valor &#8220;true&#8221; porque la configuración del launcher que propone m2eclipse no permite añadir un parámetro con nombre pero sin valor).</p>
<p>Llegados a este punto podemos revisar que en nuestro servidor de SVN se han creado tres nuevas revisiones con el siguiente comentario:<br />* [maven-release-plugin] prepare release shopaas-0.0.1<br />* [maven-release-plugin] copy for tag shopaas-0.0.1<br />* [maven-release-plugin] prepare for next development iteration</p>
<p>Los ficheros que son cambiados tras la ejecución (los pom.xml) podemos compararlos con las correspondientes versiones anteriores. En mi ejemplo, el mismo trozo del pom.xml que muestro más arriba queda como:</p>
<pre name='code' class='xml'> <scm>  <url>https://shopaas.googlecode.com/svn/tags/shopaas-0.0.1</url>  <connection>scm:svn:http://shopaas.googlecode.com/svn/tags/shopaas-0.0.1</connection>  <developerConnection>scm:svn:https://shopaas.googlecode.com/svn/tags/shopaas-0.0.1</developerConnection> </scm></pre>
<p>Y en nuestro espacio de trabajo tenemos que la versión de los diferentes pom.xml ha quedado ahora como 0.0.2-SNAPSHOT, tal y como respondimos en su momento. También nos ha quedado un fichero release.properties con todas las versiones y trayectorias en SVN de los componentes versionados por este plugin.</p>
<p><big>Queda pendiente</big></p>
<p>Me queda aún por probar a realizar el despliegue de la nueva versión de manera automatizada. Para ello hay que usar el goal <a target='_blank' href='http://maven.apache.org/plugins/maven-release-plugin/examples/perform-release.html'>&#8220;release:perform&#8221;</a>, que según parece ejecuta por defecto los goals &#8220;deploy site-deploy&#8221; después de obtener dicha versión desde el servidor de control de versiones.<br/><br/></div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/03/16/versionado-automatico-con-maven/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Concordion: un ejemplo</title>
		<link>http://blog.jmbeas.es/2009/02/25/concordion-un-ejemplo/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=concordion-un-ejemplo</link>
		<comments>http://blog.jmbeas.es/2009/02/25/concordion-un-ejemplo/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 13:14:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[concordion]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/concordion-un-ejemplo/</guid>
		<description><![CDATA[Hace ya varios meses que estoy involucrado en el proyecto Concordion, un framework para construir y ejecutar pruebas de aceptación. Desde entonces hasta ahora el código base no ha cambiado significativamente, pero hasta ahora seguíamos sin tener un ejemplo de uso con el código fuente incluido más completo que el HolaMundo del proyecto concordion-samples. En [...]]]></description>
			<content:encoded><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml">Hace ya varios meses que estoy involucrado en el proyecto <a href="http://www.concordion.org/" target="_blank">Concordion</a>, un framework para construir y ejecutar pruebas de aceptación. Desde entonces hasta ahora <a href="http://code.google.com/p/concordion/source/browse" target="_blank">el código base</a> no ha cambiado significativamente, pero hasta ahora seguíamos sin tener un ejemplo de uso con el código fuente incluido más completo que el HolaMundo del proyecto <a href="http://code.google.com/p/concordion/source/browse/concordion-samples" target="_blank">concordion-samples</a>. En el artículo de hoy voy a pagar esta deuda.</p>
<p><big>Concordion</big></p>
<p>Las principales características de Concordion son:
<ul> 
<li>Las especificaciones se escriben en <a href="http://www.w3.org/TR/xhtml2" target="_blank">XHTML</a></li>
<p> </ul>
<ul>
<li>libertad absoluta de formato, que favorece escribir las especificaciones orientadas a comprobar los comportamientos en vez de <a target="_blank" href="http://www.concordion.org/ScriptingMakeover.html">orientadas a &#8220;scripts&#8221;</a></li>
<p> 
<li>no es necesario conocimiento técnico para poder escribir las especificaciones</li>
<p> </ul>
<p> 
<li>Las especificaciones se instrumentan para ejecutar código Java sin restricciones, puesto que las <i>fixtures</i> son clases Java que heredan de una extensión de <tt>TestCase</tt> de JUnit (o anotada con <tt>@ConcordionRunner</tt>) y que se vinculan con las especificaciones por convenio (se llama igual que la especificación pero con el sufijo <tt>Test</tt>)</li>
<p> 
<li>No hay ficheros de configuración</li>
<p> 
<li>Está disponible en el Repositorio Central de Maven</li>
<p> 
<dl> 
<dt><b>groupId</b></dt>
<dd>org.concordion</dd>
<p> 
<dt><b>artifactId</b></dt>
<dd>concordion</dd>
<p> 
<dt><b>version</b></dt>
<dd>1.3.0</dd>
<p> </dl>
<p> 
<li>Se ejecuta como cualquier test JUnit</li>
<p> 
<ul> 
<li>el resultado de la ejecución son los mismos XHTML pero iluminando los textos instrumentados con verde si se cumple la condición, rojo si no se cumple o amarillo si se ha producido una excepción</li>
<p> 
<li>también hay un <a href="http://code.google.com/p/maven-concordion/" target="_blank">plugin Maven</a> que produce un resumen del resultado de la ejecución que recorre todos los XHTML resultantes y que mejora el que produce el plugin <a href="http://maven.apache.org/plugins/maven-surefire-plugin/" target="_blank">Surefire </a>para los JUnit</li>
<p> </ul>
<p><big>Proyecto de ejemplo</big></p>
<p><img src="http://lh4.ggpht.com/_QhcG1I9XuzE/SaT9VIm_xPI/AAAAAAAAALU/H2G9iCB5sdk/s144/concordion-run.png" style="max-width: 800px; float: left; margin-top: 10px; margin-bottom: 10px; margin-right: 10px;" /></p>
<p>He creado un proyecto en <a href="http://code.google.com/p/shopaas/" target="_blank">GoogleCode</a> para, entre otras cosas, ir realizando todas estas pruebas. Anteriormente había escrito un <a href="http://jmbeas.blogspot.com/2008/07/spring-jpa-y-dbunit.html">artículo</a> donde se trataba de ilustrar el uso de Spring y de JPA juntos. Ahora he incorporado un ejemplo que ilustra cómo pasar de una historia de usuario sobre el Mantenimiento de un Catálogo de Productos para una tienda. Esto es un poco <a href="http://es.wikipedia.org/wiki/CRUD" target="_blank">CRUD</a>, pero poco a poco iremos viendo cómo incluso en ese escenario podemos <a href="http://dannorth.net/introducing-bdd" target="_blank">orientarnos al comportamiento</a>.</p>
<p><big>¿Cómo descargar y probar este ejemplo?</big></p>
<p>Para descargar este proyecto podéis seguir las <a href="http://code.google.com/p/shopaas/source/checkout" target="_blank">instrucciones</a>:
<pre>svn co http://shopaas.googlecode.com/svn/trunk/shopaas shopaas</pre>
<p>Podéis revisar los siguientes detalles por si queréis cambiarlos.<br />En shopaas/pom.xml</p>
<p>&#8230;y a continuación podéis construirlo usando Maven. Para ello, ejecutad:
<pre>cd shopaasmvn clean install cobertura:cobertura site</pre>
<p>Si todo ha ido bien, podréis comprobar que se ha generado un &#8220;site&#8221; del proyecto en la carpeta target/site.</p>
<p>Desgraciadamente no he conseguido aún que queden correctamente enlazados los módulos, por lo que es necesario ir hasta la carpeta <tt>shopaas/services-acceptance-test/target/site</tt> y abrir el fichero index.html con nuestro navegador favorito para poder ver el resultado de las pruebas de aceptación (incluso el informe de cobertura de las mismas).</p>
<p>Si ejecutáis la construcción del proyecto desde la linea de comandos, es posible también que tengáis un problema de falta de memoria (Error &#8220;Java Heap Space&#8221;), para evitarlo tendréis que ejecutar antes que nada &#8220;set MAVEN_OPTS=-Xmx128m&#8221;. A mi me ha dado este problema cuando lo he probado en Windows XP con un JDK 1.6.0_11, y sospecho que tiene que ver con los valores por defecto que elige la JVM en este entorno. Pero tampoco lo tengo 100% seguro.</p>
<p><big>maven-concordion-plugin</big></p>
<p>No sé si para el momento en el que probéis esto ya estará publicado en el Repositorio Central de Maven el plugin que permite obtener informes resumidos de Concordion. Si no fuera así, también deberéis <a target="_blank" href="http://code.google.com/p/maven-concordion/source/checkout">descargar el código del maven-concordion-plugin</a> y construirlo con <tt>mvn install</tt>.</p>
<p><big>Cobertura</big></p>
<p>El informe de cobertura del código (&#8220;code coverage&#8221;) ha sido algo que me ha costado especialmente puesto que el código a instrumentar no está en el mismo módulo que las pruebas, de modo que he usado una combinación de los plugins maven-antrun-plugin y build-helper-maven-plugin. Como podréis comprobar, así podemos conocer con bastante certeza si hay código que llevamos a producción para el que no tenemos ninguna prueba. Mmmm, sí que es interesante, ¿verdad?</p>
<p><big>Automatización</big></p>
<p>Pero lo más interesante es que está completamente automatizado. También están las pruebas de aceptación de la UI que os mostré en <a href="http://jmbeas.blogspot.com/2009/01/pruebas-funcionales-automatizadas-de.html">un artículo anterior</a>. Por tanto, tenemos pruebas unitarias de los componentes internos, pruebas de aceptación de los servicios de aplicación (escritas en lenguaje de negocio) y pruebas de aceptación de la UI (independientes de la implementación de los servicios de aplicación, o no, esa es nuestra decisión). Con lo que sólo nos queda, en cada &#8220;release&#8221;, darnos un paseo por la aplicación por aquellos puntos críticos o para los que el coste de hacer una prueba automática sea excesivo. Pero el resultado neto es que hemos ganado en confianza y reducido el tiempo que tardamos en entregar un proyecto. En estos tiempos de crisis, eso es importante, ¿verdad?</p>
<p><big>Recursos</big></p>
<p>También hay disponible un <a href="http://www.concordion.org/Tutorial_es.html" target="_blank">tutorial de Concordion</a>. Además, a continuación incluyo una lista de enlaces de interés:
<ul>
<li><a href="http://www.concordion.org/Example.html">Ejemplo</a></li>
<p>
<li><a href="http://www.concordion.org/Technique.html">Técnica</a></li>
<p></ul>
<p><big>Feedback (o reacciones)</big></p>
<p>Por favor, espero que me hagáis llegar vuestros comentarios cuando probéis esto. Me ayudarán mucho a mejorar este ejemplo. No tengo claro cómo organizar el código para que Maven me construya todo como es debido y eso le resta claridad al resultado final, que debería ser que el &#8220;Product Owner&#8221; o los &#8220;expertos del dominio&#8221; pudieran navegar hasta el resultado de las pruebas de aceptación y discutir tanto sobre su definición como sobre el resultado de la ejecución.</p>
<p>También hay dos conjuntos de código diferentes: <b>users</b> y <b>products</b>. El primero corresponde a <a href="http://jmbeas.blogspot.com/2008/07/spring-jpa-y-dbunit.html">aquel ejemplo que hice hace ya unos meses</a> y el segundo es el que he estado trabajando últimamente y que pretendo que me sirva como piedra de toque para ir encontrando patrones o plantillas.</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/02/25/concordion-un-ejemplo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pruebas funcionales automatizadas de una aplicación web</title>
		<link>http://blog.jmbeas.es/2009/01/26/pruebas-funcionales-automatizadas-de-una-aplicacion-web/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pruebas-funcionales-automatizadas-de-una-aplicacion-web</link>
		<comments>http://blog.jmbeas.es/2009/01/26/pruebas-funcionales-automatizadas-de-una-aplicacion-web/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 00:12:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[cargo]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdriver]]></category>
		<category><![CDATA[wicket]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/pruebas-funcionales-automatizadas-de-una-aplicacion-web/</guid>
		<description><![CDATA[Hoy voy a resumir cómo automatizar las pruebas funcionales de una aplicación web utilizando: Maven. Con Maven gestionamos el ciclo de vida de la construcción y las pruebas, así como las dependencias entre artefactos. Cargo. Con este plugin Maven realizamos el despliegue de la aplicación web en el contenedor de nuestra elección. Selenium Webdriver. Con [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>Hoy voy a resumir cómo automatizar las pruebas funcionales de una aplicación web utilizando:
<ul>
<li><a target='_blank' href='http://maven.apache.org'>Maven</a>. Con Maven gestionamos el ciclo de vida de la construcción y las pruebas, así como las dependencias entre artefactos.</li>
<li><a href='http://cargo.codehaus.org/' target='_blank'>Cargo</a>. Con este plugin Maven realizamos el despliegue de la aplicación web en el contenedor de nuestra elección.</li>
<li><a href='http://code.google.com/p/webdriver/' target='_blank'>Selenium Webdriver</a>. Con este framework y el correspondiente plugin Maven ejecutamos las pruebas funcionales.</li>
<li><a href='http://jetty.morbay.org' target='_blank'>Jetty</a>. Éste es el contenedor web de mi elección. (Podría haber sido Tomcat, Glassfish o cualquier otro).</li>
<li><a href='http://www.junit.org' target='_blank'>JUnit</a>. Como framework de pruebas.</li>
<li><a href='http://wicket.apache.org/' target='_blank'>Wicket</a>. Éste es el framework web de mi elección.</li>
</ul>
<p>Todo el código fuente lo tenéis disponible en <a href='http://code.google.com/p/shopaas/source/browse/' target='_blank'>GoogleCode</a>.</p>
<p><big>Pruebas unitarias</big></p>
<p>En <a href='http://www.eclipse.org' target='_blank'>Eclipse</a> y con <a href='http://jmbeas.wikidot.com/m2eclipse' target='_blank'>m2eclipse</a> he creado el proyecto raíz con dos módulos: web (de tipo war) y web-integration-test (de tipo pom). El proyecto web lo he creado con el arquetipo &#8220;org.apache.wicket:wicket-archetype-quickstart:1.4-rc1&#8243; y luego lo he tocado un poco.</p>
<pre class='xml' name='code'>< ?xml version="1.0" encoding="UTF-8"?>
<project> 
<parent>  <artifactid>shopaas</artifactid>  <groupid>shopaas</groupid>  <version>0.0.1-SNAPSHOT</version> </parent> <modelversion>4.0.0</modelversion> <groupid>shopaas</groupid> <artifactid>web</artifactid> 
<packaging>war</packaging> <name>Web Application</name> <version>0.0.1-SNAPSHOT</version> <description>UI wicket para Shop As A Service</description> <build>  <finalname>shopaas-web</finalname>  <resources>   <resource>    <directory>src/main/resources</directory>   </resource>   <resource>    <directory>src/main/java</directory>    <includes>     <include>**</include>    </includes>    <excludes>     <exclude>**/*.java</exclude>    </excludes>   </resource>  </resources>  <testresources>   <testresource>    <directory>src/test/java</directory>    <includes>     <include>**</include>    </includes>    <excludes>     <exclude>**/*.java</exclude>    </excludes>   </testresource>  </testresources> 
<plugins> 
<plugin>    <artifactid>maven-compiler-plugin</artifactid>    <inherited>true</inherited>    <configuration>     <source>1.5</source>     <target>1.5</target>     <optimise>true</optimise>     <debug>true</debug>    </configuration>   </plugin> 
<plugin>    <groupid>org.mortbay.jetty</groupid>    <artifactid>maven-jetty-plugin</artifactid>    <configuration>     <scanintervalseconds>10</scanintervalseconds>     <connectors>      <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> 
<port>8080</port>       <maxidletime>60000</maxidletime>      </connector>     </connectors>    </configuration>   </plugin> 
<plugin>    <artifactid>maven-eclipse-plugin</artifactid>    <configuration>     <downloadsources>true</downloadsources>    </configuration>   </plugin>  </plugins> </build> <dependencies>  <dependency>   <groupid>org.apache.wicket</groupid>   <artifactid>wicket</artifactid>   <version>${wicket.version}</version>  </dependency>  <dependency>   <groupid>org.slf4j</groupid>   <artifactid>slf4j-log4j12</artifactid>   <version>1.4.2</version>  </dependency>  <dependency>   <groupid>log4j</groupid>   <artifactid>log4j</artifactid>   <version>1.2.14</version>  </dependency>  <dependency>   <groupid>junit</groupid>   <artifactid>junit</artifactid>   <version>4.5</version>   <scope>test</scope>  </dependency>  <dependency>   <groupid>org.mortbay.jetty</groupid>   <artifactid>jetty</artifactid>   <version>${jetty.version}</version>   <scope>provided</scope>  </dependency>  <dependency>   <groupid>org.mortbay.jetty</groupid>   <artifactid>jetty-util</artifactid>   <version>${jetty.version}</version>   <scope>provided</scope>  </dependency>  <dependency>   <groupid>org.mortbay.jetty</groupid>   <artifactid>jetty-management</artifactid>   <version>${jetty.version}</version>   <scope>provided</scope>  </dependency> </dependencies> 
<properties>  <jetty .version>6.1.14</jetty>  <wicket .version>1.4-rc1</wicket> </properties></project></pre>
<p>No quiero entrar en detalles sobre <a target="_blank" href="http://www.ibm.com/developerworks/web/library/wa-aj-wicket/index.html?ca=dgr-jw22wa-aj-wicket&#038;S_TACT=105AGX59&#038;S_CMP=GRsitejw22">cómo es una aplicación Wicket</a>, pero sí explicaré los dos detalles más importantes:</p>
<p>Si quiero desplegar la aplicación en Jetty no tengo más que ejecutar Maven con el &#8220;goal&#8221; jetty:run, pero esto sólo nos sirve para probar manualmente nuestra aplicación. (Por cierto, el puerto 8080 es el puerto por defecto, pero me gusta explicitar esta configuración).</p>
<p>Wicket proporciona la clase <a target="_blank" href="http://cwiki.apache.org/WICKET/testing-pages.html">WicketTester</a>, que permite probar la aplicación fuera del contenedor, mediante una simulación del mismo. De esta manera podemos hacer pruebas unitarias de todos los componentes de nuestra GUI sin necesidad de empaquetarla y desplegarla. Más adelante, en futuros artículos, tengo previsto entrar en detalle en cómo desarrollar la GUI con Wicket haciendo <a target="_blank" href="http://es.wikipedia.org/wiki/Tdd">TDD</a>.</p>
<pre name='code' class='java'>package shopaas;

import junit.framework.TestCase;import org.apache.wicket.util.tester.WicketTester;

/** * Simple test using the WicketTester */public class TestHomePage extends TestCase{ private WicketTester tester;

 <a href="http://twitter.com/Override" class="twitter-user-link" title="Override profile on Twitter" target="_blank">@Override</a> public void setUp() {  tester = new WicketTester(new WicketApplication()); }

 public void testRenderMyPage() {  //start and render the test page  tester.startPage(HomePage.class);

  //assert rendered page class  tester.assertRenderedPage(HomePage.class);

  //assert rendered label component  tester.assertLabel("message", "If you see this message wicket is properly configured and running"); }}
</pre>
<p>Esta prueba es muy simple, pero lo suficiente como para ver &#8220;por dónde van los tiros&#8221;. Como podéis comprobar, llegados a este punto podemos tener las pruebas unitarias de nuestra aplicación web completamente automatizadas y, por tanto, incluidas en nuestro sistema de integración continua sin mayor problema.</p>
<p><big>Pruebas funcionales</big></p>
<p>Pruebas funcionales o de integración son términos muy usados pero no tengo claro que todo el mundo entienda lo mismo cuando los usa. Lo que yo estoy llamando aquí pruebas funcionales o de integración son aquellas en las que pruebo el sistema desplegado (hasta donde se puede razonablemente). Pues bien, lo que voy a enseñar ahora es cómo desplegar de manera automática el war de nuestra aplicación y lanzar (automáticamente también) las pruebas.</p>
<p>Para esto he usado Cargo y he modificado el ciclo de vida de varios plugins (compiler, surefire y el propio cargo) para que se ejecuten en el orden adecuado. Además, he usado <a href="http://code.google.com/p/webdriver/wiki/UsingWebDriver" target="_blank">Selenium Webdriver</a> para escribir y ejecutar las pruebas.</p>
<p>Al ejecutar (desde el proyecto raiz) Maven con el goal &#8220;integration-test&#8221;, el propio Maven estudia las dependencias entre artefactos y empaqueta el war (y ejecuta sus pruebas) antes de pasar a desplegar ese war en un Jetty 6 que se arranca y detiene solamente para ejecutar las pruebas de integración.</p>
<pre name='code' class='xml'>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

 <modelversion>4.0.0</modelversion> 
<parent>  <groupid>shopaas</groupid>  <artifactid>shopaas</artifactid>  <version>0.0.1-SNAPSHOT</version> </parent> <artifactid>web-integration-test</artifactid> 
<packaging>pom</packaging> <name>Functional Tests</name> <dependencies>  <dependency>   <groupid>shopaas</groupid>   <artifactid>web</artifactid>   <version>0.0.1-SNAPSHOT</version>   <type>war</type>  </dependency>  <dependency>   <groupid>junit</groupid>   <artifactid>junit</artifactid>   <version>4.5</version>   <scope>test</scope>  </dependency>  <!-- SELENIUM WEBDRIVER -->  <dependency>   <groupid>org.openqa.selenium.webdriver</groupid>   <artifactid>webdriver-htmlunit</artifactid>   <version>0.6.685</version>  </dependency>  <dependency>   <groupid>org.openqa.selenium.webdriver</groupid>   <artifactid>webdriver-support</artifactid>   <version>0.6.685</version>  </dependency>  <!--  JETTY DEPENDENCIES FOR TESTING  -->  <dependency>   <groupid>org.mortbay.jetty</groupid>   <artifactid>jetty</artifactid>   <version>${jetty.version}</version>   <scope>provided</scope>  </dependency>  <dependency>   <groupid>org.mortbay.jetty</groupid>   <artifactid>jetty-util</artifactid>   <version>${jetty.version}</version>   <scope>provided</scope>  </dependency>  <dependency>   <groupid>org.mortbay.jetty</groupid>   <artifactid>jetty-management</artifactid>   <version>${jetty.version}</version>   <scope>provided</scope>  </dependency> </dependencies> <build>  <!--   We need to force the compiler plugin to compile tests and the   surefire plugin to execute them because we're using a pom packaging   that doesn't have those mapped in its lifecycle.  --> 
<plugins> 
<plugin>    <groupid>org.apache.maven.plugins</groupid>    <artifactid>maven-compiler-plugin</artifactid>    <configuration>     <source>1.5</source>     <target>1.5</target>     <optimise>true</optimise>     <debug>true</debug>    </configuration>    <executions>     <execution>      <goals>       <goal>testCompile</goal>      </goals>     </execution>    </executions>   </plugin> 
<plugin>    <groupid>org.apache.maven.plugins</groupid>    <artifactid>maven-surefire-plugin</artifactid>    <executions>     <execution> 
<phase>integration-test</phase>      <goals>       <goal>test</goal>      </goals>     </execution>    </executions>   </plugin> 
<plugin>    <groupid>org.codehaus.cargo</groupid>    <artifactid>cargo-maven2-plugin</artifactid>    <configuration>     <wait>false</wait>     </configuration><configuration>      <deployables>       <deployable>        <groupid>shopaas</groupid>        <artifactid>web</artifactid>        <type>war</type> 
<properties>         <context>/</context>        </properties>       </deployable>      </deployables>     </configuration>

    <executions>     <execution>      <id>start</id> 
<phase>pre-integration-test</phase>      <goals>       <goal>start</goal>      </goals>     </execution>     <execution>      <id>stop</id> 
<phase>post-integration-test</phase>      <goals>       <goal>stop</goal>      </goals>     </execution>    </executions>   </plugin>  </plugins> </build> 
<profiles> 
<profile>   <id>jetty6x</id>   <activation>    <activebydefault>true</activebydefault>   </activation> 
<properties>    <jetty .version>6.1.14</jetty>   </properties>   <build> 
<plugins> 
<plugin>      <groupid>org.codehaus.cargo</groupid>      <artifactid>cargo-maven2-plugin</artifactid>      <configuration>       <container>        <containerid>jetty6x</containerid>        <type>embedded</type>       </container>       </configuration><configuration> 
<properties>         <cargo .servlet.port>8080</cargo>         <cargo .logging>medium</cargo>        </properties>       </configuration>
</plugin>    </plugins>   </build>  </profile> </profiles>
</pre>
<p>El único test que he incluido como prueba de concepto contiene dos tipos de prueba (una con <a href="http://code.google.com/p/webdriver/wiki/GettingStarted" target="_blank">Webdriver</a> y otra sin él, la anotada con @Ignore).</p>
<pre name='code' class='java'>package shopaas.web.integration.test;

import static org.junit.Assert.assertEquals;

import java.net.HttpURLConnection;import java.net.URL;

import org.junit.Before;import org.junit.Ignore;import org.junit.Test;import org.openqa.selenium.WebDriver;import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class WebappTest {

 <a href="http://twitter.com/Ignore" class="twitter-user-link" title="Ignore profile on Twitter" target="_blank">@Ignore</a> <a href="http://twitter.com/Test" class="twitter-user-link" title="Test profile on Twitter" target="_blank">@Test</a> public void testCallIndexPage() throws Exception {  URL url = new URL("http://localhost:8080/");  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.connect();  assertEquals(200, connection.getResponseCode()); }

 private WebDriver driver;

 <a href="http://twitter.com/Before" class="twitter-user-link" title="Before profile on Twitter" target="_blank">@Before</a> public void setUp() {  driver = new HtmlUnitDriver(); }

 <a href="http://twitter.com/Test" class="twitter-user-link" title="Test profile on Twitter" target="_blank">@Test</a> public void testHomepage() {  driver.get("http://localhost:8080/");  assertEquals("Wicket Quickstart Archetype Homepage", driver.getTitle()); }

}
</pre>
<p>He utilizado el <a href="http://code.google.com/p/webdriver/wiki/HtmlUnitDriver" target="_blank">HtmlUnitDriver</a> que, aunque también es una emulación de una navegador, para mi es suficiente, no me complica mi entorno y además es más rápido. Pero si quisiera utilizar Firefox, Safari o Internet Explorer, no tendría más que cambiar el driver correspondiente. Lógicamente, podemos tener la misma prueba con un driver diferente y estaremos asegurando que nuestra aplicación funciona para varios navegadores. Mmmmm, veo que he captado vuestra atención&#8230; <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><big>Problemas encontrados</big></p>
<p>Al poner todo esto en pie he estado bastante tiempo atascado porque cada vez que ejecutaba las pruebas de integración obtenía un mensaje de error en Jetty diciendo que no era capaz de arrancar la aplicación porque &#8220;No suitable Log constructor&#8221;. No entiendo de dónde sale el dichoso commons-logging, pero el caso es que <a href="http://www.nabble.com/cargo-maven2-plugin-causing-exceptions-during-build-because-of-commons-logging-td19197018.html#a19197018" target="_blank">poniendo el fichero commons-logging.properties en el classpath</a> de la aplicación web (para que se empaquete en el war), todo pasó a funcionar perfectamente.</p>
<pre name='code' class='js'>org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
</pre>
<p>El otro inconveniente que tuve es más un detalle al que prestar atención que otra cosa. Se trata del valor del contexto que hay que poner en la configuración de Cargo, que debe coincidir con el valor usado en el URL de la aplicación en nuestras pruebas y en el fichero web.xml de la aplicación web.</p>
<pre name='code' class='xml'> 
<plugin>    <groupid>org.codehaus.cargo</groupid>    <artifactid>cargo-maven2-plugin</artifactid>    <configuration>     <wait>false</wait>     </configuration><configuration>      <deployables>       <deployable>        <groupid>shopaas</groupid>        <artifactid>web</artifactid>        <type>war</type> 
<properties>         <context>/</context>        </properties>       </deployable>      </deployables>     </configuration>

    <executions>                                ...    </executions>   </plugin></pre>
<p>Bien, creo que esto es todo. Si tenéis interés y el código de ejemplo no es suficiente, no dudéis en preguntarme y trataré de ayudaros.</p></div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2009/01/26/pruebas-funcionales-automatizadas-de-una-aplicacion-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introducción a m2eclipse</title>
		<link>http://blog.jmbeas.es/2008/12/04/introduccion-a-m2eclipse/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introduccion-a-m2eclipse</link>
		<comments>http://blog.jmbeas.es/2008/12/04/introduccion-a-m2eclipse/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 22:06:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[inglés]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/introduccion-a-m2eclipse/</guid>
		<description><![CDATA[Por fin he conseguido terminar la traducción del artículo &#8220;Introduction to m2eclipse&#8221; que comenté hace unas semanas. Espero que os sea de ayuda. Me gustaría también complementarlo con otro material en español que he encontrado en la red: Preparando Eclipse para Maven con m2eclipse Configurar Eclipse para trabajar con Maven Para los que queráis ahondar [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>Por fin he conseguido terminar la <a href='http://jmbeas.wikidot.com/m2eclipse'>traducción</a> del artículo <a href='http://www.theserverside.com/tt/articles/article.tss?l=Introductiontom2eclipse'>&#8220;Introduction to m2eclipse&#8221;</a> que comenté hace unas semanas. Espero que os sea de ayuda. Me gustaría también complementarlo con otro material en español que he encontrado en la red:
<ul>
<li><a href='http://www.softwarepills.com/?p=81'>Preparando Eclipse para Maven con m2eclipse</a></li>
<p>
<li><a href='http://www.latascadexela.es/2008/09/configurar-eclipse-para-trabajar-con.html'>Configurar Eclipse para trabajar con Maven</a></li>
<p></ul>
<p>Para los que queráis ahondar en el tema (en inglés) os recomiendo el <a href='http://docs.codehaus.org/display/M2ECLIPSE/Home'>wiki</a> del proyecto m2eclipse.</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2008/12/04/introduccion-a-m2eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Maven + Eclipse = m2eclipse?</title>
		<link>http://blog.jmbeas.es/2008/11/20/%c2%bfmaven-eclipse-m2eclipse/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25c2%25bfmaven-eclipse-m2eclipse</link>
		<comments>http://blog.jmbeas.es/2008/11/20/%c2%bfmaven-eclipse-m2eclipse/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 01:45:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[inglés]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/%c2%bfmaven-eclipse-m2eclipse/</guid>
		<description><![CDATA[Bueno, parece que últimamente me estoy especializando en traducciones del inglés al español porque estoy traduciendo (con permiso de los autores) un artículo sobre el plugin m2eclipse que apareció este verano en TheServerSide. Espero que nadie que sea experto en traducciones lea las mías porque podrá sacarme los colores fácilmente. Por cierto, el artículo lo [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>Bueno, parece que últimamente me estoy especializando en traducciones del inglés al español porque estoy traduciendo (con permiso de los autores) un <a href='http://www.theserverside.com/tt/articles/article.tss?l=Introductiontom2eclipse'>artículo </a>sobre el plugin <a href='http://m2eclipse.codehaus.org/'>m2eclipse </a>que apareció este verano en TheServerSide. Espero que nadie que sea experto en traducciones lea las mías porque podrá sacarme los colores fácilmente.</p>
<p>Por cierto, el artículo lo estoy traduciendo a ratitos y surgió como consecuencia de una <a href='http://groups.google.es/group/ecosistemas-software/browse_thread/thread/6a8f65c07edd51d4/c5f318de1e4cc38d?#c5f318de1e4cc38d'>pregunta </a>que hice en la lista &#8220;ecosistemas-software&#8221; (que aprovecho para recomendar) en la que encuestaba sobre las alternativas para usar <a href='http://maven.apache.org'>Maven </a>en <a href='http://www.eclipse.org'>Eclipse</a>: <a href='http://m2eclipse.codehaus.org/'>m2eclipse </a>y <a href='http://code.google.com/p/q4e/'>Q4E</a>.</p>
<p>Cuando tenga terminada toda la <a href='http://jmbeas.wikidot.com/m2eclipse'>traducción </a>os lo haré saber.</p>
<p><b>Editado:</b><br />He cambiado la dirección donde he publicado la traducción. Espero que si hay errores en la traducción me lo hagáis saber para corregirlos, gracias.</p>
</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2008/11/20/%c2%bfmaven-eclipse-m2eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Coverage en Eclipse</title>
		<link>http://blog.jmbeas.es/2008/08/08/code-coverage-en-eclipse/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=code-coverage-en-eclipse</link>
		<comments>http://blog.jmbeas.es/2008/08/08/code-coverage-en-eclipse/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 21:15:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[code coverage]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/code-coverage-en-eclipse/</guid>
		<description><![CDATA[Aunque se supone que estoy de vacaciones&#8230; no he podido resistir el hacer un ejercicio (que publicaré en breve en este blog) sobre Refactoring. Pero quería ver cómo de buenos eran mis tests y, la verdad, no me siento cómodo con el plugin de Cobertura para Maven: quería algo más integrado con Eclipse. Para ello [...]]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>Aunque se supone que estoy de vacaciones&#8230; no he podido resistir el hacer un ejercicio (que publicaré en breve en este blog) sobre <a href='http://www.refactoring.com/'>Refactoring</a>. Pero quería ver cómo de buenos eran mis tests y, la verdad, no me siento cómodo con el <a href='http://mojo.codehaus.org/cobertura-maven-plugin/'>plugin de Cobertura para Maven</a>: quería algo más integrado con Eclipse. Para ello he estado mirando los proyectos <a href='http://www.eclipse.org/tptp/'>TPTP</a> de Eclipse y <a href='http://www.eclemma.org'>EclEmma</a>. Ambos están basados en <a href='http://emma.sourceforge.net/'>Emma</a>.</p>
<p>Después de buscar y buscar cómo instalar el <a href='http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.tptp.platform.doc.user/tasks/tevwcode.htm'>módulo de code coverage de TPTP</a> me he encontrado con que <a href='http://dev.eclipse.org/newslists/news.eclipse.tptp/msg06376.html'>han abandonado el desarrollo</a> para usar justamente EclEmma. Bueno, eso me ha simplificado el trabajo. <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Así pues, después de instalar EclEmma, probar la <a href='http://en.wikipedia.org/wiki/Code_coverage'>cobertura</a> de mis tests JUnit ha sido muy fácil. Simplemente he seguido las <a href='http://www.eclemma.org/userdoc/launching.html'>instrucciones</a>. (Ejem, he de reconocer que las seguí <strong>después</strong> de ver que me estaba calculando la cobertura ¡¡de los propios tests!!) </p>
<p><img height='363' width='466' style='max-width: 800px;' src='http://www.eclemma.org/userdoc/images/launchdialog.png'/></p>
<p>Para que no incluya nuestros tests en el informe de cobertura hay que:
<ul>
<li>pulsar en el menú &#8220;Run / Coverage&#8221;, </li>
<li>seleccionar la configuración de nuestro test, </li>
<li>pulsar en la pestaña &#8220;Coverage&#8221; </li>
<li>y desmarcar la carpeta correspondiente (en mi caso src/test/java porque uso Maven)</li>
</ul>
<p>Como suponía, mi cobertura era del 100%. <img src='http://blog.jmbeas.es/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><img height='269' width='465' style='max-width: 800px;' src='http://www.geocities.com/jm_beas/images-blog/pantallazo-eclemma.png'/></p>
<p>De todos modos, no tener un plugin <a href='http://jira.codehaus.org/browse/MOJO-762?focusedCommentId=141338#action_141338'>estable</a> de <a href='http://mojo.codehaus.org/emma-maven-plugin/'>Emma para Maven2</a> hace difícil el incorporarlo al proceso de integración continua (puesto que yo he optado por tenerlo todo con Maven2 y no usar Ant ni otros procesos añadidos). En cualquier caso, en cuanto pueda lo probaré a ver qué tal&#8230;</p>
<p>P.S.<br />Si alguien tiene interés, incluyo el enlace a una <a href='http://www.eclipsecon.org/2008/sub/attachments/Code_Coverage_Analysis_for_Eclipse.pdf'>presentación</a> sobre EclEmma de la EclipseCon 2008 que puede aclarar cómo funciona por dentro (incluidas referencias a OSGi).</div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2008/08/08/code-coverage-en-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ejemplo con Concordion</title>
		<link>http://blog.jmbeas.es/2008/04/30/ejemplo-con-concordion/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ejemplo-con-concordion</link>
		<comments>http://blog.jmbeas.es/2008/04/30/ejemplo-con-concordion/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 23:24:00 +0000</pubDate>
		<dc:creator>jmbeas</dc:creator>
				<category><![CDATA[Del viejo blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[concordion]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://jmbeas.iexpertos.com/ejemplo-con-concordion/</guid>
		<description><![CDATA[Por fin he conseguido sacar un rato para explicar cómo lanzar las pruebas de aceptación con el flamante Concordion mavenizado. http://jmbeas.blogspot.com]]></description>
			<content:encoded><![CDATA[<div xmlns='http://www.w3.org/1999/xhtml'>Por fin he conseguido sacar un rato para explicar <a href='http://code.google.com/p/concordion/wiki/MavenizedSamples'>cómo lanzar las pruebas de aceptación</a> con el <a href='http://www.mvnrepository.com/artifact/org.concordion/concordion'>flamante Concordion mavenizado</a>.<br/></div>
<div class="blogger-post-footer">http://jmbeas.blogspot.com</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.jmbeas.es/2008/04/30/ejemplo-con-concordion/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

