¡Descubre GoogleTest, con certificación TÜV y la tecnología Agentic AI para pruebas de C/C++!
Obtenga los detalles »
Blog de Parasoft
Comprenda los conceptos básicos y amplíe su práctica de pruebas unitarias como un profesional con este tutorial.
Saltar a la sección
¿Quieres saltarte los conceptos básicos y ver cómo automatizar generación de pruebas unitarias mejorada con IA pasar de 0 a 60%+ de cobertura de código en <5 minutos? Echa un vistazo a Jtest >>
JUnit es el marco de pruebas unitarias de Java más popular. Un marco de código abierto, se utiliza para escribir y ejecutar pruebas automatizadas repetibles.
JUnit se consolidó como el estándar de facto para las pruebas unitarias de Java gracias a una combinación de funciones potentes y bien diseñadas que funcionan a la perfección. Fue el primer framework de pruebas unitarias desarrollado y se ha mantenido como la opción preferida por los desarrolladores de Java de todo el mundo gracias a sus características distintivas y su continua evolución.
Como ocurre con cualquier otra cosa, el marco de pruebas JUnit ha evolucionado con el tiempo.
JUnit 4.0 se lanzó en 2006, 5.0 se lanzó en 2017 y 6.0 se lanzó en septiembre de 2025.
A partir de febrero de 2026, la última versión es 6.0.2.
A continuación se muestran algunos de los aspectos y características clave de JUnit junto con las diferencias entre versiones:
| Característica/Aspecto | Unidad 4 | Unidad 5 | Unidad 6 |
|---|---|---|---|
| Año de lanzamiento original | 2006 | 2017 | 2025 |
| Arquitectura | Arquitectura monolítica con toda la funcionalidad en un solo jar | Proporciona 3 módulos: JUnit Platform (base para lanzar pruebas), JUnit Jupiter (API para escribir pruebas) y JUnit Vintage (ejecuta pruebas más antiguas) | Los tres módulos ahora comparten el mismo número de versión |
| Versión mínima de Java | 5 | 8 | 17 |
| Nombre de la prueba | El nombre del método sirve como nombre de la prueba | El @Nombre para mostrar La anotación permite nombres de pruebas descriptivos y legibles para humanos. | Igual que JUnit 5 |
| Configuración y desmontaje de pruebas | Proporciona anotaciones para configurar el estado antes de cada prueba o de todas las pruebas de una clase: @Antes, @Después, @AntesClase, @DespuésClase | Proporciona diferentes anotaciones para configurar el estado antes de cada prueba o de todas las pruebas de una clase: @AntesDeCada, @DespuésDeCada, @AntesDeTodos, @DespuésDeTodos | Igual que JUnit 5 |
| Aserciones | Proporciona métodos en org.junit.Afirmar Clase para verificar los resultados esperados. Si una aserción falla, las demás no se ejecutan. | Proporciona métodos en org.junit.jupiter.api.Assertions Clase con mensajes de error mejorados, incluidos asertAll () verificar múltiples afirmaciones a la vez, independientemente de si una de ellas falla. | Igual que JUnit 5 |
| Verificación de excepciones esperadas | Proporciona @Test(esperado = Excepción.clase) Anotación para verificar que se lanzó la afirmación, pero no se puede verificar el mensaje de excepción ni los detalles | Proporciona asertThrows () Método que permite afirmaciones detalladas sobre mensajes de excepción y detalles. | Igual que JUnit 5 |
| Verificación y cumplimiento del desempeño | Proporciona @Prueba(tiempo de espera = 1000) Anotación para afirmar que la prueba no se ejecuta más allá del tiempo esperado y para evitar que las pruebas se ejecuten infinitamente | Proporciona asertTimeout () y assertTimeoutPreemptively () métodos para afirmar el rendimiento de bloques de código específicos y @Se acabó el tiempo anotación para toda la prueba | Igual que JUnit 5 |
| Pruebas parametrizadas | Requiere corredor separado especificado por @RunWith(Parametrizado.clase) anotación dentro de una clase de prueba separada | Soporte de primera clase a través de @PruebaParametrizada anotación que permite mezclar pruebas parametrizadas con pruebas no parametrizadas | Utiliza un analizador CSV moderno para un mejor comportamiento y rendimiento. @CsvFuente y @CsvFileSource anotaciones |
| Deshabilitar pruebas | Proporciona @Ignorar anotación que omite la prueba silenciosamente | Proporciona @Discapacitado Anotación tanto para métodos de prueba individuales como para clases completas que permite informar un motivo | Igual que JUnit 5 |
| Pruebas anidadas | No se admite | Proporciona @Nested Anotación que habilita las clases de prueba internas para una mejor organización de las pruebas relacionadas | Pedido actualizado para @Nested clases que se declaran en la misma clase o interfaz envolvente |
| Agrupación de pruebas | Proporciona @Categoría Anotación para pruebas de grupo, pero requiere clases de corredor y categoría separadas | Proporciona @Etiqueta Anotación para agrupar pruebas mediante una etiqueta simple; no requiere un ejecutor independiente | Igual que JUnit 5 |
| Condiciones previas de la prueba | Proporciona métodos en Asumir Clase para controlar si la prueba se ejecuta en función de factores ambientales específicos | Proporciona un método de suposición mejorado Suposiciones.assumeThat() que permite un control detallado para ejecutar un bloque de código específico según el entorno | Igual que JUnit 5 |
| Personalización del comportamiento | Proporciona ejecutores y reglas para respaldar la personalización del comportamiento del marco de prueba, pero tienen algunas limitaciones. | Utiliza un único modelo de extensión flexible | Utiliza el mismo modelo de extensión que JUnit 5, pero se ha limpiado. |
| Compatibilidad al revés | Puede ejecutar pruebas JUnit 3 | Puede ejecutar pruebas JUnit 3 y 4 a través del motor Vintage | El motor Vintage todavía existe, pero está obsoleto. |
Estas características se combinan sinérgicamente para crear un marco completo y extensible que respalda las prácticas profesionales de desarrollo de software.
Así que vamos a sumergirnos en el tema. Estos son los pasos para configurar JUnit.
Los IDE más comunes, como Eclipse e IntelliJ, ya tendrán la integración de pruebas JUnit instalada de forma predeterminada.
Si no está utilizando un IDE y quizás confía únicamente en un sistema de compilación como Maven o Gradle, la configuración de JUnit se maneja a través del archivo pom.xml o build.gradle, respectivamente.
Es importante tener en cuenta que Unidad 5 se dividió en tres módulos, uno de los cuales es un módulo vintage que admite la ejecución de Unidad 4 y tres pruebas de Unidad 5.
Unidad 6 Mantiene esta arquitectura.
Unidad 3 El uso es muy bajo en este momento y generalmente solo se ve en proyectos mucho más antiguos.
Debido al diseño modular de JUnit 6, se utiliza una Lista de Materiales (POM) para importar todos los módulos y dependencias de JUnit. Si solo se necesitan módulos específicos, se pueden especificar grupos o artefactos individuales.
Para agregar JUnit 6 a Maven, agregue lo siguiente a pom.xml:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>6.0.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>6.0.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Para Gradle, agregue lo siguiente al archivo build.gradle:
dependencies {
testImplementation platform("org.junit:junit-bom:6.0.2")
testImplementation "org.junit.jupiter:junit-jupiter-api"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine"
testRuntimeOnly "org.junit.platform:junit-platform-launcher"
}
test {
useJUnitPlatform()
}
Debido al diseño modular de JUnit 5, se utiliza una Lista de Materiales (POM) para importar todos los módulos y dependencias de JUnit. Si solo se necesitan módulos específicos, se pueden especificar grupos o artefactos individuales.
JUnit 5 se configura de la misma manera que JUnit 6:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.14.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.14.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Para Gradle, agregue lo siguiente al archivo build.gradle:
dependencies {
testImplementation platform("org.junit:junit-bom:5.14.2")
testImplementation "org.junit.jupiter:junit-jupiter-api"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine"
testRuntimeOnly "org.junit.platform:junit-platform-launcher"
}
test {
useJUnitPlatform()
}
Para agregar JUnit 4 a Maven, agregue lo siguiente a pom.xml.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
Para Gradle, agregue lo siguiente a build.gradle:
dependencies {
testImplementation 'junit:junit:4.13.2'
}
test {
useJUnit()
}
Si necesita agregar JUnit manualmente a la ruta de clases para realizar pruebas, debe referenciar directamente los archivos jar sin procesar, aunque esto no suele ser necesario. JUnit 4, 5 y 6 tienen el archivo jar disponible para descargar directamente. Para JUnit 5 y 6, deberá descargar un archivo jar completo (también conocido como uberjar) como se describe. aquí.
Mejore las pruebas unitarias para Java con automatización: mejores prácticas para desarrolladores de Java
Ahora que hemos hablado un poco sobre la configuración de JUnit, pasemos a la construcción y ejecución de estas pruebas. Para ilustrar mejor la creación de JUnits, comenzaremos con algo básico. En el siguiente ejemplo de prueba JUnit, tenemos un método simple (izquierda) que convierte Fahrenheit a Celsius y una prueba JUnit (derecha) escrito para probar nuestro método. He numerado las partes clave de la prueba JUnit y discutiré cada parte en detalle a continuación.
Las partes 1 y 2 de la captura de pantalla anterior son importaciones para las clases y métodos de JUnit utilizados en la prueba unitaria. Las importaciones pueden especificarse como clases o métodos individuales, pero normalmente se especifican como paquetes completos mediante asteriscos. Cualquiera de las dos opciones funciona; el nivel de granularidad de las importaciones es una cuestión de preferencia.
La parte 3 define el inicio de nuestra clase de prueba. Es importante tener en cuenta la convención de nomenclatura utilizada para la clase, que es Prueba de nombre de clase. Esta convención de nomenclatura no es necesaria, pero es la forma más común de nombrar las clases JUnit porque el nombre describe de manera sucinta el propósito de la clase de prueba unitaria y qué clase está probando.
En la Parte 4, vemos nuestra primera sintaxis específica de JUnit: la anotación @Test. Las anotaciones son fundamentales al crear JUnits. Así es como el framework JUnit identifica las partes importantes de la prueba unitaria. En nuestro ejemplo, la anotación @Test indica a JUnit que el método público void al que está asociada puede ejecutarse como caso de prueba.
Hay muchas otras anotaciones, pero algunas de las más comunes para JUnit 5 y 6 son las siguientes.
Para la Parte 5, nuevamente, tenga en cuenta la convención de nomenclatura. nombre del método de prueba, donde nombreMétodo Es el nombre del método que se está probando en la clase bajo prueba. Esta convención de nomenclatura es común, pero no obligatoria. A veces se añade una descripción adicional al nombre para describir el comportamiento específico que verifica la prueba.
En la Parte 6, el Dado que los sección de la prueba, construimos una nueva instancia de la clase bajo prueba y la inicializamos según corresponda. Esto es necesario ya que el método de prueba necesita llamar al método bajo prueba para probarlo. En nuestro ejemplo, no se necesita ninguna otra inicialización más allá de instanciar la clase, pero en muchos casos, es posible que se deba realizar una configuración adicional, como inicializar objetos para pasar al constructor o llamar a métodos que configuran el estado de la clase bajo prueba.
En la Parte 7, el Al La sección de la prueba incluye la inicialización de variables que deben pasarse al llamar al método que se está probando y luego llamar al método de prueba (parte 8). Las variables deben recibir valores significativos que hagan que la prueba ejerza las partes del método de prueba que nos interesan. Tenga en cuenta que si una variable es un objeto, se puede crear una instancia o burlarse de ella.
En la Parte 8, si el método bajo prueba devuelve un valor, éste debe capturarse en una variable para que se pueda afirmar su valor.
Las pruebas unitarias solo son valiosas si incluyen aserciones que validen que el método probado devuelve el valor correcto o ajusta el estado de otros objetos según lo esperado. Sin aserciones, como se muestra en la Parte 9, no hay verificación. La prueba es, en el mejor de los casos, una prueba de humo que solo proporciona retroalimentación cuando se lanza una excepción.
Los métodos de aserción de JUnit, incluidos en la clase org.junit.jupiter.api.Assertions en JUnit 5 y 6, y en la clase org.junit.Assert en JUnit 4, se utilizan habitualmente para determinar el estado de aprobación o rechazo de los casos de prueba. El framework JUnit solo informa de las aserciones fallidas. Al igual que con las anotaciones, existen numerosas opciones de aserción.
En nuestro ejemplo JUnit anterior, usamos el método assertEquals (esperado, real, delta). El primer argumento es:
¡Elige tu propia aventura! Aquí veremos tres maneras de ejecutar JUnits:
Dentro del Explorador de paquetes, busque su prueba JUnit. Haga clic con el botón derecho y seleccione Ejecutar como > Prueba JUnit. Esto ejecutará su prueba e informará los resultados dentro de la vista JUnit Eclipse.
Ejecutar una prueba en IntelliJ es similar a Eclipse. En la ventana Proyecto, localice su prueba, haga clic con el botón derecho y seleccione Ejecutar 'testName'. Al igual que Eclipse, se abrirá una ventana JUnit con los resultados de la prueba.
Maven ha simplificado la ejecución de pruebas unitarias. Asegúrate de estar en la ubicación correcta en tu consola y de que el archivo pom.xml del proyecto esté configurado correctamente. A continuación, puedes ejecutar lo siguiente para ejecutar tus JUnits.
Para ejecutar todo el conjunto de pruebas:
mvn test
Para ejecutar una(s) prueba(s) única(s)/específica(s):
mvn -D test=TestName test
Gradle, al igual que Maven, ha simplificado la ejecución de pruebas.
Para ejecutar todo el conjunto de pruebas:
gradlew test
Para ejecutar una(s) prueba(s) única(s)/específica(s):
gradlew -D test.single=testName test
Nota: Maven y Gradle son sus propias bestias. Lo que se muestra aquí es mínimo para cubrir los conceptos básicos. Consulte su documentación si desea obtener más información.
Para ejecutar un JUnit directamente desde la línea de comandos, necesita algunas cosas:
La forma más sencilla de hacer esto en JUnit 5 y 6 es utilizar el iniciador de consola JUnit de la siguiente manera.
java -jar /path/to/junit-platform-console-standalone-<version>.jar execute -cp /path/to/source/classes -cp /path/to/test/classes <test class name>
Nota: La ejecución de una prueba desde la línea de comandos suele realizarse desde un proceso de CI/CD que se ejecuta en un sistema de compilación como Jenkins o Azure DevOps.
Nuestro ejemplo se ejecutó mediante una prueba unitaria simple, y por supuesto, esto es solo el comienzo de las pruebas unitarias. Los métodos más complejos que requieren prueba pueden llamar a métodos de clases dependientes o conectarse a sistemas externos como una base de datos. En estos casos, puede ser conveniente aislar el código mediante simulaciones.
La simulación ayuda a aislar unidades de código para que nuestras pruebas unitarias puedan centrarse solo en la clase/método específico que se está probando. El marco más común utilizado para burlarse en las pruebas JUnit es Mockito.
Para obtener más información sobre la burla, lea la publicación de mi colega: Cómo automatizar una prueba unitaria de Java, incluidas las burlas y las afirmaciones.
Si las pruebas unitarias son tan importantes, ¿por qué no se realizan de forma sistemática? A pesar de su importancia, no siempre son fáciles de implementar ni de mantener. Requieren un profundo conocimiento de desarrollo y un esfuerzo constante para mantener las suites de pruebas actualizadas. Como resultado, las pruebas unitarias suelen quedar relegadas a un segundo plano, hasta que se producen regresiones.
Pero no tiene por qué ser así.
Aquí es donde Parasoft jprueba Su Asistente de Pruebas Unitarias, impulsado por IA, fue diseñado para eliminar la fricción al escribir y mantener pruebas unitarias. Con solo unos clics, los equipos que comienzan con 0% cobertura de código Puede generar automáticamente conjuntos de pruebas robustos que cubran el 60 % o más de su código Java. Como uno empresa de servicios financieros señaló: "Desde que implementamos Parasoft Jtest, hemos reducido con éxito la cantidad de tiempo que lleva crear y mantener pruebas unitarias en más del 50%".
A continuación le mostramos cómo su equipo puede escalar su práctica de pruebas.
Si escribir y mantener pruebas JUnit le ha parecido una tarea ardua, es hora de modernizar su enfoque. Soluciones de pruebas optimizadas con IA como esta pueden convertir la creación de pruebas en una ventaja estratégica, permitiéndole dedicar más tiempo a desarrollar software de calidad.
Haga que las pruebas unitarias sean más fáciles y rápidas con Parasoft Jtest mejorado con IA.
Pruébelo usted mismo con una prueba gratuita de acceso completo durante 14 días.