Spring, DbUnit, Xml y otras hierbas


Hace algún tiempo trabajé en un proyecto grande como consultor, en ese proyecto se tenia una instancia de la bd -compartida por todos los equipos de desarrollo- para realizar las pruebas -tanto unitarias como de integración- generalmente se presentaban problemas porque el estado de la bd no era conocido al iniciar las pruebas y termino siendo un desastre ya que muchos de los equipos de desarrollo terminaron omitiendo las pruebas y lanzándose a la guerra de codificación con las conocidas consecuencias a la hora de entregar.

Luego trabajando en CakePHP aprendi que el framework permite crear fixtures de los modelos (CakePHP implementa el patrón ActiveRecord) para acceso a datos de prueba y dentro de ellos es posible definir un arreglo de arreglos con los datos que son insertados en una copia de la base de datos que es creada y los datos son insertados en la tabla correspondiente al modelo.

Ahora bien, en Java es recomendable usar DbUnit para insertar registros para pruebas y mediante una sencillisima integración con Spring framework aprovechar las anotaciones y los interceptores para lograr pruebas con bases de datos inciializadas a un estado conocido. En el blog Zenika se encuentran dos (1, 2) post al respecto con toda la información necesaria para aprender a hacer dicha integración.

Bueno, yo he adaptado un poco los ejemplos pero los conceptos son los mismos, sin embargo para obtener los datos en el formato mas simple de los que acepta DbUnit (XML plano) descargue desde Google Fusion Tables (conjuntos de datos publicos agrupables, presentables como graficas y descargables como csv, mugre google esta en todo), los converti en XML y finalmente mediante XSLT los transforme en el formato DbUnit.

Para pasar de CSV a XML use csv2xml, la instalación en Ubuntu es sencilla y esta muy bien descrita en la ayuda en linea de Ubuntu. Esta herramienta nos da como resultado un XML que no esta bien formado con la siguiente estructura:

<row>
 <nombre_columna_1>valor1</nombre_columna_1>
  <nombre_columna_2>valor2</nombre_columna_2>
</row>
<row>
 <nombre_columna_1>valor3</nombre_columna_1>
  <nombre_columna_2>valor4</nombre_columna_2>
</row>

Para hacer la transformación solo agrego un tag inicial y mediante XML Copy Editor (excelente herramienta open source para manejo de XML disponible para Linux/Win2) y la transformo mediante la siguiente XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:template match="*">
<xsl:copy>
<xsl:for-each select="@*|*[not(* or @*)]">
<xsl:attribute name="{name(.)}"><xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
<xsl:apply-templates select="*[* or @*]|text()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

La cual transforma los elementos en atributos para obtener finalmente un archivo de este tipo:

<dataset>
 <row nombre_columna_1="valor1" nombre_columna_2="valor2"/>
 <row nombre_columna_1="valor3" nombre_columna_2="valor4"/>
</dataset>

row es interpretado como el nombre de la tabla, así que es buena idea reemplazarla por nuestro nombre de tabla (o modificar la XSLT), los nombres de columnas corresponden a la primera fila en el archivo CSV, así que es buena idea asegurarse de que coincidan con los nombres de columnas en la tabla.

Acerca de Nickman

Aunque crítico e Ingeniero (especializado en software), piloto de aeroplano soy (seré).

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s