Me gustaría comenzar a hacer más pruebas unitarias en mis aplicaciones, pero me parece que la mayoría de las cosas que hago no son adecuadas para la prueba unitaria. Sé cómo se supone que las pruebas unitarias funcionan en ejemplos de libros de texto, pero en aplicaciones del mundo real no parecen ser de mucha utilidad.Programas de pruebas unitarias que en su mayoría interactúan con recursos externos
Algunas aplicaciones que escribo tienen una lógica muy simple e interacciones complejas con cosas que están fuera de mi control. Por ejemplo, me gustaría escribir un daemon que reaccione a las señales enviadas por algunas aplicaciones y cambie algunas configuraciones de usuario en el sistema operativo. Puedo ver tres dificultades:
- primero Tengo que poder hablar con las aplicaciones y ser notificado de sus eventos;
- luego necesito interactuar con el sistema operativo cada vez que recibo una señal, a fin de cambiar la configuración de usuario adecuada;
- finalmente todo esto debería funcionar como daemon.
Todas estas cosas son potencialmente delicadas: tendré que buscar posiblemente API complejas y puedo introducir errores, por ejemplo, al interpretar mal algunos parámetros. ¿Qué pueden hacer las pruebas unitarias por mí? Puedo simular tanto la aplicación externa como el SO, y verificar que dada una señal de la aplicación, llamaré al método API apropiado en el SO. Esta es ... bueno, la parte trivial de la aplicación.
En realidad, la mayoría de las cosas que hago implican la interacción con bases de datos, el sistema de archivos u otras aplicaciones, y estas son las partes más delicadas.
Para otro ejemplo, mira my build tool PHPmake. Me gustaría refactorizarlo, ya que no está muy bien escrito, pero me temo que haré esto ya que no tengo pruebas. Entonces me gustaría agregar algunos. El punto es que las cosas que puede ser roto por la refactorización no pueden ser capturados por las pruebas unitarias:
- Una de las cosas que hacer es decidir qué cosas se van a construir y que uno ya están al día, y esto depende de la hora de la última modificación de los archivos. Esta vez en realidad es modificada por procesos externos, cuando se activa algún comando de compilación.
- Quiero estar seguro de que la salida de los procesos externos se muestra correctamente. Algunas veces los comandos buikd requieren alguna entrada, y eso también debe ser manejado correctamente. Pero no sé a priori qué procesos se ejecutarán, puede ser cualquier cosa.
- Alguna lógica está involucrada en la coincidencia de patrones, y esta puede parecer parte comprobable. Pero las funciones que hacen la coincidencia de patrones usan (además de su propia lógica) la función PHP
glob
, que funciona con el sistema de archivos. Si me burlo de un árbol en lugar del sistema de archivos real,glob
no funcionará.
Podría seguir con más ejemplos, pero el punto es el siguiente. A menos que tenga algunos algoritmos delicados, la mayor parte de lo que hago implica la interacción con recursos externos, y esto no es adecuado para las pruebas unitarias. Más que esto, a menudo esta interacción es en realidad la parte no trivial. Todavía muchas personas ven las pruebas unitarias como una herramienta básica. ¿Qué me estoy perdiendo? ¿Cómo puedo aprender a ser un mejor probador?
Vea también http://stackoverflow.com/questions/4980825/real-world-unit-tests – Raedwald