Promueve la idea de que el código debe ser perfecto y que no deben existir errores
Definitivamente no. Promueve la idea de que sus pruebas no deben fallar, nada más y nada menos. Asumir que tener pruebas (incluso muchas de ellas) dice algo sobre "perfecto" o "sin errores" es una falacia. Decidir cuán superficiales o profundas deben ser sus pruebas es una parte importante de escribir buenas pruebas, y la razón por la que tenemos categorías de pruebas distintivamente separadas (pruebas de "unidad", pruebas de integración, "escenarios" en el sentido del pepino, etc.).
Es un desincentivo pensar en pruebas unitarias que fracasarán. O, sin duda, realizar pruebas unitarias que serían difíciles de solucionar.
En el desarrollo impulsado por pruebas, es obligatorio que cada prueba unitaria falle primero, antes de comenzar a codificar. Se llama "ciclo rojo-verde" (o "ciclo rojo-verde-refactorizador") por esta misma razón.
- Sin que falle la prueba, no sabe si el código es realmente probado por la prueba. Los dos podrían no estar relacionados en absoluto.
- Al cambiar el código para precisamente hacer la vuelta de prueba de rojo a verde, nada más y nada menos, puede estar bastante seguro de que el código hace lo que se supone que debe hacer, y no mucho más (que nunca puede asistir).
Si en algún momento todas las pruebas unitarias pasan, entonces no hay una imagen general del estado del software en ningún momento. No hay hoja de ruta / objetivo.
Las pruebas son más un micro objetivo. En el desarrollo basado en pruebas, el programador escribirá primero una prueba (singular) y luego tendrá un objetivo claro para implementar algún código; luego la siguiente prueba, y así sucesivamente.
La función de las pruebas no es estar completa antes de que se escriba el código.
Cuando se hace correctamente, en un idioma y con una biblioteca de prueba que se adapta bien a este enfoque, esto puede acelerar el desarrollo de forma masiva, ya que los mensajes de error (excepciones / seguimientos de pila) pueden apuntar directamente al desarrollador hacia dónde necesita realizar el trabajo próximo.
Disuade de escribir pruebas unitarias por adelantado, antes de la implementación.
No veo cómo esta afirmación sería cierta. Lo ideal es que las pruebas de escritura sean parte de la implementación.
¿Me estoy perdiendo de algo? ¿Por qué las organizaciones esperan que todas las pruebas unitarias pasen?
Porque las organizaciones esperan que las pruebas tengan relevancia para el código. Escribir pruebas que tengan éxito significa que ha documentado alguna parte de su aplicación y ha demostrado que la aplicación hace lo que dice (la prueba). Nada más y nada menos.
Además, una parte muy importante de tener pruebas es la "regresión". Desea poder desarrollar o refactorizar un nuevo código con confianza. Tener una gran cantidad de pruebas verdes le permite hacer eso.
Esto va de nivel organizacional a psicológico. Un desarrollador que sabe que es muy probable que sus errores sean atrapados por las pruebas será mucho más libre de encontrar soluciones inteligentes y audaces para los problemas que necesita resolver. Por otro lado, un desarrollador que no tiene pruebas, después de un tiempo, se detendrá (debido al miedo) porque nunca sabe si un cambio que hace rompe el resto de la aplicación.
¿No es esto vivir en un mundo de sueños?
No. Trabajar con una aplicación basada en pruebas es pura alegría, a menos que simplemente no le guste el concepto por cualquier razón ("más esfuerzo", etc., etc.) que podemos discutir en otra pregunta.
¿Y no disuade realmente una comprensión real del código?
Absolutamente no, ¿por qué lo haría?
Encontrará muchos proyectos grandes de código abierto (para los cuales la gestión de la "comprensión" y el conocimiento sobre el código es un tema muy apremiante) que realmente utilizan las pruebas como la documentación principal del software, además de ser pruebas, también proporciona ejemplos reales, funcionales y sintácticamente correctos para usuarios o desarrolladores de la aplicación / biblioteca. Esto a menudo funciona espléndidamente.
Obviamente, escribir malas pruebas es malo. Pero eso no tiene nada que ver con la función de las pruebas per se.