Respuestas a tus preguntas
¿Existe tal cosa como tener demasiadas pruebas unitarias?
Claro ... Podría, por ejemplo, tener múltiples pruebas que parecen ser diferentes a primera vista pero que realmente prueban lo mismo (dependen lógicamente de las mismas líneas de código de aplicación "interesante" bajo prueba).
O podría probar las partes internas de su código que nunca salen a la superficie (es decir, que no forman parte de ningún tipo de contrato de interfaz), donde uno podría discutir si eso tiene sentido. Por ejemplo, la redacción exacta de los mensajes de registro internos o lo que sea.
Me encargaron escribir pruebas unitarias para una aplicación existente. Después de terminar mi primer archivo, tengo 717 líneas de código de prueba para 419 líneas de código original.
Eso me parece bastante normal. Sus pruebas emplean muchas líneas de código en la configuración y el desmontaje además de las pruebas reales. La relación puede mejorar o no. Yo mismo tengo muchas pruebas y, a menudo, invierto más loc y tiempo en las pruebas que el código real.
¿Esta relación se volverá inmanejable a medida que aumentemos la cobertura de nuestro código?
La relación no tiene mucho en cuenta. Hay otras cualidades de las pruebas que tienden a hacerlas inmanejables. Si regularmente tiene que refactorizar una gran cantidad de pruebas cuando realiza cambios bastante simples en su código, debe echar un vistazo a las razones. Y esas no son cuántas líneas tienes, sino cómo te acercas a la codificación de las pruebas.
Mi comprensión de las pruebas unitarias era probar cada método en la clase para asegurar que cada método funcionara como se esperaba.
Eso es correcto para las pruebas de "unidad" en sentido estricto. Aquí, "unidad" es algo así como un método o una clase. El punto de la prueba de "unidad" es probar solo una unidad de código específica, no todo el sistema. Lo ideal sería eliminar todo el resto del sistema (usando dobles o cualquier otra cosa).
Sin embargo, en la solicitud de extracción, mi líder técnico señaló que debería centrarme en las pruebas de nivel superior.
Luego caíste en la trampa de asumir que las personas realmente significaban pruebas unitarias cuando decían pruebas unitarias. He conocido a muchos programadores que dicen "prueba unitaria" pero quieren decir algo muy diferente.
Sugirió probar 4-5 casos de uso que se usan más comúnmente con la clase en cuestión, en lugar de probar exhaustivamente cada función.
Claro, solo concentrarse en el 80% superior del código importante también reduce la carga ... Aprecio que pienses mucho en tu jefe, pero esto no me parece la opción óptima.
Para mí, el 100% de cobertura de prueba unitaria es un objetivo elevado, pero incluso si solo alcanzáramos el 50%, sabríamos que el 100% de ese 50% estaba cubierto.
No sé qué es la "cobertura de prueba unitaria". Supongo que quiere decir "cobertura de código", es decir, después de ejecutar el conjunto de pruebas, cada línea de código (= 100%) se ha ejecutado al menos una vez.
Esta es una buena métrica de estadio, pero de lejos no es el mejor estándar para el que uno podría disparar. Simplemente ejecutar líneas de código no es la imagen completa; Esto no tiene en cuenta las diferentes rutas a través de ramas complicadas y anidadas, por ejemplo. Es más una métrica que apunta con el dedo a fragmentos de código que se prueban muy poco (obviamente, si una clase tiene una cobertura de código del 10% o 5%, entonces algo está mal); Por otro lado, una cobertura del 100% no le dirá si ha realizado pruebas suficientes o si las ha realizado correctamente.
Pruebas de integración
Me molesta sustancialmente cuando la gente habla constantemente de pruebas unitarias hoy, por defecto. En mi opinión (y experiencia), las pruebas unitarias son excelentes para bibliotecas / API; en áreas más orientadas a los negocios (donde hablamos de casos de uso como en la pregunta en cuestión), no son necesariamente la mejor opción.
Para el código de aplicación general y en el negocio promedio (donde ganar dinero, cumplir con los plazos y cumplir con la satisfacción del cliente es importante, y principalmente desea evitar errores que están directamente en la cara del usuario o que podrían conducir a desastres reales , no estamos hablando de los lanzamientos de cohetes de la NASA aquí), las pruebas de integración o características son mucho más útiles.
Esos van de la mano con el desarrollo dirigido por el comportamiento o el desarrollo basado en características; aquellos que no funcionan con pruebas unitarias (estrictas), por definición.
Para mantenerlo breve (ish), una prueba de integración / función ejercita toda la pila de aplicaciones. En una aplicación basada en la web, actuaría como un navegador que hace clic en la aplicación (y no, obviamente, no tiene que ser tan simplista, existen marcos muy potentes para hacer eso; consulte http: // pepino. io por ejemplo).
Ah, para responder a sus últimas preguntas: hace que todo su equipo tenga una cobertura de prueba alta asegurándose de que una nueva función solo se programe después de que su prueba de función se haya implementado y haya fallado. Y sí, eso significa cada característica. Esto le garantiza una cobertura de características del 100% (positiva). Por definición, garantiza que una característica de su aplicación nunca "desaparecerá". No garantiza una cobertura de código del 100% (por ejemplo, a menos que programe activamente funciones negativas, no ejercerá su manejo de errores / manejo de excepciones).
No le garantiza una aplicación libre de errores; por supuesto, querrá escribir pruebas de características para situaciones de errores obvias o muy peligrosas, entradas incorrectas del usuario, piratería (por ejemplo, administración de sesiones, seguridad y demás), etc .; pero incluso solo programar las pruebas positivas tiene un beneficio enorme y es bastante factible con marcos modernos y potentes.
Las pruebas de características / integración obviamente tienen su propia lata de gusanos (p. Ej., Rendimiento; pruebas redundantes de marcos de terceros; como generalmente no usas dobles, también tienden a ser más difíciles de escribir, según mi experiencia ...), pero yo ' d tome una aplicación 100% de prueba de características positivas sobre una aplicación 100% de prueba de unidad de cobertura de código (¡no biblioteca!) cualquier día.