Crear JUnit Conjunto de pruebas con ejemplo: @RunWith @SuiteClasses

โšก Resumen inteligente

JUnit Los conjuntos de pruebas agregan casos de prueba de varias clases para que se ejecuten juntos en una sola pasada, impulsados โ€‹โ€‹por las anotaciones @RunWith(Suite.class) y @SuiteClasses y lanzados a travรฉs de una clase de ejecutor de pruebas ordinaria.

  • ๐Ÿ”˜ Propรณsito: Agrupe las pruebas de varias clases en una sola unidad ejecutable, en lugar de ejecutar cada clase de prueba por separado.
  • โ˜‘๏ธ Anotaciones: @RunWith(Suite.class) delega la ejecuciรณn, mientras que @SuiteClasses enumera todas las clases que debe ejecutar el conjunto de clases.
  • โœ… Pasos: Escriba las clases de prueba, agregue una clase contenedora que contenga ambas anotaciones y luego ejecรบtela desde una JUnitCorredor principal.
  • ๐Ÿงช Ejemplo: El archivo JunitTest.java agrupa SuiteTest1 y SuiteTest2, y la consola informa que tres pruebas se han superado.
  • ๐Ÿ› ๏ธ JUnit 5: Jupiter reemplaza el ejecutor con @Suite mรกs @SelectClasses o @SelectPackages en el motor de suite de la plataforma.
  • ๐Ÿ“Œ Escollos: La mayorรญa de los fallos se deben a conjuntos de pruebas vacรญos, importaciones faltantes y una clase de conjunto de pruebas que contiene sus propios mรฉtodos @Test.

Crear un  JUnit Conjunto de pruebas con anotaciones @RunWith y @SuiteClasses

In JUnit, un conjunto de pruebas nos permite agregar todos Casos de prueba de varias clases en un solo lugar y ejecutarlas juntas.

Para ejecutar la prueba de conjunto, debe anotar una clase utilizando las anotaciones que se mencionan a continuaciรณn:

  1. @RunWith(Suite.class)
  2. @SuiteClasses(test1.class, test2.classโ€ฆ) o @Suite.SuiteClasses({test1.class, test2.classโ€ฆ})

Con las anotaciones anteriores, todas las clases de prueba del conjunto se ejecutarรกn una por una. La clase del conjunto permanece vacรญa: solo almacena las anotaciones, y el ejecutor las lee para decidir quรฉ ejecutar.

Pasos para crear un conjunto de pruebas y un ejecutor de pruebas

Los cuatro pasos que se describen a continuaciรณn permiten crear el conjunto de pruebas mรกs pequeรฑo que realmente se ejecuta: dos clases de prueba ordinarias, una clase de conjunto que les da nombre y un ejecutor que inicia el conjunto desde un mรฉtodo principal.

Paso 1) Crea una clase de prueba simple (por ejemplo, MyFirstClassTest) y agrega un mรฉtodo anotado con @Prueba.

La primera clase contiene un รบnico mรฉtodo de prueba vacรญo, lo cual es suficiente para demostrar que el conjunto de pruebas lo detecta:

Clase MyFirstClassTest en Eclipse declarando un myFirstMethod anotado con @Test

Paso 2) Crea otra clase de prueba para agregar (por ejemplo, MySecondClassTest) y crea un mรฉtodo anotado con @Test.

La segunda clase sigue exactamente la misma estructura, por lo que el conjunto tiene dos clases separadas para agregar:

Clase MySecondClassTest en Eclipse declarando un mySecondMethod anotado con @Test

Paso 3) Para crear un conjunto de pruebas, primero debe anotar la clase con @RunWith(Suite.class) y @SuiteClasses(class1.class, class2.classโ€ฆ).

Observe que la clase de suite TestSuiteExample no declara ningรบn mรฉtodo de prueba propio; las dos anotaciones contienen toda la informaciรณn:

TestSuiteExample anotado con @RunWith(Suite.class) y @SuiteClasses nombrando MyFirstClassTest y MySecondClassTest

Paso 4) Cree una clase Test Runner para ejecutar nuestro conjunto de pruebas como se indica a continuaciรณn:

El corredor es un simple Java clase con un mรฉtodo principal que pasa la clase de suite a JUnitNรบcleo:

Llamada a la clase del ejecutor de pruebas JUnitCore.runClasses en TestSuiteExample e imprimiendo la lista de errores.

Code Explicaciรณn:

  • Code Lรญnea 8: Declarando el mรฉtodo principal de la clase Test que ejecutarรก nuestro JUnit prueba.
  • Code Lรญnea 9: Ejecutar casos de prueba usando JUnitCore.runClasses que toma el nombre de la clase de prueba como parรกmetro (en el ejemplo anterior, estรก utilizando TestSuiteExample.class que se muestra en el paso 3).
  • Code Lรญnea 11: Procesar el resultado usando un bucle for e imprimir el resultado fallido.
  • Code Lรญnea 13: Imprimiendo el resultado exitoso.

Salida: Aquรญ estรก el resultado que muestra una prueba exitosa sin fallos. trace como se indica a continuaciรณn:

Eclipse JUnit Ver informes. Ejecuciones 2/2 sin errores ni fallos para TestSuiteExample.

La barra verde confirma para quรฉ sirve una suite: un lanzamiento, una vista de resultados y ambas clases se informan debajo del nodo de la suite en lugar de en dos ejecuciones separadas.

JUnit Ejemplo de conjunto de pruebas

Consideremos un ejemplo mรกs complejo, en el que las clases dentro del conjunto realmente... afirmar algo en lugar de contener un mรฉtodo vacรญo.

Prueba Junit.java

JunitTest.java es una clase simple anotada con el @Corre con y @Suite anotaciones. Puede enumerar cualquier nรบmero de clases del conjunto como parรกmetros, como se muestra a continuaciรณn:

package guru99.junit;		
import org.junit.runner.RunWith;		
import org.junit.runners.Suite;		

@RunWith(Suite.class)				
@Suite.SuiteClasses({				
  SuiteTest1.class,
  SuiteTest2.class,  			
})		

public class JunitTest {				
			// This class remains empty, it is used only as a holder for the above annotations		
}

SuiteTest1.java

SuiteTest1.java es una clase de prueba que tiene mรฉtodos de prueba que imprimen un mensaje, como se muestra a continuaciรณn. Utilizarรก esta clase como miembro de la suite en la clase mencionada anteriormente. Depende de una clase auxiliar llamada JUnitMensaje, que se define en otra parte del mismo paquete y no se reproduce aquรญ.

package guru99.junit;		

import static org.junit.Assert.assertEquals;				

import org.junit.Test;		

public class SuiteTest1 {				

    public String message = "Saurabh";							

    JUnitMessage junitMessage = new JUnitMessage(message);							

    @Test(expected = ArithmeticException.class)					
    public void testJUnitMessage() {					

        System.out.println("Junit Message is printing ");					
        junitMessage.printMessage();			

    }		

    @Test		
    public void testJUnitHiMessage() {					
        message = "Hi!" + message;							
        System.out.println("Junit Hi Message is printing ");					
        assertEquals(message, junitMessage.printHiMessage());					
        System.out.println("Suite Test 2 is successful " + message);							
    }		
}		

SuiteTest2.java

SuiteTest2.java es otra clase de prueba, similar a SuiteTest1.java, teniendo un mรฉtodo de prueba para imprimir un mensaje como se indica a continuaciรณn. Utilizarรก esta clase como miembro de la suite en Prueba Junit.java.

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Test;		

public class SuiteTest2 {				
   	

    @Test		
    public void createAndSetName() {					
        		

        String expected = "Y";					
        String actual = "Y";					

        Assert.assertEquals(expected, actual);					
        System.out.println("Suite Test 1 is successful " + actual);							
    }		

}		

Resultado

Despuรฉs de ejecutar Prueba Junit.java, que contiene un conjunto de herramientas SuiteTest1.java y SuiteTest2.javaObtendrรกs el siguiente resultado. La consola imprime los mensajes producidos por ambas clases:

Eclipse Consola que muestra los mensajes impresos de ambas clases de la suite despuรฉs de que finaliza JUnitTest.

El JUnit La vista registra la misma ejecuciรณn que tres mรฉtodos de prueba que pasan, agrupados bajo la clase suite:

Eclipse JUnit Ver informes. Ejecuciones 3/3 en verde para JUnitTest con SuiteTest1 y SuiteTest2 ampliadas.

Nota: Las etiquetas de la consola en este ejemplo estรกn cruzadas: la cadena impresa por SuiteTest1 dice "Suite Test 2" y la impresa por SuiteTest2 dice "Suite Test 1". Los listados originales se reproducen sin cambios, por lo que las etiquetas permanecen como las escribiรณ el autor; lea el nombre de la clase en la JUnit Se utiliza la vista previa en lugar de la etiqueta impresa al hacer coincidir la salida con la fuente.

Cรณmo crear un conjunto de pruebas en JUnit 5

JUnit 5 elimina los ejecutores por completo, por lo que @RunWith(Suite.class) no existe en los paquetes org.junit.jupiter. Las suites se movieron al JUnit Plataforma, que los envรญa en un artefacto separado llamado motor de suite de plataforma JUnit. Agrega esa dependencia, luego anota una clase con @Suite y una de las anotaciones de selector.

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("Guru99 suite")
@SelectClasses({ SuiteTest1.class, SuiteTest2.class })
public class JunitTest {
    // Empty holder, exactly as in JUnit 4
}

Las anotaciones de selector reemplazan la lista รบnica @SuiteClasses con una pequeรฑa familia de opciones:

Anotaciรณn Lo que selecciona
@SelectClasses Clases de prueba individuales nombradas una por una, el reemplazo directo de @SuiteClasses.
@SelectPackages Todas las clases de prueba del paquete mencionado y de todos sus subpaquetes.
@IncluirPatronesDeNombreDeClase Un filtro de expresiรณn regular aplicado sobre la selecciรณn.
@SuiteDisplayName En el informe se muestra un nombre legible en lugar del nombre de la clase.

En la prรกctica, importan dos diferencias mรกs. A JUnit La clase de suite 5 puede declarar los mรฉtodos @BeforeSuite y @AfterSuite, que se ejecutan una vez alrededor de toda la suite, y el JUnit 4 ejemplos anteriores todavรญa se ejecutan en el JUnit La plataforma funciona mediante el motor clรกsico, por lo que no es necesario reescribir el cรณdigo original de esta pรกgina para que siga funcionando.

Ventajas y limitaciones de JUnit Suites de prueba

Una suite es un grupoping mecanismo, no un marco de prueba Tiene su propia naturaleza, y eso determina tanto lo que hace bien como dรณnde deja de ser รบtil.

Ventajas

  • Un lanzamiento ejecuta clases relacionadas juntas, por lo que un conjunto de humo o un regresiรณn El proceso se inicia con un solo comando.
  • La vista de resultados agrupa todas las clases bajo un mismo nodo de suite, lo que facilita la detecciรณn de un fallo compartido.
  • La lista de miembros reside en el cรณdigo, por lo que se revisa y se versiona como cualquier otro archivo fuente.
  • La misma clase de suite se puede iniciar desde un IDE, desde un ejecutor como JUnitNรบcleo o desde una herramienta de compilaciรณn.

Limitaciones

  • @SuiteClasses es una lista codificada de forma fija, por lo que una nueva clase de prueba se omite silenciosamente hasta que alguien edita el conjunto de pruebas.
  • El paquete de clases no ofrece ninguna garantรญa de ordenaciรณn mรกs allรก del orden en que aparecen listadas.
  • No hay nada compartido entre las clases miembro, por lo que una suite no sustituye a un fixture ni a una clase base.
  • Las herramientas de compilaciรณn ya detectan las clases de prueba mediante convenciones de nomenclatura, lo que hace que un conjunto de pruebas sea redundante en muchos proyectos.

Errores comunes al crear un JUnit Banco de pruebas

La mayorรญa de los problemas con la suite generan un mensaje breve y poco รบtil. La tabla relaciona los mensajes que probablemente encontrarรก con su causa y soluciรณn.

Mensaje o sรญntoma Causa Soluciรณn
initializationError: No hay mรฉtodos ejecutables La clase se ejecuta como una clase de prueba ordinaria, pero solo contiene anotaciones. Agregue @RunWith(Suite.class) para que el ejecutor de suite tome el control en lugar del ejecutor predeterminado.
No se puede encontrar el sรญmbolo: clase Suite Falta la importaciรณn de Suite. Importa org.junit.runners.Suite junto con org.junit.runner.RunWith.
La suite se ejecuta, pero se omite una clase. La clase nunca se agregรณ a la lista @SuiteClasses. Agregue la clase explรญcitamente o muรฉvala a @SelectPackages en JUnit 5.
El compilador no acepta el nombre de la clase. @Runwith o @suiteClasses se escribieron con mayรบsculas y minรบsculas incorrectas. Java Las anotaciones distinguen entre mayรบsculas y minรบsculas: escriba @RunWith y @SuiteClasses exactamente como se indican.
Las pruebas en la propia clase de la suite nunca se ejecutan. Se agregรณ un mรฉtodo @Test al contenedor de la suite. Mantรฉn el contenedor vacรญo y mueve el mรฉtodo de prueba a una clase miembro.

Escribir la suite una vez y mantenerping Es preciso el trabajo real. Si la lista se desvรญa de las clases en el disco, el conjunto informa en verde mientras que parte de la prueba de unidad El conjunto nunca se ejecuta en absoluto, uno de los modos de fallo mรกs silenciosos en pruebas de software.

Preguntas Frecuentes

El paquete ejecuta las clases en el orden en que aparecen listadas, pero JUnit No ofrece ninguna garantรญa sobre el orden de los mรฉtodos dentro de cada clase. Las pruebas que dependen de que se haya ejecutado una prueba anterior son frรกgiles y deberรญan reescribirse para que funcionen de forma independiente.

Sรญ. Para el ejecutor, una clase de suite es una clase ordinaria, por lo que nombrarla dentro de otra lista @SuiteClasses permite anidar las suites. El anidamiento es รบtil para una suite de regresiรณn de nivel superior construida a partir de suites de mรณdulos mรกs pequeรฑos.

Los asistentes de IA leen las clases de prueba en el disco, las comparan con la lista @SuiteClasses y marcan las clases que nunca se agregaron. Tambiรฉn agrupan los fallos repetidos. traces por causa raรญz, lo que acorta el triaje despuรฉs de que un conjunto informa muchos rojos a la vez.

Copilot escribe el par de anotaciones rรกpidamente, pero con frecuencia mezcla JUnit 4 y JUnit Cinco importaciones en el mismo archivo. Comprueba que org.junit.runners.Suite y org.junit.platform.suite.api.Suite nunca aparezcan juntas, porque solo una de ellas coincide con tu ejecutor.

Agregue junit-platform-suite-engine al รกmbito de la prueba. Las anotaciones @Suite y @SelectClasses se encuentran en junit-platform-suite-api, que ese artefacto del motor incorpora de forma transitiva, por lo que normalmente basta con una sola dependencia.

Por lo general no. Surefire y el Gradle La tarea de prueba ya descubre las clases de prueba mediante un patrรณn de nombres y las ejecuta todas. Vale la pena escribir un conjunto de pruebas cuando se desea un subconjunto con nombre, como un conjunto de humo, que sea mรกs pequeรฑo que la ejecuciรณn completa.

El ejecutor informa de un error de inicializaciรณn para ese miembro, indicando que no se encontraron mรฉtodos ejecutables, y toda la suite se marca como fallida. Elimine la entrada o aรฑada un mรฉtodo @Test a la clase.

No dentro de una lista de selecciรณn. Mantรฉn el JUnit 4 clases en el motor antiguo y selecciรณnelas de una JUnit 5 suites por paquete, por lo que ambos motores se ejecutan bajo el mismo JUnit Lanzamiento de la plataforma sin mezclar familias de anotaciones.

Resumir este post con: