it-swarm.dev

Exactamente qué es la prueba de integración, en comparación con la unidad

Estoy empezando a usar pruebas unitarias en mis proyectos, y estoy escribiendo pruebas que están probando a nivel de método/función.

Entiendo esto y tiene sentido.

Pero, ¿qué son las pruebas de integración? Por lo que leí, se mueve el alcance de la prueba para probar características más grandes de una aplicación.

Esto implica que escribo un nuevo conjunto de pruebas para probar cosas más grandes como (en un sitio de comercio electrónico) funcionalidad de pago, funcionalidad de inicio de sesión de usuario, funcionalidad de cesta. ¿Entonces aquí tendría 3 pruebas de integración escritas?

¿Es correcto? Si no, alguien puede explicar lo que significa.

Además, la prueba de integración involucra la interfaz de usuario (contexto de aplicación web aquí) y emplearía Selenium para automatizar. ¿O las pruebas de integración todavía están en el nivel del código pero vinculando clases de diferencia y áreas del código?.

31
Marty Wallace

Considere un método como este PerformPayment(double amount, PaymentService service);

Una prueba unitaria sería una prueba en la que crea un simulacro para el argumento service.

Una prueba de integración sería una prueba en la que utiliza un servicio externo real para probar si ese servicio responde correctamente a sus datos de entrada.

33
Knaģis

Las pruebas unitarias son pruebas de que el código probado está dentro de la clase real. Otras dependencias de esta clase se burlan o se ignoran, porque el foco es probar el código dentro de la clase.

Las pruebas de integración son pruebas que implican acceso a disco, servicio de aplicaciones y/o marcos desde la aplicación de destino . Las pruebas de integración se ejecutan aisladas de otros servicios externos.

Daré un ejemplo. Tiene una aplicación Spring e hizo muchas pruebas unitarias para garantizar que la lógica de negocios funciona correctamente. Perfecto. Pero qué tipo de pruebas tiene que garantizar:

  • Su servicio de aplicación puede comenzar
  • Su entidad de base de datos está asignada correctamente
  • Tienes todas las anotaciones necesarias trabajando como se esperaba
  • Su filtro funciona correctamente
  • Su API está aceptando algún tipo de datos.
  • Su característica principal es realmente trabajando en el escenario básico
  • Su consulta de base de datos funciona como se esperaba
  • Etc ...

Esto no se puede hacer con pruebas unitarias, pero usted, como desarrollador, debe garantizar que todo funcione también. Este es el objetivo de las pruebas de integración.

El escenario ideal son las pruebas de integración que se ejecutan independientemente de otros sistemas externos que la aplicación utiliza en un entorno de producción. Puede lograrlo usando llamadas Wiremock for Rest, una base de datos de memoria como H2, simulando beans de algunas clases específicas que llaman a sistemas externos, etc.

Un poco de curiosidad, Maven tiene un complemento específico para las Pruebas de integración: el maven failsafe plugin, que ejecuta clases de prueba con las que el nombre termina [~ # ~] es [~ # ~] . Ejemplo: UserIT.Java.

La confusión sobre lo que significa Prueba de integración

Algunas personas entienden la "prueba de integración" como una prueba que involucra la "integración" a otros sistemas externos que el sistema utiliza actualmente. Este tipo de pruebas solo se pueden realizar en un entorno en el que tenga todos los sistemas en funcionamiento para atenderlo. Nada falso, nada burlado.

Esto podría ser solo un problema de nomenclatura, pero tenemos una falta de pruebas (lo que entiendo como pruebas de integración) que atiende la necesidad de los elementos descritos anteriormente. Por el contrario, estamos saltando para una definición de pruebas unitarias (solo clase de prueba) a una prueba de "integración" (todo el sistema real está activo). Entonces, ¿qué hay en medio si no son las pruebas de integración?

Puede leer más sobre esta confusión en este artículo por Martin Fowler. Separa el término "pruebas de integración" en dos sentidos: las pruebas de integración "amplias" y "estrechas":

pruebas de integración estrecha

  • ejercer solo esa parte del código en mi servicio que habla con un servicio separado
  • utiliza dobles de prueba de esos servicios, ya sea en proceso o remotos
  • por lo tanto, consisten en muchas pruebas de alcance limitado, a menudo no más grandes que una prueba unitaria (y generalmente se ejecutan con el mismo marco de prueba que se usa para las pruebas unitarias)

pruebas de integración amplias

  • requieren versiones en vivo de todos los servicios, que requieren un entorno de prueba sustancial y acceso a la red
  • ejercer rutas de código a través de todos los servicios, no solo el código responsable de las interacciones
5
Dherik

La prueba de unidad es donde está probando su lógica de negocios dentro de una clase o un fragmento de código. Por ejemplo, si está probando que una sección particular de su método debe llamar a un repositorio, su prueba unitaria verificará para asegurarse de que el método de la interfaz que llama al repositorio se llame la cantidad correcta de veces que espera, de lo contrario falla la prueba.

Por otro lado, las pruebas de integración son pruebas de que el servicio real o el comportamiento del repositorio (base de datos) es correcto. Está comprobando que, en función de los datos que ingrese, recupere los resultados esperados. Esto se vincula con sus pruebas unitarias para que sepa qué datos debe recuperar y qué hace con esos datos.

1
Serberuss

Aquí hay un par de restricciones que una buena prueba de unidad satisface. Cumplir estas restricciones también requería un buen código comprobable.

  1. Sin E/S: disco o red
  2. Solo una afirmación (si es múltiple, deberían ser pequeñas variaciones entre sí)
  3. No ejerce (cubre) mucho más código de producción del que afirma

Estas restricciones generalmente no se aplican a las pruebas de integración.

0
ottodidakt

Por lo que veo, las pruebas de selenio deberían estar en otro conjunto de pruebas. Esas pruebas son las más frágiles en la naturaleza, incluso si las escribe correctamente. Aquí puede usar Specflow o algún otro tipo de especificación mediante un marco de ejemplo. Quizás pueda llamar a estas pruebas como pruebas de aceptación. Estos son también para desarrolladores y expertos en negocios. La integración o las pruebas de módulo normalmente no utilizan la interfaz de usuario. Las pruebas de integración ejercitan algunas clases que están trabajando juntas. Estas son pruebas de nivel más bajo que las pruebas de selenio, y un poco más fáciles de mantener. Estas pruebas son solo para desarrolladores.

0
pappati