¿Cuál es la diferencia entre integración y pruebas unitarias?

307

Conozco la llamada definición de libro de texto de pruebas unitarias y pruebas de integración. Lo que tengo curiosidad es cuando es hora de escribir pruebas unitarias ... Las escribiré para abarcar tantos conjuntos de clases como sea posible.

Por ejemplo, si tengo una Wordclase, escribiré algunas pruebas unitarias para la Wordclase. Luego, comienzo a escribir mi Sentenceclase, y cuando necesita interactuar con la Wordclase, a menudo escribo mis pruebas unitarias de manera que evalúen ambas Sentencey Word... al menos en los lugares donde interactúan.

¿Estas pruebas se han convertido esencialmente en pruebas de integración porque ahora prueban la integración de estas 2 clases, o es solo una prueba unitaria que abarca 2 clases?

En general, debido a esta línea incierta, rara vez escribiré pruebas de integración ... o estoy usando el producto terminado para ver si todas las piezas funcionan correctamente las pruebas de integración reales, a pesar de que son manuales y rara vez se repiten más allá del alcance de cada característica individual?

¿Estoy malinterpretando las pruebas de integración o realmente hay muy poca diferencia entre la integración y las pruebas unitarias?

Mike Stone
fuente

Respuestas:

300

La diferencia clave, para mí, es que las pruebas de integración revelan si una característica está funcionando o está rota, ya que enfatizan el código en un escenario cercano a la realidad. Invocan uno o más métodos o características de software y prueban si actúan como se esperaba.

Por el contrario, una prueba unitaria que prueba un único método se basa en la suposición (a menudo incorrecta) de que el resto del software funciona correctamente, ya que explícitamente se burla de cada dependencia.

Por lo tanto, cuando una prueba unitaria para un método que implementa alguna característica es verde, no significa que la característica esté funcionando.

Digamos que tiene un método en algún lugar como este:

public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  Log.TrackTheFactYouDidYourJob();
  return someResults;
}

DoSomethinges muy importante para su cliente: es una característica, lo único que importa. Es por eso que generalmente escribe una especificación de Pepino afirmando: desea verificar y comunicar que la función funciona o no.

Feature: To be able to do something
  In order to do something
  As someone
  I want the system to do this thing

Scenario: A sample one
  Given this situation
  When I do something
  Then what I get is what I was expecting for

Sin duda: si la prueba pasa, puede afirmar que está entregando una función de trabajo. Esto es lo que puede llamar valor comercial .

Si desea escribir una prueba unitaria para DoSomethingusted, debe fingir (usando algunas simulaciones) que el resto de las clases y métodos están funcionando (es decir, que todas las dependencias que el método está usando funcionan correctamente) y afirmar que su método está funcionando.

En la práctica, haces algo como:

public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  FakeAlwaysWorkingLog.TrackTheFactYouDidYourJob(); // Using a mock Log
  return someResults;
}

Puede hacer esto con la Inyección de dependencia, o con algún Método de fábrica o cualquier Marco simulado o simplemente extendiendo la clase bajo prueba.

Supongamos que hay un error en Log.DoSomething(). Afortunadamente, la especificación de Gherkin lo encontrará y sus pruebas de punta a punta fallarán.

La función no funcionará porque Logestá rota, no porque [Do your job with someInput]no esté haciendo su trabajo. Y, por cierto, [Do your job with someInput]es la única responsabilidad de ese método.

Además, suponga que Logse usa en otras 100 características, en otros 100 métodos de otras 100 clases.

Sí, 100 funciones fallarán. Pero, afortunadamente, 100 pruebas de extremo a extremo también fallan y revelan el problema. Y sí: dicen la verdad .

Es información muy útil: sé que tengo un producto roto. También es información muy confusa: no me dice nada sobre dónde está el problema. Me comunica el síntoma, no la causa raíz.

Sin embargo, DoSomethingla prueba de la unidad es verde, porque está usando un falso Log, construido para nunca romperse. Y sí: claramente está mintiendo . Está comunicando que una característica rota funciona. ¿Cómo puede ser útil?

(Si DoSomething()la prueba de la unidad falla, asegúrese de [Do your job with someInput]tener algunos errores).

Supongamos que este es un sistema con una clase rota: Un sistema con una clase rota

Un solo error romperá varias características y varias pruebas de integración fallarán.

Un solo error romperá varias características y varias pruebas de integración fallarán

Por otro lado, el mismo error romperá solo una prueba de unidad.

El mismo error romperá solo una prueba de unidad

Ahora, compara los dos escenarios.

El mismo error romperá solo una prueba de unidad.

  • Todas tus características que usan el roto Logson rojas
  • Todas las pruebas unitarias son verdes, solo la prueba unitaria Loges roja

En realidad, las pruebas unitarias para todos los módulos que usan una función rota son verdes porque, al usar simulacros, eliminaron las dependencias. En otras palabras, corren en un mundo ideal, completamente ficticio. Y esta es la única forma de aislar errores y buscarlos. Prueba de unidad significa burlarse. Si no te estás burlando, no estás haciendo pruebas unitarias.

La diferencia

Las pruebas de integración indican lo que no funciona. Pero no sirven para adivinar dónde podría estar el problema.

Las pruebas unitarias son las únicas pruebas que le dicen dónde está exactamente el error. Para extraer esta información, deben ejecutar el método en un entorno simulado, donde se supone que todas las demás dependencias funcionan correctamente.

Es por eso que creo que su oración "¿O es solo una prueba unitaria que abarca 2 clases" está de alguna manera desplazada? Una prueba unitaria nunca debe abarcar 2 clases.

Esta respuesta es básicamente un resumen de lo que escribí aquí: las pruebas unitarias mienten, por eso las amo .

Arialdo Martini
fuente
66
Una muy buena respuesta! Sin embargo, solo quiero agregar que la burla no es solo para pruebas unitarias. También podría ser muy útil en muchos casos de prueba de integración.
n
1
¡Gran respuesta! Simplemente no estoy de acuerdo con dos puntos: 1) que las pruebas de integración "no sirven para adivinar dónde podría estar el problema"; y 2) que "una prueba unitaria nunca debe abarcar 2 clases". Creé muchas pruebas de integración, y cuando se rompen, generalmente no es difícil determinar la fuente del problema, siempre que obtenga un seguimiento completo de la pila o una sola afirmación fallida (en cuyo caso puede ser más difícil encontrar la fuente, pero no tanto, ya que la prueba de integración proporciona un contexto contenido para la depuración). (continúa)
Rogério
55
Las pruebas unitarias pueden ejercer múltiples clases, siempre que no sean clases públicas que deberían tener sus propias pruebas unitarias separadas. Un caso es cuando una clase pública probada utiliza otras clases auxiliares no públicas que solo existen para admitir la clase pública; en este caso, la "unidad" comprende dos o más clases. Otro caso es que la mayoría de las clases usan clases de terceros (la clase String / string, clases de colección, etc.) que no tienen sentido para ser burladas o aisladas; simplemente los consideramos como dependencias estables y confiables que están fuera del alcance de la prueba.
Rogério
2
Con las pruebas de integración es un poco más difícil encontrar el problema raíz, pero aún así puede depurarlo y encontrar el problema raíz. Suponiendo que las pruebas unitarias no fallan con frecuencia, entonces tal vez rara vez tomará un poco más de tiempo corregir los errores si solo tiene pruebas de integración, pero luego obtiene el valor agregado de probar la integración de componentes también y le ahorra el tiempo de escritura la unidad prueba. Creo que esta afirmación (que vino de mi jefe) está mal, pero no estoy seguro de cómo puedo convencerlo, ¿alguna idea?
BornToCode
1
Por el razonamiento en esta respuesta, se podría argumentar que podría ser más efectivo omitir escribir pruebas unitarias y pasar el tiempo ahorrado al localizar la fuente de las pruebas de integración que fallan cuando fallan.
62

Cuando escribo pruebas unitarias, limito el alcance del código que se está probando a la clase que estoy escribiendo actualmente burlándose de las dependencias. Si estoy escribiendo una clase de Oración, y la Oración depende de Word, usaré una Palabra simulada. Al burlarme de Word, puedo concentrarme solo en su interfaz y probar los diversos comportamientos de mi clase de oración mientras interactúa con la interfaz de Word. De esta manera solo estoy probando el comportamiento y la implementación de Sentence y no al mismo tiempo probando la implementación de Word.

Una vez que he escrito las pruebas unitarias para asegurar que Sentence se comporta correctamente cuando interactúa con Word basado en la interfaz de Word, entonces escribo la prueba de integración para asegurarme de que mis suposiciones sobre las interacciones eran correctas. Para esto proporciono los objetos reales y escribo una prueba que ejercita una característica que terminará usando tanto Oración como Palabra.

Larry Foulkrod
fuente
43

Mis 10 bits: D

Siempre me dijeron que Unit Tests es la prueba de un componente individual , que debe ejercerse al máximo. Ahora, esto tiende a tener muchos niveles, ya que la mayoría de los componentes están hechos de partes más pequeñas. Para mí, una unidad es una parte funcional del sistema. Por lo tanto, tiene que proporcionar algo de valor (es decir, no un método para analizar cadenas, sino un HtmlSanitizer ).

Las Pruebas de integración son el siguiente paso: tomar uno o más componentes y asegurarse de que funcionen juntos como deberían. Entonces está por encima de las complejidades de la preocupación sobre cómo funcionan los componentes individualmente, pero cuando ingresa html en su HtmlEditControl , de alguna manera sabe mágicamente si es válido o no ...

Sin embargo, es una línea móvil real ... Prefiero centrarme más en hacer que el maldito código funcione por completo ^ _ ^

Rob Cooper
fuente
23

Las pruebas unitarias usan simulacros

De lo que estás hablando es de pruebas de integración que realmente prueban toda la integración de tu sistema. Pero cuando realiza pruebas unitarias, debe probar cada unidad por separado. Todo lo demás debe ser burlado. Entonces, en su caso de Sentenceclase, si usa Wordclase, entonces su Wordclase debe ser burlada. De esta manera, solo probará la Sentencefuncionalidad de su clase.

Robert Koritnik
fuente
Sé que esta es una publicación antigua, pero acabo de encontrarla. ¿Qué pasaría si tuvieras una tercera clase llamada Font con la que interactúa la clase Sentence y quieres probar la funcionalidad entre la clase Word y Sentence, entonces debes burlarte de la clase Font pero esto no lo convertirá en una prueba unitaria? Entonces, lo que digo es que el uso de simulacros no necesariamente lo convierte en una prueba unitaria, los simulacros también se pueden usar en pruebas de integración.
n
2
Por supuesto, se pueden usar simulacros en las pruebas de integración, pero para que una prueba de la unidad sea como tal, todo lo externo a la unidad debe simularse . Si las pruebas de integración usan simulacros, es probable que sean pruebas de integración parcial (si existe dicho término). Por supuesto, hay pruebas de integración parcial que son de arriba hacia abajo o de abajo hacia arriba. Los últimos generalmente no requieren simulacros mientras que los anteriores sí.
Robert Koritnik
17

Creo que cuando empiezas a pensar en las pruebas de integración, estás hablando más de un cruce entre capas físicas en lugar de capas lógicas.

Por ejemplo, si sus pruebas se preocupan por generar contenido, es una prueba unitaria: si su prueba se refiere solo a escribir en el disco, sigue siendo una prueba unitaria, pero una vez que prueba tanto la E / S como el contenido del archivo, entonces tienes una prueba de integración. Cuando prueba la salida de una función dentro de un servicio, es una prueba unitaria, pero una vez que realiza una llamada de servicio y ve si el resultado de la función es el mismo, entonces es una prueba de integración.

Técnicamente, de todos modos, no puede probar la unidad solo una clase. ¿Qué pasa si su clase está compuesta con varias otras clases? ¿Eso lo convierte automáticamente en una prueba de integración? No lo creo.

Jon Limjap
fuente
8
"Técnicamente, no puedes hacer una prueba unitaria de una sola clase de todos modos. ¿Qué pasa si tu clase está compuesta con varias otras clases?" Bueno, una prueba unitaria "estricta" simplemente se burlaría de todas las dependencias. Sin embargo, es discutible si esto siempre es práctico ...
sleske 03 de
2
Eso es verdadero sieske: lo importante es poder mantener las dependencias al mínimo absoluto.
Jon Limjap
-1, una prueba unitaria no prueba una sola característica, sino una sola función o clase de software, es decir, prueba una unidad lógica de software.
CharlesB
12

usando el diseño de responsabilidad individual, es blanco y negro. Más de 1 responsabilidad, es una prueba de integración.

Según la prueba del pato (apariencia, graznidos, waddles, es un pato), es solo una prueba unitaria con más de 1 objeto nuevo.

Cuando ingresa a mvc y lo prueba, las pruebas del controlador son siempre de integración, porque el controlador contiene tanto una unidad modelo como una unidad de vista. Probando la lógica en ese modelo, llamaría una prueba unitaria.

En desarrolloChris
fuente
10

La naturaleza de tus pruebas

Una prueba unitaria del módulo X es una prueba que espera (y busca) problemas solo en el módulo X.

Una prueba de integración de muchos módulos es una prueba que espera problemas que surjan de la cooperación entre los módulos, de modo que estos problemas serían difíciles de encontrar usando solo pruebas unitarias.

Piense en la naturaleza de sus pruebas en los siguientes términos:

  • Reducción de riesgos : para eso están las pruebas. Solo una combinación de pruebas unitarias y pruebas de integración puede proporcionarle una reducción total del riesgo, porque, por un lado, las pruebas unitarias no pueden inherentemente probar la interacción adecuada entre módulos y, por otro lado, las pruebas de integración pueden ejercer la funcionalidad de un módulo no trivial solamente en un pequeño grado
  • Prueba de esfuerzo de escritura : las pruebas de integración pueden ahorrar esfuerzo porque es posible que no necesite escribir apéndices / falsificaciones / simulacros. Pero las pruebas unitarias también pueden ahorrar esfuerzo, cuando implementar (y mantener) esos trozos / falsificaciones / simulacros resulta ser más fácil que configurar la configuración de prueba sin ellos.
  • Demora en la ejecución de la prueba : las pruebas de integración que involucran operaciones pesadas (como el acceso a sistemas externos como DB o servidores remotos) tienden a ser lentas (er). Esto significa que las pruebas unitarias pueden ejecutarse con mucha más frecuencia, lo que reduce el esfuerzo de depuración si algo falla, porque mientras tanto tiene una mejor idea de lo que ha cambiado. Esto se vuelve particularmente importante si utiliza el desarrollo basado en pruebas (TDD).
  • Esfuerzo de depuración : si falla una prueba de integración, pero ninguna de las pruebas unitarias lo hace, esto puede ser muy inconveniente, porque hay mucho código involucrado que puede contener el problema. Esto no es un gran problema si previamente ha cambiado solo unas pocas líneas, pero como las pruebas de integración se ejecutan lentamente, tal vez no las ejecutó en intervalos tan cortos ...

Recuerde que una prueba de integración aún puede eliminar algunas de sus dependencias. Esto proporciona mucho terreno intermedio entre las pruebas unitarias y las pruebas del sistema (las pruebas de integración más completas, que prueban todo el sistema).

Enfoque pragmático para usar ambos

Por lo tanto, un enfoque pragmático sería: confiar de manera flexible en las pruebas de integración tanto como sea posible y usar pruebas unitarias donde esto sería demasiado arriesgado o inconveniente. Esta forma de pensar puede ser más útil que alguna discriminación dogmática de las pruebas unitarias y las pruebas de integración.

Lutz Prechelt
fuente
10

En la prueba unitaria, prueba cada parte aislada: ingrese la descripción de la imagen aquí

en la prueba de integración, prueba muchos módulos de su sistema:

ingrese la descripción de la imagen aquí

y esto es lo que sucede cuando solo usas pruebas unitarias (generalmente ambas ventanas funcionan, desafortunadamente no juntas):

ingrese la descripción de la imagen aquí

Fuentes: Source1 source2

Michu93
fuente
Tienes tres imágenes pero solo dos fuentes.
gerrit
1
@gerrit eche un vistazo a la primera fuente - dos fotos son de allí
Michu93
1
Me encanta esta respuesta 👏
Dzenis H.
8

