You are on page 1of 6

Tutorial JUnit en Eclipse

JUnit es un framework desarrollado para la realizacin de tests de unidad. Tiene como principal caracterstica poder definir Tests de forma rpida y sencilla a travs de la utilizacin de etiquetas. Tambin es posible crear clases que sirvan para lanzar conjuntos de tests (TestSuite) y de esta manera automatizar ms an el proceso. Veamos un ejemplo rpido que espero os ayude a comprender la creacin de tests de unidad de una forma eficaz en Eclipse SDK Galileo. Primero de todo vamos a crear un nuevo proyecto, para ello vamos a File->New->Java Project o pulsamos Shift+Alt+N y seleccionamos Java Project. Da igual el nombre que se le ponga, aseguraros de que teneis la ltima versin de Java seleccionada, en este caso yo estoy trabajando con JavaSE-1.6. Una vez creado debereis de crear una carpeta de cdigo por separado para los tests, es una prctica habitual anque no es necesario para su funcionamiento. Pero la idea es tener el cdigo del proyecto separado de los tests de unidad.

Como podeis ver en la captura, la idea es crear una estructura similar a esto. En src tendreis el cdigo del proyecto y en tests estarn los tests de unidad. Imaginemos que tenemos una serie de fachadas en el proyecto donde estn algunos de los casos de uso que os interesa comprobar su funcionamiento. Pus para ello creemos un paquete en los tests que tendr los tests relacionados con este material. Sera interesante crear un paquete ms que contenga otros casos de uso, yo crear un paquete com.miguelpuig.blzarovich.junittutorial.fachada2. Esto lo hago para mostraros ms adelante como hacer una Test que lance los tests de las dos fachadas. Ahora crearemos en fachada1 dos clases Suma y Multiplicacion. Estas dos clases tan simples e intiles simplemente guardarn dos variables que se podrn sumar y restar. Su cdigo sera tal que as.
view plaincopy to clipboardprint?

1. package com.miguelpuig.blzarovich.junittutorial.fachada; 2. 3. public class Suma { 4. private int a; 5. private int b; 6. 7. public Suma(int a, int b) {

8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. }

this.a = a; this.b = b; } /** * Suma a + b * @return a+b */ public int suma() { return a + b; } /** * Resta a * @return */ public int return }

