miércoles, diciembre 19, 2007

Unit Test para renderizadores de HTML

Actualmente estamos en la etapa de diseño y desarrollo de una nueva release del proyecto en el que vengo trabajando hace 4 años (uhhh, como pasa el tiempo)... si bien la release no es algo tan complicada, nos tomamos el tiempo para mejorar el componente de Vista, y cuando digo vista estoy hablando principalmente de la renderización a html. La metáfora que tenemos es que al componente de Vista solo llega un ViewBean que es la representación de la pantalla en objetos, y este componente debe a través de renderers asociados a cada elemento del ViewBean generar el HTML. Con lo cual apuntamos a que la generación de la vista sea creando objetos estándares y no tocar absolutamente nada de HTML o el lenguaje que general el html como Velocity o JSP. Pero para esto necesitamos crear buenas abstracciones de UI, y va a ser un proceso muy iterativo, dudo que pueda ser para esta release, todavía necesitamos mucha interacción con la persona que define las pantallas para que trate primero de tener una consistencia funcional. De todas maneras, exista o no una consistencia funcional, la idea de tener objetos/componentes abstracto que permitan reutilizar los renderers sigue siendo interesante.
En fin, me estoy perdiendo el foco, del post, una de las cosas que estoy tratando de hacer es crear un framework de Unit Test, para que todos los desarrolladores de renderers pueden Uni Testear los renderizadores sin necesidad de ver el resultado en el browser, con lo cual mi idea es poder, para cada test case hacer algo como:
1- Crear el ViewBean con la información que del escenario que quiero testear
2- Ejecutar el Renderizador que devuelve el HTML
3- Realizar los asserts, queriando el HTML para ver si la información se reemplazó correctamente, ver si hizo los cantidad de Loops correctos, si pasó por los caminos que yo especifiqué , etc, etc, etc. No me interesa saber si el html tiene todos los temas de estetica ya que eso lo va a tocar una persona a fin.

El problema que tengo hoy en día es que no encuentro un framework/componente que me permita llegar al paso tres, ya que al HTML llego sin problema, lo que necesito ahora es buscar una forma de inspeccionar el HTML en texto que tengo y poder consultarlo para hacer los assert correspondientes. Se me ocurrieron tres ideas :
  • Usar HtmlUnit. Pareciera la solución más obvia, pero investigando un poco el framework me di cuenta que no es tán feliz como yo pensaba. Si o si para consultar un HTML tenes que hacer un pedido por la red y http, cosa bastante poco práctica. Obviamente esto se puede evitar mockeando el conector y devolviendo siempre un HTML fijo. El problema es que estos componentes que yo quiero unitestear solo me devuelven una porción de HTML y no un HTML bien formado con el head y el body, con lo cual es imposible llegar a tener una representación objetosa del HTML que me permita consultarlo. Lo que me gustó de HTMLUnit es que tiene la representación objetosa de los elementos del HTML. Obviamente estuve muy poco tiempo viendo el framework y quizá se pueda, pero en fin... me hizo sentir un poco infeliz el HtmlUnit, aparte de haber muy poca documentación.
  • Usar Expresiones Regulares, en principio me pareció que era una idea copada, pero despues pensé en el resto, si a la gente ya le cuesta hacer un Test Case de codigo de Modelo o Controller, o sea Java puro, también le pido que haga un Test Unitario para los renderizadores, sumado a esto, aprender expresiones regulares que entiendan el HTML para verificarlo, me recibo de necio. Digamos que las Expresiones Regulares son algo duras de entender, incluso las que creó uno mismo... con lo cual solución descartada...
  • La ultima, que es la que voy a probar es usar XPath, ya que en teoría cada HTML renderizado por cada renderer debería ser un XML bien formado, con lo cual eso me permitiría hacer queries con XPath y tener assert mucho más sencillos. Obviamente la gente que haga estos test cases tiene que aprender Xpath, lo cual no es algo trivial, pero bue por ahora es lo mejor que se me ocurre.
Hace 4 años estuve viendo jameleon y creo que me puede servir, pero cuando entré a la página me asustó un poco, alguno tuvo alguna experiencia con esto? creen que me pude servir?

En cuanto tenga algún resultado les voy a contar...