JUnit 4. Pruebas de Software Java

5
61876

JUnit 4. Pruebas de Software Java

Introducción

Yo trabajo en Autentia, una empresa en donde velamos por la calidad de nuestros desarrollos en todas las fases del ciclo de vida del software. Una fase importantísima es la Fase de Pruebas.

JUnit es un framework para realizar y automatizar pruebas de aplicaciones Java. Es decir, JUnit se sitúa en la fase de pruebas dentro del ciclo de Ingeniería del Software.

Este documento no trata de ser una referencia teórica sobre pruebas. Se centra en introducir al lector en el uso y las nuevas características de la versión JUnit 4 respecto a las anteriores.

Si quería remarcar dos conceptos teóricos:

  1. Nunca se puede asegurar que una aplicación funcionará correctamente siempre, pues es inviable económicamente realizar pruebas de todos los componentes individuales y de todos los componentes como conjunto.
  2. Las pruebas deben ser diseñadas para descubrir fallos y no para demostrar que el software funciona. Siendo más razonable diseñar pruebas de aquellas partes en donde la probabilidad de fallo es mayor.
  3. Las pruebas deben ser diseñadas por personas distintas a las personas que desarrollan el componente que se desea probar. De todos es bien sabido que conocemos los fallos de nuestros componentes y si el componente es ejecutado por las personas que lo desarrollan cuando lo enseñan, no van a ser tan ingenuos de hacer que falle.

Instalación de JUnit 4

JUnit 4 puede descargarse desde la siguiente dirección http://www.junit.org.

JUnit se distribuye como un fichero comprimido, lo descomprimimos y añadimos el fichero junit.jar al CLASSPATH de nuestro sistema.

Para realizar pruebas con JUnit 4.0, se requiere una versión de Java 5.0 o superior.

Ejemplo

A continuación presentamos una clase sobre la que vamos a realizar pruebas utilizando JUnit 4. La clase aporta una seria de funcionalidad sobre un array de cadenas de caracteres:

String getMaxLength()
Devuelve la cadena que más caracteres tenga.
int getTotalLength()
Devuelve la suma de la longitud de todas las cadenas de caracteres.
int getIndexOf(String) throws java.util.NoSuchElementException
Devuelve la posición que ocupa una determinada cadena o lanza una java.util.NoSuchElementException si la cadena no existe.

Bueno ya tenemos la clase sobre la que vamos a realizar las pruebas de unidad, ahora vamos a diseñar otra clase con las pruebas a realizar.

BeforeClass:
Sólo puede haber un método con este marcador.
Este método será invocado una vez al principio del lanzamiento de todas las pruebas. Se suele utilizar para inicializar los atributos comunes a todas las pruebas o para realizar acciones que tardan un tiempo considerarse en ejecutarse.
AfterClass:
Sólo puede haber un método con este marcador.
Este método será invocado un sóla vez cuando finalizen todas las pruebas.
Before:
Los métodos marcados con está anotación, serán invocados antes de iniciarse cada prueba.
After:
Los métodos marcados con está anotación, serán invocados después de ejecutarse cada prueba.
Test:
Representa un test que se debe ejecutar.
Puede tener dos tipos de modificadores:

  • Test(timeout=X) que significa que el test será válido si se ejecuta en un tiempo máximo de X milisegundos.
  • Test(expected = java.util.NoSuchElementException.class). Que significa que el test será válido si se lanza una determinada excepción.
Ignore:
Los métodos marcados con esta anotación no serán ejecutados. Se suelen poner para desactivar las pruebas que no pueden ser realizadas por
algún motivo.
Puede tener un parámetro que indica un texto que se visualizará en la la plataforma donde se ejecuten los test.
Ejemplo: Ignore(«Se desactiva esta prueba hasta que tengamos privilegios de conexión con la base de datos.»);

Conclusiones

Al igual que la gran mayoría de las tecnologías del mundo Java, JUnit evoluciona para aportar nuevas mejoras y hacernos la vida más fácil a los programadores, diseñadores de pruebas, etc.

Ahora JUnit incorpora las siguientes ventajas y modificaciones respecto a versiones anteriores

  • Las clases que contienen los métodos que representan las pruebas ya no tienen que ser subclases de junit.framework.TestCase
  • Los métodos que representan las pruebas a realizar ya no tienen que tener el prefijo «test» en su nombre sino que se indican con la anotación @Test
  • Sustitución del método ‘setUp’ por la anotación o anotaciones @Before.
  • Sustitución del método ‘tearDown’ por la anotación o anotaciones @After.
  • Se pueden realizar pruebas en donde el tiempo de ejecución es crítico. De manera que una prueba falle si tarda más de X milisegundos en ser ejecutada.
  • Se pueden realizar pruebas en donde se debe controlar que una excepción es lanzada.
  • Se pueden desactivar pruebas, a través de la anotación @Ignore.

5 COMENTARIOS

  1. Es un buen tutorial, como la mayoría de esta página.
    Una vez más, gracias por compartir tiempo y conocimiento con todos nosotros. Vuestra implicación en el mundo de la informática es digno de admiración.

  2. Animo a la gente a probar la siguiente opción.
    Una BD de desarrollo, otra BD de preproducción, otra BD de producción.
    Las pruebas del sistema se desarrollan en una BD emulada, con datos introducidos mediante DBUnit.

    Una aplicación sencilla en Java, con BD en MySQL, puede ser testeada con una BD HSQLDB utilizando JUnit para pruebas y DBUnit para introducir los datos que deseemos.

    Saludos cordiales,
    Jaime.

  3. Otra observación:
    En un entorno ideal, se realizan las siguientes pruebas:
    Pruebas Unitarias, Pruebas de Integración, Pruebas de Sistema.

    La ventaja de aplicar JUnit es que las pruebas unitarias se automatizan. La ventaja es que si realizamos modificaciones en el código, podemos reutilizar este banco de pruebas para ver si nuevos requisitos interfieren en el funcionamiento antiguo.

    Una maravilla tecnológica.

  4. Una aportación más:

    En un entorno ideal, es conveniente que las pruebas las realiza una persona, y el desarrollo otra diferente. El objetivo de las pruebas es DETECTAR errores, y si las realiza un programador, inconscientemente puede programarlas para que estas sean correctas.
    Un sistema de pruebas es efectivo CUANTO MAS errores detecte, no olvidemos este concepto y el ideal de desarrollo de Software (que en muchas ocasiones, choca con la practicidad del mundo real).

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad