JUnit ErrorCollector @Rule con ejemplo

⚡ Resumen inteligente

JUnit ErrorCollector es una regla que permite que una prueba continúe ejecutándose después de un fallo, recopilando todos los objetos de error y reportándolos juntos una vez que el método de prueba finaliza, en lugar de detenerse.ping en el primer problema.

  • 🔘 Propósito: Tras un fallo en una aserción, una comprobación de red o una verificación de la interfaz gráfica de usuario, continúe la prueba e informe de todos los errores detectados a la vez.
  • ☑️ Declaración: @Rule en un campo ErrorCollector público no estático indica JUnit adjuntar la regla a cada prueba.
  • Recolección: addError(Throwable) almacena cualquier Error o Excepción, porque Throwable es el padre de ambos.
  • 🧪 Comprobación: La función checkThat() evalúa un comparador y registra una discrepancia sin interrumpir las instrucciones restantes.
  • 🛠️ Presentación de informes: La falla trace enumera cada objeto arrojadizo recolectado con su propio número de línea en el JUnit ver.
  • 📌 JUnit 5: En Jupiter ya no existen las reglas, por lo que assertAll() o las SoftAssertions de AssertJ cumplen la misma función.

JUnit Regla ErrorCollector que recopila varios errores en una sola ejecución de prueba.

En un escenario normal, siempre que identifique algún error durante la ejecución de la prueba, deberá detener la prueba, corregir el error y volver a ejecutarla.

Pero JUnit tiene un enfoque ligeramente diferente. Con el JUnit Gracias al recolector de errores, puede continuar con la ejecución de la prueba incluso después de que se detecte un problema o la prueba falle. El recolector de errores recopila todos los objetos de error y los informa solo una vez, una vez finalizada la ejecución de la prueba.

¿Por qué utilizar el recopilador de errores?

Al escribir un script de prueba, querrá ejecutar todas las pruebas incluso si alguna línea de código falla debido a una falla de red, una falla de aserción o cualquier otra razón. En esa situación, aún puede continuar ejecutando el script de prueba utilizando una función especial proporcionada por JUnit conocido como “recolector de errores”.

Para esto, JUnit utiliza el @Anotación de regla, que se utiliza para crear un objeto de recolector de errores. Una vez creado el objeto para el recolector de errores, puede agregar fácilmente todos los errores al objeto utilizando el método addError (error arrojable). Como sabes, Desechable es la superclase de la Excepción y Error clases en JavaCuando agregue errores de esta manera, estos errores se registrarán en el JUnit resultado de la prueba.

La ventaja de agregar todos los errores a un recopilador de errores es que se pueden verificar todos a la vez. Además, si el script falla a mitad de la ejecución, esta continúa hasta el final del método de prueba.

Nota: : En el caso de utilizar una simple aserción o un bloque try/catch, no será posible utilizar el método de recolección de errores.

Código de muestra

Para comprender mejor Error Collector, consulte el ejemplo de código a continuación, que muestra cómo crear un objeto Error Collector y agregar todos los errores a ese objeto. track el problema:

package guru99.junit;		

import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							
    collector.checkThat(getResults(),			
                not(containsString("here is an error")));			
    // all lines of code will execute and at the end a combined failure will		
    be logged in.		
    }		
}	

Nota: Este es un ejemplo ilustrativo.tract, no es un archivo compilable. Su comentario final se extiende a una segunda línea sin una // inicial, y getResults() más los comparadores de Hamcrest no se muestran. La versión completa ejecutable se encuentra a continuación. Ejemplo de uso de ErrorCollector.

¿Qué es @Rule en JUnit?

JUnit proporciona un tipo especial de manejo de pruebas, Caso de prueba o conjunto de pruebas mediante el uso del @Anotación de reglaUtilizando @Rule, puedes agregar o redefinir fácilmente el comportamiento de la prueba.

Existen varias reglas integradas proporcionadas por el JUnit API que un probador puede usar, y también puedes escribir tu propia regla. Un campo de regla debe ser público, no estático y de un tipo que implemente TestRule.

Vea la siguiente línea de código, que muestra cómo usar la anotación @Rule junto con el Recopilador de errores:

@Rule				
public ErrorCollector collector= new ErrorCollector();

JUnit Nota 5: Jupiter reemplazó las reglas con la API de extensión, por lo que @Rule y ErrorCollector no existen en org.junit.jupiter. Los equivalentes más cercanos son Assertions.assertAll() y AssertJ SoftAssertions. JUnit El código 4 que se muestra aquí todavía pasa por el motor antiguo. Vea el JUnit anotaciones Tutorial para el mapa completoping.

Ejemplo de uso de ErrorCollector

Para entender el recolector de errores, vamos a crear una clase y una regla para recopilar todos los errores. Aquí, agregarás todos los errores usando addError(throwable).

Vea el código a continuación, que simplemente crea una regla que no es más que un "objeto Recopilador de errores". Se utiliza además para agregar todos los errores con el fin de informar el problema al final:

ErrorCollectorExample.java

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							

        System.out.println("Hello");					
        try {			
            Assert.assertTrue("A " == "B");					
        } catch (Throwable t) {					
            collector.addError(t);					
        }		
        System.out.println("World!!!!");					
    }		
}		

PruebaRunner.java

Añadamos la clase de prueba anterior a un ejecutor de pruebas y ejecutémosla para recopilar todos los errores. Vea el código a continuación:

package guru99.junit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
      Result result = JUnitCore.runClasses(ErrorCollectorExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      

Salida:

Vea el fallo trace, cuál traces todos los errores en un solo lugar. El JUnit La vista contabiliza una ejecución, pero informa de dos errores y un fallo, cada uno con su propio número de línea:

Eclipse JUnit el fracaso trace enumerando dos errores Throwable y un AssertionError recopilados en una sola ejecución

Beneficios de la Cirugía de JUnit Colector de errores

Puedes utilizar una JUnit afirmación para validación funcional o de interfaz gráfica de usuario, por ejemplo:

  1. assertEquals(String message, Object expected, Object actual), que compara si dos objetos son iguales.
  2. De manera similar, afirmar Verdadero (condición booleana) afirma que una condición es verdadera.

Mediante las aserciones, las pruebas de validación se simplifican. Sin embargo, un problema importante es que la ejecución de las pruebas se detendrá incluso si falla una sola aserción.

La gestión de la continuidad y recuperación de las pruebas es crucial para el éxito de la automatización de pruebas, y es de suma importancia a largo plazo. Selenium En estos casos, reiniciar el navegador tras cada comprobación fallida resulta costoso. Error Collector es la mejor solución para gestionar este tipo de situaciones.

Preguntas Frecuentes

addError(Throwable) registra un error que ya hayas capturado o creado. checkThat(value, matcher) evalúa un comparador de Hamcrest y registra automáticamente una discrepancia, por lo que se lee como una aserción, pero permite que se ejecuten las instrucciones restantes.

Sí. El método se ejecuta hasta completarse y luego JUnit marca que falló e imprime cada objeto arrojadizo recolectado en el fallo. trace. La captura de pantalla de ejemplo muestra dos errores y un fallo en un único método de prueba.

JUnit Escanea la clase de prueba en busca de campos de instancia públicos anotados con @Rule y aplica cada uno de ellos alrededor de cada método de prueba. Un campo privado o estático se ignora y JUnit Genera un error de inicialización en lugar de ejecutar la prueba.

No. Jupiter eliminó el mecanismo de reglas, por lo que org.junit.rules.ErrorCollector existe solo en JUnit 4. Utilice Assertions.assertAll() para aserciones agrupadas, o añada AssertJ SoftAssertions cuando se necesiten comparadores más completos.

Sí, y es un patrón común. Una página con varios campos se puede validar en una sola pasada, registrando cada discrepancia en lugar de abortar al encontrar la primera, lo que evita reiniciar la sesión del navegador por cada defecto detectado.

Ambos retrasan la presentación de informes, pero SoftAssert requiere una llamada explícita a assertAll() al final de la prueba, mientras que ErrorCollector informa automáticamente cuando el método regresa. Olvidar assertAll() en TestNG oculta silenciosamente los fracasos.

Los asistentes de IA agrupan un fracaso prolongado trace por causa raíz, de modo que veinte errores recopilados se reducen a un puñado de defectos distintos. También sugieren qué comprobaciones deben agruparse en una misma ejecución en lugar de en pruebas separadas.

Copiloto de GitHub Escribe el campo @Rule fácilmente, pero a menudo lo mezcla con una clase de prueba de Jupiter donde no existen reglas. Confirme que las importaciones sean org.junit antes de ejecutar la suite.

Resumir este post con: