Integración versus pruebas unitarias
Debe mantener sus pruebas unitarias y sus pruebas de integración completamente separadas. Las pruebas unitarias deben probar una cosa y una sola y en completo aislamiento del resto de su sistema. Una unidad está poco definida pero generalmente se reduce a un método o una función.
Tiene sentido tener pruebas para cada unidad para que sepa que sus algoritmos se implementan correctamente e inmediatamente sabe qué salió mal dónde, si la implementación es defectuosa.
Dado que realiza pruebas en aislamiento completo mientras realiza pruebas unitarias, utiliza objetos de prueba y simulados para comportarse como el resto de su aplicación. Aquí es donde entran las pruebas de integración. Probar todas las unidades de forma aislada es excelente, pero es necesario saber si las unidades realmente funcionan juntas.
Esto significa saber si un modelo está realmente almacenado en una base de datos o si realmente se emite una advertencia después de que el algoritmo X falla.
Desarrollo dirigido por pruebas
Dando un paso atrás y observando el Desarrollo impulsado por pruebas (TDD), hay varias cosas a tener en cuenta.
- Escribe la prueba de la unidad antes de escribir el código que la hace pasar.
- Hace pasar la prueba, escribe el código suficiente para lograr esto.
- Ahora que la prueba pasa, es hora de dar un paso atrás. ¿Hay algo para refactorizar con esta nueva funcionalidad? Puede hacerlo de forma segura ya que todo está cubierto por pruebas.
Integración primero vs Integración último
Las pruebas de integración se ajustan a este ciclo TDD de una de dos maneras. Sé de personas que les gusta escribir de antemano. Llaman a una prueba de integración una prueba de extremo a extremo y definen una prueba de extremo a extremo como una prueba que prueba completamente la ruta completa de un caso de uso (piense en configurar una aplicación, arrancarla, ir a un controlador, ejecutarla, comprobando el resultado, salida, etc ...). Luego comienzan con su primera prueba de unidad, la aprueban, agregan una segunda, la aprueban, etc. Lentamente, más y más partes de la prueba de integración pasan también hasta que la función finaliza.
El otro estilo es construir una prueba de unidad de característica por prueba de unidad y agregar las pruebas de integración que se consideren necesarias después. La gran diferencia entre estos dos es que, en el caso de la prueba de integración, primero se ve obligado a pensar en el diseño de una aplicación. Esto no está de acuerdo con la premisa de que TDD se trata tanto del diseño de la aplicación como de las pruebas.
Practicidades
En mi trabajo tenemos todas nuestras pruebas en el mismo proyecto. Sin embargo, hay diferentes grupos. La herramienta de integración continua ejecuta primero lo que se marca como pruebas unitarias. Solo si estos tienen éxito, también se ejecutan las pruebas de integración más lentas (porque hacen solicitudes reales, usan bases de datos reales, etc.).
Por lo general, usamos un archivo de prueba para una clase por cierto.
Lectura sugerida
- Creciente software orientado a objetos, guiado por pruebas Este libro es un muy buen ejemplo de la primera metodología de prueba de integración
- El arte de las pruebas unitarias, con ejemplos en dot.net En pruebas unitarias, con ejemplos en dot.net: D Muy buen libro sobre los principios detrás de las pruebas unitarias.
- Robert C. Martin en TDD (artículos gratuitos): Lea también los dos primeros artículos que vinculó allí.