JUnit es un marco de automatización de pruebas para el lenguaje de programación Java . JUnit se usa frecuentemente para pruebas unitarias y es uno de los marcos xUnit .
JUnit se enlaza como un JAR en tiempo de compilación. La última versión del framework, JUnit 6, reside en el paquete org.junit.jupiter. [ 3 ] Las versiones anteriores JUnit 4 [ 3 ] y JUnit 3 estaban en los paquetes org.junity junit.framework, respectivamente.
Una encuesta realizada en 2013 a 10 000 proyectos Java alojados en GitHub reveló que JUnit (empatada con slf4j-api ) era la biblioteca externa más utilizada. Cada biblioteca se empleaba en el 30,7 % de los proyectos. [ 4 ]
Ciclo de vida de JUnit
Cada clase de prueba JUnit suele tener varios casos de prueba. Estos casos de prueba están sujetos al ciclo de vida de la prueba. El ciclo de vida completo de JUnit tiene tres fases principales: [ 5 ]
- Fase de configuración: En esta fase se prepara la infraestructura de prueba. Existen dos niveles de configuración. El primer tipo es la configuración a nivel de clase, en la que se crea y reutiliza un objeto computacionalmente costoso, como una conexión a la base de datos, con efectos secundarios mínimos. La configuración a nivel de clase se implementa mediante la
@BeforeAllanotación. El otro tipo es la configuración previa a la ejecución de cada caso de prueba, que también utiliza la@BeforeEachanotación. [ 5 ] - Ejecución de la prueba: esta fase se encarga de ejecutar la prueba y verificar el resultado. El resultado de la prueba indicará si fue exitosa o fallida.
@TestAquí se utiliza la anotación. [ 5 ] - Fase de limpieza: Después de ejecutar todas las pruebas posteriores, el sistema puede necesitar realizar una limpieza. Al igual que con la configuración a nivel de clase, existe una limpieza correspondiente a nivel de clase. La
@AfterAllanotación se utiliza para admitir la limpieza a nivel de clase. La@AfterEachanotación permite la limpieza después de la ejecución de la prueba. [ 5 ]
Integración con otras herramientas
JUnit 6 integra una serie de herramientas, como herramientas de compilación , entornos de desarrollo integrados (IDE), herramientas de integración continua (CI) y muchas más. [ 6 ]
Herramientas de compilación
JUnit admite las herramientas de compilación Apache Ant , Apache Maven y Gradle , que son las herramientas de compilación de proyectos más utilizadas. [ 7 ] Las herramientas de compilación son vitales para automatizar el proceso de compilación del proyecto. [ 6 ]
Extensión de hormigas
Apache Ant, también conocido como Ant, es una de las herramientas de compilación con mayor grado de versatilidad y tiene la historia más larga de las tres herramientas de compilación mencionadas anteriormente. [ 8 ] Ant se centra en el build.xmlarchivo, utilizado para configurar las tareas necesarias para ejecutar un proyecto. [ 8 ] Ant también tiene una extensión llamada Apache Ivy , que ayuda a manejar la resolución de dependencias. Las dependencias del proyecto se pueden declarar en el ivy.xmlarchivo. Ant puede integrarse con JUnit 5 y versiones posteriores configurando las herramientas de cobertura de código Java (JaCoCo) para el ivy.xmlarchivo. [ 8 ] Luego se ivy.xmlpuede configurar con las dependencias java-platform-consoley junit-platform-runnerpara integrarse con JUnit 5 y versiones posteriores. [ 9 ]
Extensión Maven
A diferencia de Ant, Apache Maven, también conocido como Maven, utiliza un enfoque estandarizado y unificado para el proceso de compilación. [ 10 ] Maven sigue el paradigma de "convención sobre configuración" para gestionar sus dependencias. [ 11 ] El código fuente Java (o "src") se encuentra en el src/main/javadirectorio y los archivos de prueba en el src/test/javadirectorio. [ 11 ] Maven se puede utilizar para cualquier proyecto Java. [ 10 ] Utiliza el Project Object Model (POM), que es un enfoque basado en XML para configurar los pasos de compilación del proyecto. [ 10 ] El Maven mínimo con el pom.xmlarchivo de compilación debe contener una lista de dependencias y un identificador de proyecto único. [ 10 ] Maven debe estar disponible en la ruta de compilación para funcionar. [ 10 ] Maven puede integrarse con JUnit 5 y versiones posteriores mediante el jacoco-maven-plugincomplemento que admite funcionalidad lista para usar para pruebas JUnit. [ 12 ] Se pueden especificar diferentes objetivos de Maven para lograr estas tareas. [ 12 ]
Extensión de Gradle
Gradle es una herramienta de compilación que toma prestados muchos conceptos de sus predecesores, Ant y Maven. [ 11 ] Utiliza el build.gradlearchivo para declarar los pasos necesarios para la compilación del proyecto. [ 11 ] A diferencia de Ant y Maven, que se basan en XML, Gradle requiere el uso de Apache Groovy , que es un lenguaje de programación basado en Java. [ 11 ] A diferencia de Ant y Maven, Gradle no requiere el uso de XML. [ 11 ] Gradle todavía se adhiere al enfoque de Maven de "convención sobre configuración" y sigue la misma estructura para src/main/javalos src/test/javadirectorios. [ 11 ] Gradle puede integrarse con JUnit 5 y posterior configurando un complemento jacocojunto con el complemento junit-platform proporcionado por el equipo de JUnit en el archivo de compilación. [ 13 ]
Modelo de extensión JUnit
JUnit sigue el paradigma de preferir los puntos de extensión a las características. [ 14 ] El equipo de JUnit decidió no incluir todas las características en el núcleo de JUnit, sino que optó por ofrecer una forma extensible para que los desarrolladores abordaran sus inquietudes. [ 14 ]
En JUnit 4, existen dos mecanismos de extensión: la API Runner y la API Rule. [ 15 ] Ambas API, Runner y Rule, presentaban algunas desventajas.
Una limitación importante de la API Runner es que los desarrolladores deben implementar todo el ciclo de vida de la prueba, incluso si solo se requiere una fase específica. [ 15 ] Esto es demasiado complicado y pesado para la mayoría de los casos de uso. [ 15 ] Otra limitación importante es que solo se puede usar una clase de runner por caso de prueba, lo que hace que los runners no sean componibles. [ 15 ] Por ejemplo, los runners de Mockito y Parameterized no se pueden usar juntos dentro de la misma clase de prueba. [ 15 ]
Una limitación importante de la API de reglas es que no puede controlar todo el ciclo de vida de la prueba y, por lo tanto, no es adecuada para ciertos casos de uso. [ 15 ] Las reglas solo son adecuadas para operaciones que necesitan ejecutarse antes o después de la ejecución de la prueba. [ 15 ] Otra limitación es que las reglas a nivel de clase y a nivel de método deben definirse por separado. [ 15 ]
En JUnit 5 y versiones posteriores, la API de extensión se encuentra dentro del motor de JUnit Jupiter. [ 16 ] El equipo de JUnit quiere permitir que el desarrollador se conecte a diferentes etapas del ciclo de vida de una prueba proporcionando una única API de extensión unificada. [ 16 ] Al llegar a una determinada fase del ciclo de vida, el motor de Jupiter invocará todas las extensiones registradas para esa fase. [ 16 ] El desarrollador puede conectarse a cinco puntos de extensión principales: [ 16 ]
- Las funciones de devolución de llamada del ciclo de vida de las pruebas permiten a los desarrolladores ejecutar código en fases específicas del ciclo de vida de las pruebas. [ 17 ]
- Procesamiento posterior de instancias de prueba: permite a los desarrolladores intervenir en la fase de creación de instancias de prueba mediante la
TestInstancePostProcessorinterfaz. [ 18 ] - Ejecución de pruebas condicional: permite que las pruebas se ejecuten solo si se cumplen ciertas condiciones. [ 19 ]
- Resolución de parámetros: permite inyectar parámetros en métodos de prueba o constructores.
- Manejo de excepciones: permite a los desarrolladores modificar el comportamiento de la prueba en respuesta a excepciones en lugar de hacer que la prueba falle directamente. [ 20 ]
Ejemplo de un dispositivo de prueba JUnit
Un fixture de prueba JUnit es un objeto Java. Los métodos de prueba deben estar anotados con la @Testanotación . Si la situación lo requiere, [ 21 ] también es posible definir un método para ejecutar antes (o después) de cada uno (o todos) los métodos de prueba con las anotaciones @BeforeEach(o @AfterEach) y @BeforeAll(o @AfterAll). [ 22 ] [ 23 ]
import org.junit.jupiter.api.* ;clase FoobarTests { @BeforeAll static void setUpClass () throws Exception { // Código ejecutado antes del primer método de prueba }@BeforeEach void setUp () throws Exception { // Código ejecutado antes de cada prueba } @Test void oneThing () { // Código que prueba una cosa }@Test void anotherThing () { // Código que prueba otra cosa }@Test void somethingElse () { // Código que prueba otra cosa }@AfterEach void tearDown () throws Exception { // Código ejecutado después de cada prueba } @AfterAll static void tearDownClass () throws Exception { // Código ejecutado después del último método de prueba } }Versiones anteriores de JUnit
Según Martin Fowler, uno de los primeros en adoptar JUnit: [ 24 ]
JUnit nació en un vuelo de Zúrich a la conferencia OOPSLA de 1997 en Atlanta. Kent volaba con Erich Gamma, y ¿qué otra cosa podían hacer dos geeks en un vuelo largo sino programar? La primera versión de JUnit se creó allí, mediante programación en parejas y con un enfoque de pruebas primero (una forma interesante de meta-recursos informáticos).
Como efecto secundario de su amplio uso, las versiones anteriores de JUnit siguen siendo populares, y JUnit 4 cuenta con más de 100.000 usos por parte de otros componentes de software en el repositorio Maven Central. [ 25 ]
En JUnit 4, las anotaciones para las devoluciones de llamada de ejecución de pruebas eran @BeforeClass, @Before, @After, y @AfterClass, a diferencia de las de JUnit 5, que eran @BeforeAll, @BeforeEach, @AfterEach, y @AfterAll. [ 22 ] [ 23 ]
En JUnit 3, los fixtures de prueba debían heredar de junit.framework.TestCase. [ 26 ] Además, los métodos de prueba debían tener el prefijo 'test'. [ 27 ]
Véase también
- xUnit , el nombre de la familia que se le da a los marcos de prueba, incluido JUnit.
- SUnit , la versión original de Smalltalk escrita por Kent Beck, en la que se basó JUnit.
- TestNG , otro marco de pruebas para Java
- Objeto simulado , una técnica utilizada durante las pruebas unitarias.
- Mockito , una biblioteca de simulación para ayudar a escribir pruebas.
- EvoSuite , una herramienta para generar automáticamente pruebas JUnit.
- Lista de frameworks de Java
Citas
- ↑ "Lanzamientos de JUnit" . github.com . Consultado el 30 de diciembre de 2025 .
- ↑ "Cambiar licencia a EPL v2.0" . github.com . 7 de septiembre de 2017. Consultado el 4 de febrero de 2021 .
- 1 2 Gulati & Sharma 2017 , p. 144, §Capítulo 8 Pruebas dinámicas y migración desde JUnit 4.
- ↑ "Analizamos 30.000 proyectos de GitHub: estas son las 100 mejores bibliotecas en Java, JS y Ruby" . Archivado del original el 9 de julio de 2014. Consultado el 9 de febrero de 2014 .
- 1 2 3 4 Gulati y Sharma 2017 , págs. 37–40, Capítulo §2 API del ciclo de vida de JUnit.
- 1 2 Gulati y Sharma 2017 , pág. 99, Capítulo §6 Integración de herramientas.
- ↑ Gulati y Sharma 2017 , págs. 99–117, Capítulo §6 Herramientas de compilación.
- 1 2 3 Gulati y Sharma 2017 , págs. 108–112, Capítulo §6 Integración de herramientas - Herramientas de compilación - Ant.
- ↑ Gulati y Sharma 2017 , págs. 116–117, Capítulo §6 Integración de herramientas - Herramientas de compilación - Extensión Ant.
- 1 2 3 4 5 Gulati & Sharma 2017 , pp. 104–108, Capítulo §6 Integración de herramientas - Herramientas de compilación - Maven.
- 1 2 3 4 5 6 7 Gulati & Sharma 2017 , pp. 99–103, Capítulo §6 Integración de herramientas - Herramientas de compilación - Gradle.
- 1 2 Gulati & Sharma 2017 , p. 115, Capítulo §6 Integración de herramientas - Herramientas de compilación - Extensión Maven.
- ↑ Gulati y Sharma 2017 , págs. 113–114, Capítulo §6 Integración de herramientas - Herramientas de compilación - Extensión de Gradle.
- 1 2 Gulati y Sharma 2017 , pág. 121, Capítulo §7 Modelo de extensión JUnit 5.
- 1 2 3 4 5 6 7 8 Gulati y Sharma 2017 , págs. 121–122, Capítulo §7 Modelo de extensión JUnit 4.
- 1 2 3 4 Gulati y Sharma 2017 , págs. 122–124, Capítulo §7 Modelo de extensión JUnit 5 - Modelo de extensión JUnit 5.
- ↑ Gulati y Sharma 2017 , págs. 124–126, Capítulo §7 Modelo de extensión de JUnit 5: devoluciones de llamada del ciclo de vida de las pruebas.
- ↑ Gulati y Sharma 2017 , págs. 126–127, Capítulo §7 Modelo de extensión JUnit 5: posprocesamiento de instancias de prueba.
- ↑ Gulati y Sharma 2017 , pág. 127, Capítulo §7 Modelo de extensión de JUnit 5: ejecución de pruebas condicionales.
- ↑ Gulati y Sharma 2017 , pág. 129, Capítulo §7 Modelo de extensión JUnit 5 - Manejo de excepciones.
- ↑ Kent Beck . "Olor a montaje caro" . C2 Wiki . Consultado el 28 de noviembre de 2011 .
- 1 2 "Pruebas de escritura" . junit.org . Consultado el 4 de febrero de 2021 .
- 1 2 Gulati y Sharma 2017 , págs. 37-40, Capítulo §2 Comprensión de CoreJunit 5.
- ↑ «bliki: Xunit» . martinfowler.com . Consultado el 7 de marzo de 2022 .
- ↑ "JUnit" . mvnrepository.com . Consultado el 29 de octubre de 2021 .
- ↑ Kent Beck ; Erich Gamma . "JUnit Cookbook" . junit.sourceforge.net. Archivado del original el 15 de junio de 2020. Consultado el 21 de mayo de 2011 .
- ↑ Charles A. Sharp (agosto de 2007). "Migración de JUnit 3 a JUnit 4: solo buenas noticias" . Object Computing, Inc. Recuperado el 4 de febrero de 2021 .
Referencias
Enlaces externos
- Sitio web oficial
- Irriger, Axel. "JUnit - Herramienta de prueba unitaria de Java de código abierto" . Métodos y herramientas .
- "JUnit" . Memoria no encontrada . Tutoriales. Archivado del original el 28 de enero de 2015.
- Software multiplataforma
- Programación extrema
- Software libre programado en Java.
- Herramientas de desarrollo Java
- Java (plataforma de software)
- marcos de pruebas unitarias
- Software que utiliza la Licencia Pública de Eclipse.