En mi opinión, la respuesta es "¿Por qué es importante?"

¿Es porque las pruebas unitarias son algo que haces y las pruebas de integración son algo que no haces? ¿O viceversa? Por supuesto que no, debes intentar hacer ambas cosas.

¿Es porque las pruebas unitarias deben ser rápidas, aisladas, repetibles, autovalidables y oportunas y las pruebas de integración no deberían? Por supuesto que no, todas las pruebas deberían ser estas.

¿Es porque usas simulacros en pruebas unitarias pero no los usas en pruebas de integración? Por supuesto no. Esto implicaría que si tengo una prueba de integración útil, no tengo permitido agregar un simulacro por alguna parte, por temor a tener que cambiar el nombre de mi prueba a "prueba unitaria" o entregarla a otro programador para que trabaje.

¿Es porque las pruebas unitarias prueban una unidad y las pruebas de integración prueban varias unidades? Por supuesto no. ¿De qué importancia práctica es eso? La discusión teórica sobre el alcance de las pruebas se rompe en la práctica de todos modos porque el término "unidad" depende completamente del contexto. A nivel de clase, una unidad puede ser un método. A nivel de ensamblaje, una unidad podría ser una clase, y en el nivel de servicio, una unidad podría ser un componente. E incluso las clases usan otras clases, entonces, ¿cuál es la unidad?

No tiene importancia.

Las pruebas son importantes, PRIMERO es importante, dividir los pelos sobre las definiciones es una pérdida de tiempo que solo confunde a los recién llegados a las pruebas.

David Sackstein
fuente
55
-1 La definición es lo que hace que las personas puedan usar los mismos términos sin explicar siempre lo que significan, y es esencial para la colaboración. Como tal, es esencial comprender la diferencia entre ambas nociones.
CharlesB
Como @CharlesB mencionó, es importante, por lo que no es necesario explicar todo el tiempo o descubrir que todos tienen una definición diferente que causa confusión. Las pruebas se escribirán de manera diferente y se ejecutarán de manera diferente, pero esto no sugiere que ambas no se deben hacer al querer definir las diferencias.
Shane
La conclusión de la respuesta puede ser extrema, pero la mayoría de sus puntos son bastante válidos: las pruebas unitarias y las pruebas de integración son en su mayoría lo mismo, excepto por su granularidad , y no es obvio dónde debe trazarse una línea entre ellas.
Lutz Prechelt
Esto no ayuda al crear un lenguaje común en un entorno profesional. Si bien en su mayoría tiene razón, no importa mucho, no tener un lenguaje común creará malentendidos y confusión entre el equipo. Creo que la mejor opción es que el equipo acuerde sus términos y definiciones.
user924272
4

Creo que todavía llamaría a un par de clases interactuantes una prueba unitaria siempre que las pruebas unitarias para la clase1 estén probando las características de la clase1, y las pruebas unitarias para la clase2 estén probando sus características, y también que no estén llegando a la base de datos.

Llamo a una prueba una prueba de integración cuando se ejecuta en la mayor parte de mi pila e incluso llega a la base de datos.

Realmente me gusta esta pregunta, porque la discusión TDD a veces me parece demasiado purista, y es bueno para mí ver algunos ejemplos concretos.

Lance Fisher
fuente
4

Hago lo mismo: las llamo todas las pruebas unitarias, pero en algún momento tengo una "prueba unitaria" que cubre tanto que a menudo lo renombro como ".. Prueba de integración", solo un cambio de nombre, nada más cambia.

Creo que hay una continuación de las "pruebas atómicas" (prueba de una clase pequeña o un método) a las pruebas unitarias (nivel de clase) y las pruebas de integración, y luego la prueba funcional (que normalmente cubre muchas más cosas de arriba hacia abajo) - No parece haber un corte limpio.

Si su prueba configura datos, y tal vez carga una base de datos / archivo, etc., entonces tal vez sea más una prueba de integración (las pruebas de integración que encuentro usan menos simulacros y más clases reales, pero eso no significa que no pueda burlarse de algunos del sistema).

Michael Neale
fuente
4

Las pruebas unitarias son un método de prueba que verifica que las unidades individuales del código fuente funcionan correctamente.

La Prueba de integración es la fase de prueba de software en la que los módulos de software individuales se combinan y prueban como un grupo.

Wikipedia define una unidad como la parte comprobable más pequeña de una aplicación, que en Java / C # es un método. Pero en su ejemplo de la clase de palabras y oraciones, probablemente solo escribiría las pruebas para la oración, ya que probablemente me resultaría excesivo usar una clase de palabras simuladas para probar la clase de oraciones. Entonces, la oración sería mi unidad y la palabra es un detalle de implementación de esa unidad.

grom
fuente
4

Pruebas de integración: se prueba la persistencia de la base de datos.
Pruebas unitarias: se burla el acceso a la base de datos. Los métodos de código son probados.

Pascal
fuente
3

Las pruebas unitarias son pruebas contra una unidad de trabajo o un bloque de código si lo desea. Generalmente realizado por un solo desarrollador.

Las pruebas de integración se refieren a la prueba que se realiza, preferiblemente en un servidor de integración, cuando un desarrollador confirma su código en un repositorio de control de origen. Las pruebas de integración pueden ser realizadas por utilidades como Cruise Control.

Entonces, realiza la prueba de la unidad para validar que la unidad de trabajo que ha creado funciona y luego la prueba de integración valida que lo que haya agregado al repositorio no haya roto otra cosa.

Christian Hagelid
fuente
2

Llamo pruebas unitarias a esas pruebas que la caja blanca prueba una clase. Cualquier dependencia que requiera la clase se reemplaza por una falsa (simulacro).

Las pruebas de integración son aquellas donde se prueban varias clases y sus interacciones al mismo tiempo. Solo algunas dependencias en estos casos son falsificadas / burladas.

No llamaría a las pruebas de integración de Controller a menos que una de sus dependencias sea real (es decir, no falsa) (por ejemplo, Autenticación IForms).

Separar los dos tipos de pruebas es útil para probar el sistema en diferentes niveles. Además, las pruebas de integración tienden a ser de larga duración, y se supone que las pruebas unitarias son rápidas. La distinción de velocidad de ejecución significa que se ejecutan de manera diferente. En nuestros procesos de desarrollo, las pruebas unitarias se ejecutan en el check-in (lo cual está bien porque son súper rápidas), y las pruebas de integración se ejecutan una / dos veces por día. Intento ejecutar las pruebas de integración tan a menudo como sea posible, pero generalmente golpeo la base de datos / escribo en los archivos / hago que los rpc / etc sean más lentos.

Eso plantea otro punto importante, las pruebas unitarias deben evitar golpear IO (por ejemplo, disco, red, base de datos). De lo contrario, se ralentizan mucho. Se necesita un poco de esfuerzo para diseñar estas dependencias de E / S: no puedo admitir que he sido fiel a la regla de "las pruebas unitarias deben ser rápidas", pero si lo es, los beneficios en un sistema mucho más grande se hacen evidentes muy rápidamente. .

CVertex
fuente
2

Explicación simple con analogías

Los ejemplos anteriores funcionan muy bien y no necesito repetirlos. Así que me enfocaré en usar ejemplos para ayudarlo a comprender.

Pruebas de integración

Las pruebas de integración verifican si todo funciona en conjunto. Imagine una serie de engranajes trabajando juntos en un reloj. Una prueba de integración sería: ¿el reloj indica la hora correcta? ¿Sigue diciendo la hora correcta en 3 días?

Todo lo que te dice es si la pieza en general está funcionando. Si falla: no te dice exactamente dónde está fallando.

Pruebas unitarias

Estos son tipos de prueba realmente específicos. Te dicen si una cosa específica está funcionando o no. La clave de este tipo de prueba es que solo prueba una cosa específica mientras se supone que todo lo demás está funcionando bien. Ese es el punto clave.

