tenía esta misma pregunta, y después de leer los comentarios, esto es lo que ahora pienso (con el debido crédito a las respuestas anteriores):
creo que el problema puede ser que los dos nos tomamos el propósito aparente de la unidad pruebas - para probar que el código es correcto - y aplicado ese propósito a las pruebas mismas. Está bien hasta donde llegue, excepto el propósito de las pruebas unitarias no es demostrar que el código es correcto.
Al igual que con todos los esfuerzos no triviales, nunca puede estar 100% seguro. El propósito correcto de las pruebas unitarias es reducir los errores, no eliminarlos.Más específicamente, como otros han notado, cuando haces cambios más tarde eso podría romper algo accidentalmente. Las pruebas unitarias son solo una herramienta para reducir errores, y ciertamente no deberían ser las únicas. Idealmente, combina las pruebas unitarias con la revisión del código y el control de calidad sólido para reducir los errores a un nivel tolerable.
Las pruebas de unidad son mucho más simples que su código; no es posible hacer que su código sea tan simple como una prueba de unidad si su código hace algo significativo. Si escribe un código "pequeño, granular" que es fácil de probar correcto, entonces su código consistirá en una gran cantidad de funciones pequeñas, y aún tendrá que determinar si todas funcionan correctamente en concierto.
Como las pruebas unitarias son inevitablemente más simples que el código que están probando, es menos probable que tengan errores. Incluso si algunas de las pruebas de su unidad tienen errores, en general, mejorarán la calidad de su base de código principal. (Si las pruebas de su unidad son tan defectuosas que esto no es cierto, entonces es probable que su base de código principal también sea una pila humeante, y está completamente jodido. Creo que todos asumimos un nivel básico de competencia.)
Si NECESITA aplicar un segundo nivel de pruebas unitarias para comprobar que sus pruebas unitarias son correctas, puede hacerlo, pero está sujeto a rendimientos decrecientes. Para verlo de manera falsa numérica:
Suponga que las pruebas unitarias reducen el número de errores de producción en un 50%. Luego, escribe pruebas de metaunidades (pruebas unitarias para encontrar errores en las pruebas unitarias). Diga que esto tiene problemas con las pruebas de su unidad, lo que reduce la tasa de errores de producción al 40%. Pero llevó 80% de tiempo escribir las pruebas de metaunidad como lo hizo escribir las pruebas unitarias. Para el 80% del esfuerzo, solo obtuviste otro 20% de la ganancia. Tal vez escribir pruebas de meta-meta-unidades te da otros 5 puntos porcentuales, pero ahora nuevamente tomó el 80% del tiempo que tomó escribir las pruebas de la unidad meta, por lo que el 64% del esfuerzo de escribir las pruebas unitarias (que 50%) obtuviste otro 5%. Incluso con números sustancialmente más liberales, no es una forma eficiente de pasar su tiempo.
En este escenario, está claro que pasar el punto de escribir pruebas unitarias no vale la pena el esfuerzo.
Una vez más, ¿por qué incluso escribir la unidad de prueba? ¿Por qué no simplemente escribir nuggets simples de código y afirmar que "los métodos son simples, por lo que tienen una pequeña posibilidad de tener errores" –
Eso es lo que muchas personas intentan hacer. Sin embargo, a menos que seas un programador muy talentoso, a menudo es muy difícil escribir código tan simple y transparente. – mquander