Las pruebas unitarias no solo facilitan el diseño, sino que es uno de sus beneficios clave.
La escritura de prueba primero elimina la modularidad y limpia la estructura del código.
Cuando escriba su código de prueba en primer lugar, encontrará que cualquier "condición" de una unidad de código dada se elimina naturalmente a las dependencias (generalmente a través de simulacros o talones) cuando las asume en su código.
"Dada la condición x, espere el comportamiento y", a menudo se convertirá en un apéndice para suministrar x
(que es un escenario en el que la prueba debe verificar el comportamiento del componente actual) y y
se convertirá en un simulacro, una llamada a la que se verificará al final de la prueba (a menos que sea un "debería devolver y
", en cuyo caso la prueba solo verificará el valor de retorno explícitamente).
Luego, una vez que esta unidad se comporta como se especifica, pasas a escribir las dependencias (para x
y y
) que has descubierto.
Esto hace que la escritura de código limpio y modular sea un proceso muy fácil y natural, donde de lo contrario a menudo es fácil confundir responsabilidades y unir comportamientos sin darse cuenta.
Escribir exámenes más tarde le dirá cuándo su código está mal estructurado.
Cuando escribir pruebas para un fragmento de código se vuelve difícil porque hay demasiadas cosas para tachar o simular, o porque las cosas están demasiado juntas, sabes que debes hacer mejoras en tu código.
Cuando el "cambio de pruebas" se convierte en una carga porque hay muchos comportamientos en una sola unidad, sabe que debe hacer mejoras en su código (o simplemente en su enfoque para escribir pruebas, pero este no suele ser el caso en mi experiencia).
Cuando tus escenarios se vuelven demasiado complicados ("si x
y y
y z
entonces ...") porque necesitas abstraer más, sabes que debes hacer mejoras en tu código.
Cuando terminas con las mismas pruebas en dos dispositivos diferentes debido a la duplicación y la redundancia, sabes que tienes que hacer mejoras en tu código.
Aquí hay una excelente charla de Michael Feathers que demuestra la estrecha relación entre la capacidad de prueba y el diseño en código (originalmente publicado por displayName en los comentarios). La charla también aborda algunas quejas comunes y conceptos erróneos sobre el buen diseño y la comprobabilidad en general.