- b a-b resta() { a - b;

Suma tiene dos mtodos, para poder hacer la prueba de meter dos tests en una misma clase de junit.
view plaincopy to clipboardprint?

1. package com.miguelpuig.blzarovich.junittutorial.fachada; 2. 3. public class Multiplicacion { 4. private int a; 5. private int b; 6. 7. public Multiplicacion(int a, int b) { 8. this.a = a; 9. this.b = b; 10. } 11. 12. public int multiplicar() { 13. return a*b; 14. } 15. }

Bien, ahora en la fachada2 vamos a hacer lo mismo para la divisin.


view plaincopy to clipboardprint?

1. package com.miguelpuig.blzarovich.junittutorial.fachada2; 2. 3. public class Division { 4. private int a; 5. private int b; 6. 7. public Division(int a, int b) { 8. this.a = a; 9. this.b = b; 10. } 11. 12. public int divide() { 13. return a/b; 14. } 15. }

Ahora ya tenemos material para poder probar junit. Vereis que es realmente sencillo. Primero vamos a realizar una clase para testear la suma. Para ello botn derecho en el

paquete fachada de la carpeta de tests, vais a nuevo y seleccionais JUnit Test Case (en caso de que no aparezca tendreis que pulsar Other y seleccionarlo, la prxima vez aparecer en el men directamente). A la clase le podeis llamar SumaTest, aseguraros de seleccionar JUnit4.

Ahora ya podeis crear la clase con el siguiente cdigo.


view plaincopy to clipboardprint?

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.

package fachadatests; import static org.junit.Assert.assertTrue; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.miguelpuig.blzarovich.junittutorial.fachada.Suma; public class SumaTest { public Suma suma; @Before public void antesDelTest() { /** * El metodo precedido por la etiqueta @Before * es para indicar a JUnit que debe ejecutarlo * antes de ejecutar los Tests que figuran en * esta clase. */ this.suma = new Suma(3, 5); } @After public void despuesDelTest() { /** * La etiqueta @After es la anttesis de @Before. * Simplemente este metodo se ejecutara despues de * ejecutar todos los tests de esta clase. */ // en este caso no hago nada, solo esta de ejemplo } @Test public void testSuma() { /** * Marcais el metodo con la etiqueta @Test y es * importante que el nombre del metodo comience * siempre por test. */ int resultado = this.suma.suma(); // con esto verificamos que el resultado es el esperado assertTrue(resultado == 8); } @Test public void testResta() { int resultado = this.suma.resta(); assertTrue(resultado == -2); }

52. }

Ahora con la multiplicacin, slo que sin before y after. Ya que es una tontera para una clase as, y en la clase anterior slo se pusieron a modo de demostracin. Before y After en realidad estn geniales para cuando realizas tests de unidad al nivel de acceso a datos de una aplicacin. Ah en el Before prepararas la base de datos para realizar las pruebas y en After desharas los cambios simplemente.
view plaincopy to clipboardprint?

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.

package fachadatests; import static org.junit.Assert.assertTrue; import org.junit.Test; import com.miguelpuig.blzarovich.junittutorial.fachada.Multiplicacion; public class MultiplicacionTest { /** * Lo mismo de antes pero esta vez sin * before y after. */ @Test public void testMultiplicar() { Multiplicacion multiplicacion = new Multiplicacion(3, 5); int resultado = multiplicacion.multiplicar(); assertTrue(resultado == 15); } }

Ahora finalmente creamos una clase para la Divisin, ser exactamente igual que la anterior pero con la divisin. Adems como la Division est en la fachada2, pus el Junit Test Case lo crearemos en fachada2 de la carpeta de tests.
view plaincopy to clipboardprint?

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.

package fachada2tests; import static org.junit.Assert.assertTrue; import org.junit.Test; import com.miguelpuig.blzarovich.junittutorial.fachada2.Division; public class DivisionTest { @Test public void testDivide() { Division division = new Division(4, 2); int resultado = division.divide(); assertTrue(resultado == 2); } }

Bien, ya tenemos todos los tests de unidad. Ahora pulsando botn derecho sobre las clases de los tests podreis lanzar los tests pulsando Run as JUnit Test. Yo en principio an no lo voy a hacer, lo reservo para el final.

Si lo probasteis, podreis observar que igual puede ser un coazo tener que ejecutar cada Test Case por separado, uno a uno. Esto se puede evitar. Para ello vamos a agrupar los Tests de fachada1 en uno slo que los ejecutar automticamente. Para ello creareis la clase FachadaTests. Que simplemente necesitar de la declaracin de la clase, que no tendr nada dentro. Esta clase estar marcada por dos etiquetas RunWith que le indicar con que clase del framework debe cargar esta clase; y SuiteClasses que tendr una lista de las clases que son Tests o SuiteClasses. Esto implica que puedes meter SuiteClasses dentro de SuiteClasses y as poder organizar jerrquicamente tus tests.
view plaincopy to clipboardprint?

1. 2. 3. 4. 5. 6. 7. 8. 9.

package fachadatests; import org.junit.runner.RunWith; import org.junit.runners.Suite.SuiteClasses; import org.junit.runners.Suite; @RunWith(Suite.class) @SuiteClasses({SumaTest.class, MultiplicacionTest.class}) public class FachadaTests {}

As de simple queda la clase. Ahora realizaremos una clase similar a esta en el raiz de la carpeta tests. Para ejecutar todos los tests conjuntamente, esta se llamar AllTests. Os la meter en el default package, tranquilos.
view plaincopy to clipboardprint?

1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; import fachada2tests.DivisionTest; import fachadatests.FachadaTests; @RunWith(Suite.class) @SuiteClasses({FachadaTests.class, DivisionTest.class}) public class AllTests {}

Como veis en el SuiteClasses podeis mezclar tests simples y TestSuite . Ya teneis vuestros tests preparados para ejecutar por lote. Vamos ahora a pulsar botn derecho en AllTests y seleccionar Run as JUnit Test. Automticamente el Eclipse lanzar todos los tests que teneis programados y os aparecer un resultado parecido a esto.

Como veis todos los tests salieron con resultados satisfactorios. Ahora os recomiendo jugar y probar vosotros mismos con todo esto, meter en los assertTrue resultados no esperados, para que veais que pasa cuando falla, aadir ms clases, hacer pruebas ms complejas o probar toda la coleccin de asserts que podeis utilizar (assertEquals, assertNull, assertNotNull, etc). Cdigo fuente del proyecto utilizado como ejemplo