Las pruebas unitarias tienen algo de mística en estos días. Las personas lo tratan como si el 100% de cobertura de prueba es un santo grial, y como si las pruebas unitarias fueran la única forma verdadera de desarrollar software.
Se están perdiendo el punto.
Las pruebas unitarias no son la respuesta. La prueba es.
Ahora, cada vez que surge esta discusión, alguien (a menudo incluso yo) trotará la cita de Dijkstra: "Las pruebas del programa pueden demostrar la presencia de errores, pero nunca demostrar su ausencia". Dijkstra tiene razón: las pruebas no son suficientes para demostrar que el software funciona según lo previsto. Pero es necesario : en algún nivel, debe ser posible demostrar que el software está haciendo lo que usted quiere.
Muchas personas prueban a mano. Incluso los entusiastas incondicionales de TDD harán pruebas manuales, aunque a veces no lo admitirán. No se puede evitar: justo antes de entrar a la sala de conferencias para demostrar su software a su cliente / jefe / inversores / etc., lo ejecutará a mano para asegurarse de que funcione. No hay nada de malo en eso, y de hecho sería una locura esperar que todo salga bien sin ejecutarlo manualmente, es decir, probarlo , incluso si tiene una cobertura de prueba de unidad del 100% y la máxima confianza en sus pruebas. .
Pero las pruebas manuales, aunque son necesarias para construir software, rara vez son suficientes . ¿Por qué? Porque las pruebas manuales son tediosas, requieren mucho tiempo y son realizadas por humanos. Y los humanos son notoriamente malos para realizar tareas tediosas y que consumen mucho tiempo: evitan realizarlas siempre que sea posible, y a menudo no las hacen bien cuando se ven obligados a hacerlo.
Las máquinas , por otro lado, son excelentes para realizar tareas tediosas y que consumen mucho tiempo. Para eso se inventaron las computadoras, después de todo.
Por lo tanto, las pruebas son cruciales, y las pruebas automatizadas son la única forma sensata de garantizar que sus pruebas se empleen de manera consistente. Y es importante probar y volver a probar a medida que se desarrolla el software. Otra respuesta aquí señala la importancia de las pruebas de regresión . Debido a la complejidad de los sistemas de software, con frecuencia los cambios aparentemente inocuos en una parte del sistema provocan cambios no deseados (es decir, errores) en otras partes del sistema. No puede descubrir estos cambios involuntarios sin alguna forma de prueba. Y si desea tener datos confiables sobre sus pruebas, debe realizarlas de manera sistemática, lo que significa que debe tener algún tipo de sistema de prueba automatizado.
¿Qué tiene que ver todo esto con las pruebas unitarias? Bueno, debido a su naturaleza, las pruebas unitarias son realizadas por la máquina, no por un humano. Por lo tanto, muchas personas tienen la falsa impresión de que las pruebas automatizadas equivalen a pruebas unitarias . Pero eso no es cierto: las pruebas unitarias son solo pruebas automatizadas extra pequeñas .
Ahora, ¿cuál es el valor en pruebas automatizadas extra pequeñas ? La ventaja es que prueban los componentes de un sistema de software de forma aislada , lo que permite una orientación más precisa de las pruebas y ayuda a la depuración . Pero las pruebas unitarias no significan intrínsecamente pruebas de mayor calidad . A menudo conduce a pruebas de mayor calidad, ya que cubre el software con un nivel de detalle más fino. Pero es posible probar completamente el comportamiento de solo un sistema completo, y no sus partes compuestas, y aún probarlo a fondo.
Pero incluso con una cobertura de prueba de unidad del 100%, es posible que un sistema aún no se pruebe a fondo. Debido a que los componentes individuales pueden funcionar perfectamente de forma aislada, aún fallan cuando se usan juntos. Por lo tanto , las pruebas unitarias, si bien son muy útiles, no son suficientes para garantizar que el software funcione como se espera. De hecho, muchos desarrolladores complementan las pruebas unitarias con pruebas de integración automatizadas, pruebas funcionales automatizadas y pruebas manuales.
Si no está viendo el valor en las pruebas unitarias, quizás la mejor manera de comenzar es utilizando un tipo diferente de prueba automatizada. En un entorno web, el uso de una herramienta de prueba de automatización del navegador como Selenium a menudo proporcionará una gran victoria para una inversión relativamente pequeña. Una vez que haya sumergido los dedos de los pies en el agua, podrá ver más fácilmente cuán útiles son las pruebas automatizadas. Y una vez que tiene pruebas automatizadas, las pruebas unitarias tienen mucho más sentido, ya que proporcionan una respuesta más rápida que una gran integración o pruebas de extremo a extremo, ya que puede enfocar las pruebas solo en el componente en el que está trabajando actualmente.
TL; DR: no se preocupe por las pruebas unitarias todavía. Solo preocúpese por probar su software primero.