jUnit desde la linea de comandos

Consola despues de ejecutar las pruebas de unidad de un proyecto
¿Quien necesita un IDE?

Ok, ya se aventó las conferencias del tio Bob Martin en Youtube, leyó uno o dos tutoriales de jUnit y desea darle a eso del Test Driven Development una oportunidad (Intento no por que Yoda y el Sr. Miyagi se enojan si lo “intenta”) y si bien puede hacerlo dejando que el IDE o Maven haga todo el trabajo de configurar las pruebas y el proyecto, le puedo decir que saber como funciona algo sin esas comodidades puede ser la diferencia entre estar haciendo contorsionismo ritual con las clases de su código para corregir un problema o nada mas cambiar el nombre de un getter, así que sin IDE, sin Maven, sin ANT, au-naturel veamos como ejecutar las pruebas de jUnit desde la consola.

Requisitorios

Como ya dijimos vamos a hacer esto SIN las herramientas del IDE o de Maven por lo que primero necesitamos los siguientes .jar con las librerías de jUnit 5.0 en especifico, se incluye el enlace a donde bajarlos.

Ya que los tenga armaremos nuestro proyecto.

Proyecto

Ahora vamos a hacer un proyecto a la antigua, creando nosotros las carpetas de librerías y con las fuentes, esto es simple, creamos una carpeta lib donde pondremos los .jar y las carpetas necesarias para colocar las fuentes (recuerde que la carpeta donde pone el .java y .class debe reflejar el paquete de la clase) para nuestro ejemplo usaremos la siguiente estructura:

.
├── lib
│   ├── apiguardian-api-1.0.0.jar
│   ├── junit-jupiter-api-5.0.2.jar
│   └── junit-platform-console-standalone-1.0.2.jar
└── mx
    ├── calculo
    │   ├── Calculo.class
    │   └── Calculo.java
    └── calculoTest
        ├── CalculoTest.class
        └── CalculoTest.java

Los archivos Calculo.java y CalculoTest.java se presentan a continuación

package mx.calculo;

public class Calculo {
    public double calcular(double s) {
	return s*s;	
    }

    public double calcularIVA(double precio){
	return precio*0.16;
    }

    static public void main(String[] args){
	Calculo c = new Calculo();

	System.out.println("Resultado: " + c.calcular(2.0) + "");
    }
}
package mx.calculoTest;

import mx.calculo.Calculo;
import org.junit.*;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class CalculoTest {
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {

    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {

    }
    
    /**
     Con esta prueba verificaremos que jUnit este funcionando  
    */
    @Test
    public void pruebaJUnit(){
	
	assertTrue(true);
    }

    @Test
    public void pruebaCalculo(){
	Calculo calculo = new Calculo();

	assertEquals(1.0, calculo.calcular(1.0));
	assertEquals(4.0, calculo.calcular(2.0));
	assertEquals(9.0, calculo.calcular(3.0));
	assertEquals(16.0, calculo.calcular(4.0));
	assertEquals(25.0, calculo.calcular(5.0));	
    }

    @Test
    public void pruebaIVA(){
	Calculo calculo = new Calculo();

	assertEquals(1.6, calculo.calcularIVA(10));
    }    
}

Compilando las clases

Ahora con respecto a los .class, ¡Hora de desempolvar el comando javac!, sea honesto ¿Hace cuando que no lo usa?, aquí debo hacer hincapié en dos detalles

Primero los archivos .jar deben de ir donde se indica y segundo, el la linea de comandos debe de estar en el directorio raíz del proyecto, de lo contrario los comandos no van a funcionar, los comandos son los siguientes:

Para compilar Calculo.java

javac mx/calculo/Calculo.java

 

Para compilar CalculoTest.java

javac -cp lib/*:. mx/calculoTest/CalculoTest.java

 

El argumento -cp lib/*:. es para indicarle al compilador el classpath, esto es las librerías y las clases que deseamos compilar, los :. al final no los olvide ya que eso le indica al compilador que incluya el directorio actual.

Con esto ya compiló su proyecto, ahora vamos a correr las pruebas

Corriendo las pruebas

Ok ya compilo el proyecto, pero.. ¿Funciona como debe? bueno para eso hicimos las pruebas de unidad en CalculoTest, pusimos los valores esperados y los compararemos contra el resultado que den las funciones, si son iguales sabremos que el sistema funciona correctamente y si no sabremos que falló.

Para correr las pruebas use el siguiente comando

java -cp lib/*:. org.junit.platform.console.ConsoleLauncher -p mx

 

Aquí lo que estamos haciendo es correr la clase org.junit.platform.console.ConsoleLauncher ,la cual esta contenida en el archivo junit-platform-console-standalone-1.0.2.jar, y le indicamos el paquete que contiene las pruebas que deseamos ejecutar.

Notara que solo indicamos el paquete mx en lugar de mx.calculoTest esto se debe a que la clase ConsoleLauncer buscara las pruebas en el paquete indicado y en los subpaquetes de ese, de modo que si acomodo todas sus pruebas en la forma adecuada con solo indicar el paquete principal las correrá todas.

En la eventualidad de que tenga pruebas en otros paquetes completamente diferentes, basta con poner otro argumento -p con otro paquete donde buscar las pruebas, puede usar cuantos -p necesite.

Ya que ejecute el comando obtendrá la siguiente salida.

╷
├─ JUnit Jupiter ✔
└─ JUnit Vintage ✔
   └─ mx.calculoTest.CalculoTest ✔
      ├─ pruebaJUnit ✔
      ├─ pruebaCalculo ✔
      └─ pruebaIVA ✔

Test run finished after 33 ms
[         3 containers found      ]
[         0 containers skipped    ]
[         3 containers started    ]
[         0 containers aborted    ]
[         3 containers successful ]
[         0 containers failed     ]
[         3 tests found           ]
[         0 tests skipped         ]
[         3 tests started         ]
[         0 tests aborted         ]
[         3 tests successful      ]
[         0 tests failed          ]

 

Mas elaborado de lo que se imaginaba, ¿No? como puede ver se le muestra cada una de las pruebas contenidas en las clases y el estado de las mismas poniendo un ✔ para indicar que la prueba fue exitosa y un ✘ para indicar un fallo mas aparte información de por que fallo.

Tras esto se coloca un resumen de las pruebas, esto puede parecer un poco redundante en este ejemplo, pero le apuesto cuando tenga cientos de pruebas agradecerá tener ese listado a la mano.

Como un pequeño reto, usando la información que le dan las pruebas corrija el programa, recompile y obtenga la salida con todas las pruebas exitosas.

Puede hallar todo el código de este ejemplo y el script para compilarlo en GitHub :

https://github.com/HashRaygoza/TestRunner

Espero que esta entrada fuera útil y nos vemos en la próxima :).

Referencias

[1] Unit Testing with JUnit — http://www.vogella.com/tutorials/JUnit/article.html

[2] jUnit Console Launcher — http://junit.org/junit5/docs/current/user-guide/#running-tests-console-launcher-options

 

Anuncios