Herramientas útiles para migraciones

Desde hace un buen tiempo, estoy participando en un proyecto de migración de una KB grande desde GeneXus Evo3 a GeneXus 16 Upgrade4.

En el proceso, hemos tenido que asegurarnos que la ejecución del sistema nuevo, es compatible con el sistema anterior.

Como es un sistema bastante grande, hemos tratado de automatizar lo que podemos para hacer el chequeo mas eficiente y encontrar mas rapido las diferencias.

Algunas de las cosas que comparamos son:
* WSDL de los servicios SOAP del sistema
* Respuesta de los servicios SOAP (cuando lo llamamos con parámetros)
* Respuesta de los servicios REST
* Salida de los procesos batch
* Ejecución de pantallas WEB

Para lograrlo, hemos estado utilizando algunas herramientas que pienso que pueden ser de utilidad a otros en proyectos parecidos.

Estas herramientas son las que usamos para

SoapUI. 

Permite probar en forma fácil servicios SOAP (y también REST) pero en principio lo usamos mas para el SOAP.
Como lo usamos?.
Dado el WSDL del servicio que queremos probar, genera un REQUEST poniendo ? donde deben ir los valores de los parámetros.  Poniendole los parámetros correspondientes, podemos ejecutar el mismo request a la aplicación vieja y la nueva y visualmente ver si los resultados son los mismos.
Como hacer esto en forma visual es bastante complejo, generalmente lo que hacemos es salvar el request para ejecutarlo desde un script y comparar las salidas.


cURL. 

Permite ejecutar request de varios tipos y protocolos desde linea de comandos.

Por ejemplo si hacemos:

Request para ver el http_code de la llamada (deberian ser todos 200)
curl -o /dev/null -s  --insecure --user %user%  https://server/dirVirtual/programa -w "%%{http_code} - https://%endpoint%\n" 

Generar el WSDL en un archivo
curl -s --insecure --user %user%  https://server/dv/programa?wsdl >  programa.wsdl

Request para ejecutar el SOAP con parametros
curl -s --insecure --user %user% --header "Content-Type: text/xml;charset=UTF-8" --header "SOAPAction: %soapaction%" --data @%filename% --output %outputfile% https://server/dv/programa

Las variables tienen la forma:
set user="DOMINIO\usuario:contraseña"
soapaction se puede sacar del WSDL del servicio
filename es el request generado con SoapUI
outputfile es el archivo donde quiero la respuesta

Esto puede parametrizarse bastante mas para que el servidor, el programa y el directorio virtual sean variables.


FnR - Find and Replace

Es un utilitario que permite de forma bastante fácil, reemplazar texto o expresiones regulares en archivos para que las comparaciones entre ellos no den diferencias innecesarias.
Por ejemplo, podemos hacer:

fnr.exe --cl --dir . --fileMask "*.wsdl" --useRegEx --find "<soap:address.*/>"  --replace ""

para remplazar en todos los WSDL el tag soap:address que tiene la dirección desde donde ejecuto, que va a ser diferente si son sistemas o servidores diferentes los que estoy comparando.

Por ejemplo, desde Evo3 a GX16, GeneXus genera diferente la sección de documentation (antes se llamaba document) en los WSDL y por lo tanto también conviene evitarla.

WinMerge

Es un comparador de archivos de texto o de directorios enteros.
Permite detectar diferencias entre archivos de forma bastante fácil. Se le puede decir que no tome en cuenta blancos y tabs, y finales de linea.
No es tan sofisticado como el Beyond Compare, pero es open sources y gratuito y funciona muy bien.


GxTest

Para probar que las pantallas WEB hacen lo mismo en la versión en producción y la nueva versión, tenemos varios casos automatizados con GXTest.
Esta es la unica de esta lista que no es open source ni gratuita, pero ayuda muchisimo a probar que el sistema sigue teniendo un comportamiento similar.

Comparador de XML

Es útil contar con alguna herramienta que logre comparar 2 XML y diga si son "similares".  No es solo una comparación de textos, pues con los namespaces la comparación puede ser bastante complicada. Probé varios pero ninguno me sirvio demasiado. Hice un pequeño utilitario en GeneXus que lo que hace es pasar solo la estructura de un XML a un formato de texto que hace mas fácil la comparación de la salida de programas REST y SOAP, sobre todo cuando hay SDT. La forma de serializar los SDT cambio bastante entre versiones de GeneXus y no es trivial compararlos.

Recibe el nombre de un archivo xml y la salida standard es un archivo de texto con el nombre y namespace de los elementos del mismo.


&XmlReader.Open(&Filename)

Do while not &XmlReader.EOF
&XmlReader.Read()
&string = format("%1 %2 %3",&XmlReader.Name,&XmlReader.NameSpaceURI,&XmlReader.NodeType, &XmlReader.ElementType)  
msg(&string,status)

//Leo los atributos del XML
for &i = 1 to &XmlReader.AttributeCount
   &attName=&XmlReader.GetAttributeName(&i)
   &string = format("   %1=%3  ",&AttName, &XmlReader.GetAttEntityValueByIndex(&i),&XmlReader.GetAttributeByIndex(&i))
    msg(&string,status)
endfor
enddo

Probe el CompareXML, diffXML y no me sirvieron . 
Me quedo pendiente revisar JUnit con esto (lo voy a hacer cuando tenga tiempo)

KBDoctor

Utilizo el KBDoctor para generar archivos de texto de las navegaciones de todos los objetos del sistema, y luego las comparo con el WinMerge.
De esta forma es fácil detectar objetos que cambian en su navegación.

FileSeek

Es un utilitario que permite buscar texto en un archivo o en directorios.
Esta bueno pues permite hacer operaciones con los archivos que cumplan con la búsqueda. Por ejemplo, permite copiar o borrar todos los archivos que contengan algún texto.




Que estaría faltando: 
  • Seria bueno contar con un comparador de xml, que tome 2 xml y muestre en que lineas tiene diferencias. 
  • Seria bueno tener un comparador de base de datos, que permita comparar el contenido de 2 la salida de la ejecucion de una base de datos, con una sentencia SQL. 
  • Contar algo mas de pruebas de performance. 

Conclusiones
Estas herramientas pueden ser usadas, para automatizar algunas tareas de ejecución y comparación de resultados, y se puede tener mas tranquilidad que el sistema se va a comportar como lo venia haciendo.

Comentarios

  1. Muy bueno!! Tenesos que actualizar nuestra kb dotor para gx16. Estamos migrando las kb gxx 3 a gx16 y hemos tenido que reprogramarecurrir muchisimo

    ResponderBorrar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

Aplicación monolítica o distribuida?

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.