ES KAsi UN blog

Blog de Unkasoft, donde hablamos de programación de juegos para móviles, advergaming, marketing móvil, la industria de los videojuegos, metodologías ágiles y todos aquellos temas que nos preocupan en nuestro día a día

24 septiembre 2007

Test Unitarios en J2ME

En el desarrollo de proyectos es muy importante el mantenimiento y más aun las tareas de debug asociadas tanto a la creación como al mantenimiento de cualquier proyecto. Siempre debemos crear buenos casos de prueba que permitan comprobar la validez de nuestro código según lo vamos creando, para facilitar el mantenimiento del mismo y para simplificar radicalmente la cantidad de problemas y fallos que pueda dar.

Cuando programamos en Java podemos comprobar nuestras clases utilizando 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. También se utiliza en pruebas de regresión, para comprobar que el nuevo código no afecta al funcionamiento del código anterior. Este framework permite que el programador se centre en la realización de los test y en los resultados que debe obtener, gestionando los test de forma sencilla y permitiendo su ejecución automática.

Normalmente, la ejecución de test unitarios es necesaria para poder asumir la mantenibilidad de un proyecto, pues con ellos, cualquier desarrollador puede conocer cuando los cambios que está realizando afectan al resto de código del proyecto. En otras ocasiones, los test unitarios sirven como guía a otros programadores, y a uno mismo, de cómo funciona un código específico, pues un test, además de salvarnos de bugs, permite conocer qué estructura y usos tiene el propio código que se prueba.

El framework de JUnit utiliza las capacidades de reflexión en tiempo de ejecución para encontrar y ejecutar todos los test sin necesitar un test case. Sin embargo, los entornos basados en CLDC pierden la reflexión, con lo que no es posible descubrir los métodos en tiempo de ejecución, por ello, necesitamos distintas soluciones que permitan realizan test unitarios de forma sencilla para el programador.

El problema que tiene testear estas aplicaciones es que Java ME es básicamente un JDK 1.0. Hasta JUnit 3.8.X el mecanismo que usaba este framework para identificar los métodos que debía ejecutar como parte del test era la reflexión, característica que se añadió en Java 1.2 y que no está presente en Java ME. Menos esperanzas hay todavía de usar anotaciones, el mecanismo que emplean las versiones 4.0 y posteriores de JUnit, en Java ME.

La siguiente tabla resume las capacidades y características de las distintas soluciones para utilizar toda la potencia posible de JUnit sobre J2ME, a continuación se comenta brevemente cada alternativa:

Ejemplos / Complejidad

¿Ant? / ¿Maven?

¿Open source?

¿Ejecución en dispositivo?

Requerimientos

Peso (Kb)

MoMEUnit

Pocos / sencillo

Si

Si

Si

CLDC1.1

26

SonyEricsson JUnit

Muchos / complejo

Si

NO

NO. Solo con Debug-on-device

CLDC 1.0

20

J2MEUnit

Muchos / medio

Si

Si

Si

CLDC 1.1

17

JMUnit

Varios / medio

NO

Si

Si

CLDC1.0
CLDC 1.1

12,5
12,8

CLDCUnit

Pocos / sencillo?

Si / Si

Si

Si?

CLDC 1.1

?

J2MEUnit

Solo dispone de una versión del framework, compatible con CLDC11.
Parecido a JMUnit, para crear una suite de test necesitamos sobrecargar el metodo suite() utilizando la librería TestMethod. Esto hace que la creación de testsuites sea un poco más compleja

Alternativamente, como en MoMEUnit, J2MEUnit permite añadir los test o testSuites como propiedades del MIDlet para así ejecutarlos directamente sin tener que crearnos una MIDlet programaticamente. El TestRunnner MIDlet no proporciona resultados tan sencillos gráficamente, fáciles de ver, como JMUnit o MoMEUnit, pero sin embargo, en la consola proporciona más información que éstos.

MoME Unit

MoMEUnit es una herramienta muy similar a JUnit pero orientada a aplicaciones Java ME. Emplea tres métodos estandarizados en cada test, uno para preparar el test, otro para ejecutarlo y otro para realizar "limpieza". De este modo los test se hacen por clase más que por método. Aunque no es la solución óptima, los desarrolladores del framework afirman que es el mejor balance que se puede obtener.

MoME permite crear TestSuites con todos los test que queramos para ejecutaros a la vez; pero para que un Test comparta la fixture con otros es necesasrio que creemos una clase por test a ejecutar. El problema es tener tantas clases para todos los test.
La creación de los test es muy sencilla, es decir, es más fácil añadir test desde MoME que desde J2MEUnit.

SE Junit

La API de Sony Ericsson para ejecutar JUnit sobre J2ME. Dispone de mucha documentación y varios ejemplos de test. Permite utilizar directamente los test creados para JUnit 3.8.x.

SE JUnit requiere, para ejecutar los test, el emulador de SonyEricsson o cualquier otro compatible con WTK. lo más cercano a la ejecución en un dispositivo real es utilizar DebugOnDevice de SE que solo es compatible con algunos móviles SonyEricsson

El uso de SE Mobile Unit no es muy apropiado en casos específicos en los que se necesita añadir funcionalidades al código fuente que se está utilizando. Al no ser open-source puede que en ocasiones no se ajuste a las necesidades existentes.

JMUnit

Este framework es parecido a J2MEUnit en cuanto al uso que se hace de los test y cómo éstos se ejecutan. Principal problema de este framework es que no soporta Ant.

Para contruir una suite, cada clase que contenga los test deberá sobrecargar el método test() que contendrá un case para cada método (test) a ejecutar.Las clases abstractas TestCase y TestSuite heredan directamente de MIDlet, con lo que fácilmente se pueden ejecutar en el emulador o en un dispositivo real.

CLDCUnit

Parte de MicroEmulator, un emulador de J2ME basado en WTK. Permite ejecutar aplicaciones J2ME como aplicaciones stand-alone de J2SE o como applets java en el navegador Web. Es decir, permite hacer que nuestro navegador se comporte como un móvil y ejecute aplicaciones J2ME.

CLDCUnit es muy parecido a J2MEUnit y parte de su código fuente; conservando una interfaz muy semejante.

CONCLUSIÓN

Comparando las distintas APIs, las posibilidades que ofrecen y las necesidades que se requieren, pienso que destacan dos de las comentadas.:

MoMEUnit Ofrece mucha información muy usable de los test realizados. Se porta fácilmente al móvil y es compatible con Ant. Desventaja (o no), necesita que cada clase de test contenga un solo método de test utilizando mucha herencia entre clases.

JMEUnit. (futura unión entre J2MEUnit y JMUnit) JMUnit no soporta Ant pero la interfaz es parecida a la de MoMEUnit. J2MEUnit no ofrece información muy usable. Ambas framework requieren creación de test un poco compleja. J2MEUnit sí soporta Ant; es por esto que la fusión de ambas frameworks sería muy interesante (en ello estan trabajando desde hace un año más o menos).

REFERENCIAS

J2MEUnit http://j2meunit.sourceforge.net/doc.html

Unit de SonyEricsson http://developer.sonyericsson.com/getDocument.do?docId=85608

JMUnit http://sourceforge.net/projects/jmunit/

MoMEUnit http://momeunit.sourceforge.net/

CLDCUnit http://pyx4me.com/snapshot/pyx4me/pyx4me-cldcunit/index.html

Etiquetas: , , , , , ,


Comentarios:
Publicar un comentario



<< Home

This page is powered by Blogger. Isn't yours?