Ejemplo: desarrollemos este punto usando un ejemplo:

  • Tomemos un auto como ejemplo.
  • Prueba de integración para un automóvil: por ejemplo, ¿el automóvil conduce a Woop Woop y regresa? Si hace esto, puede decir con seguridad que un automóvil está funcionando desde un punto de vista general. Es una prueba de integración. Si falla, no tiene idea de dónde está fallando realmente: ¿es el radiador, la transmisión, el motor o el carburador? No tienes idea. Podría ser cualquier cosa.
  • Prueba de unidad para un automóvil: ¿funciona el motor? Esta prueba supone que todo lo demás en el automóvil funciona bien. De esa manera, si esta prueba de unidad en particular falla: puede estar muy seguro de que el problema radica en el motor, por lo que puede aislarlo y solucionarlo rápidamente.

Usando trozos

  • Suponga que la prueba de integración de su auto falla. No conduce con éxito a Echuca. ¿Dónde está el problema?

  • Ahora supongamos que su motor utiliza un sistema especial de inyección de combustible y que esta prueba de la unidad del motor también ha fallado. En otras palabras, tanto la prueba de integración como la prueba de la unidad del motor han fallado. ¿Dónde está entonces el problema? (Tómese 10 segundos para obtener la respuesta).

  • ¿Es el problema con el motor o con el sistema de inyección de combustible?

¿Ves el problema aquí? No sabes exactamente qué está fallando. Si usa diferentes dependencias externas, entonces cada una de esas 10 podría haber causado el problema, y ​​no sabrá por dónde empezar. Es por eso que las pruebas unitarias usan talones para suponer que todo lo demás está funcionando bien.

BKSpurgeon
fuente
1

Un poco académico esta pregunta, ¿no? ;-) Mi punto de vista: para mí, una prueba de integración es la prueba de toda la parte, no si dos de cada diez van juntas. Nuestra prueba de integración muestra si la compilación maestra (que contiene 40 proyectos) tendrá éxito. Para los proyectos tenemos toneladas de pruebas unitarias. Lo más importante con respecto a las pruebas unitarias para mí es que una prueba unitaria no debe depender de otra prueba unitaria. Entonces, para mí, ambas pruebas que describe arriba son pruebas unitarias, si son independientes. Para las pruebas de integración esto no necesita ser importante.

John Smithers
fuente
1

¿Estas pruebas se han convertido esencialmente en pruebas de integración porque ahora prueban la integración de estas 2 clases? ¿O es solo una prueba unitaria que abarca 2 clases?

Pienso que sí y sí. Su prueba de unidad que abarca 2 clases se convirtió en una prueba de integración.

Puede evitarlo probando la clase Sentence con implementación simulada: clase MockWord, que es importante cuando esas partes del sistema son lo suficientemente grandes como para ser implementadas por diferentes desarrolladores. En ese caso, Word se prueba solo en unidad, Sentence se prueba en unidad con la ayuda de MockWord y luego Sentence se prueba en integración con Word.

Se puede seguir un ejemplo de diferencia real 1) La matriz de 1,000,000 de elementos se prueba fácilmente en unidades y funciona bien. 2) BubbleSort se prueba fácilmente en unidades en una matriz simulada de 10 elementos y también funciona bien 3) Las pruebas de integración muestran que algo no está tan bien.

Si estas partes son desarrolladas por una sola persona, lo más probable es que se encuentren problemas al probar BubbleSoft solo porque el desarrollador ya tiene una matriz real y no necesita una implementación simulada.

Pavel Feldman
fuente
1

Además, es importante recordar que tanto las pruebas unitarias como las pruebas de integración se pueden automatizar y escribir utilizando, por ejemplo, JUnit. En las pruebas de integración JUnit, se puede usar la org.junit.Assumeclase para probar la disponibilidad de elementos del entorno (por ejemplo, conexión de base de datos) u otras condiciones.

Paulo Merson
fuente
0

Si eres un purista de TDD, escribes las pruebas antes de escribir el código de producción. Por supuesto, las pruebas no se compilarán, por lo que primero debe compilar las pruebas, luego hacer que las pruebas pasen.

Puede hacer esto con pruebas unitarias, pero no puede hacerlo con pruebas de integración o aceptación. Si intentara con una prueba de integración, ¡nada se compilaría hasta que haya terminado!

StevePoling
fuente