Una parte fundamental de hacer sistemas incluye la de hacer pruebas. ¿Parece obvio no? Sin pruebas no puedes garantizar que estás haciendo un buen trabajo. Si no pruebas lo que haces, ¿vas a esperar a que tu usuario lo pruebe, o sea básicamente a que lo use pensando que es producto terminado, y le explote en la cara?
Una de las formas más inteligentes de hacer pruebas es automatizarlas. Por supuesto que se tienen que hacer muchos otros tipos de pruebas, pero las automatizadas deberían ir ahí. Sin sobrevalorarlas como para que sean las únicas que se hagan, y sin infravalorarlas como para hacer pocas. O peor, como para hacerlas MAL...
Imagina un nuevo modelo de auto. Como quizá sepan, los carros son probados en cuanto a su seguridad usando incluso unos curiosos muñecos, los Crash Test Dummies, que se montan en los autos y luego son estrellados. Supongo que estrellar autos debe ser divertido xD
Imagina ahora que la prueba está mal hecha, y no se detecta que quien conduce o acompaña en el vehículo podría morir en un accidente de cualquier tipo. NADIE querría eso. Bueno, lo mismo en un sistema. En especial TÚ, no quieres que se estrelle y te termine afectando.
Por eso es importante hacer pruebas, incluso las automatizadas, pero hacerlas BIEN.
Pues bien, hay una forma particular de hacer pruebas con sistemas que se asemeja mucho a usar dummies en carros... En algunos ámbitos les llaman mocks, pero en otros también les llaman curiosamente dummies...
Las pruebas con mocks consisten en sustituir funcionalidades de un sistema que no te interesa probar. Te interesa probar el carro y su seguridad, y no pones a un humano real a enfrentar un choque, usas un dummy, un mock que te ayude a saber como reacciona el carro y como le afecta al humano real si estuviera en su lugar.
Algo similar son los mocks. Sustituyen funcionalidad que no te interesa tocar al momento de probar, sólo te interesa como reacciona tu sistema ante esa funcionalidad externa. ¿Hasta aquí claros?
Bueno, pues hasta aquí todo bien...
Pero ahora imagina lo siguiente...
¿Qué pasaría si montas un muñeco dummy, en un carro de plástico, de juguete si quieres y pruebas qué pasa si éste se estrella? Evidentemente sería más divertido, y menos costoso de probar. Pero, ¿realmente dirías que has probado la seguridad del carro real luego de ver que el dummy salió ileso de dicha prueba? Evidentemente no.
Desafortunadamente, al probar sistemas con mocks, también existe una mala práctica similar. He visto esta prácitca varias veces, y pensar en los crash test dummies, además de una canción que sonaba cuando iba en secundaria, me hizo pensar en esta analogía.
Siempre que uses mocks, debes sustituir la funcionalidad EXTERNA a la función que quieres probar. Puede ser un webservice, puede ser un proceso que escribe archivos, o manda correos. Puede ser simplemente una función distinta a la que pruebas, código que simplemente NO ES el que probarás.
Pero lo que no debes hacer, es hacerle mock a la función que estás probando. ¿Por qué? Pues porque sencillamente, si esto fuera un juego, sería como hacer trampa. Es lograr que tu prueba funcione siempre, nunca truene y no sepas si realmente tiene un problema. Es como montar un dummy a un coche de juguete, ver que nadie sale herido, y lanzar tu coche a producción, pensando que la prueba salió perfecta, cuando ni prueba era...
Por favor, no hagas eso...
Mmm Mmm Mmm Mmm...