24 septiembre 2007
Test Unitarios en J2ME
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 | 12,5 |
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
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: j2me, J2MEUnit, Java, JUnit, MoMEUnit, programación, Test unitarios