Quizás preguntar si es factible y razonable no son las preguntas más útiles para hacer. Probablemente la respuesta más práctica es la aceptada. Analizaré esto en un nivel más filosófico.
La cobertura del 100% sería ideal, pero idealmente, no sería necesaria o sería mucho más fácil de lograr. Prefiero pensar si es natural y humano que factible o razonable.
El acto de programar correctamente es casi imposible con las herramientas actuales. Es muy difícil escribir código que sea totalmente correcto y que no tenga errores. Simplemente no es natural. Entonces, sin otra opción obvia, recurrimos a técnicas como TDD y cobertura de código de seguimiento. Pero mientras el resultado final siga siendo un proceso antinatural, tendrá dificultades para lograr que las personas lo hagan de manera consistente y feliz.
Lograr una cobertura del 100% del código es un acto antinatural. Para la mayoría de las personas, obligarlos a lograrlo sería una forma de tortura.
Necesitamos procesos, herramientas, lenguajes y códigos que se correspondan con nuestros modelos mentales naturales. Si no lo hacemos, no hay forma de probar la calidad de un producto.
Solo mira todo el software que hay hoy en día. La mayor parte se estropea con bastante regularidad. No queremos creer esto. Queremos creer que nuestra tecnología es mágica y hacernos felices. Por eso, elegimos ignorar, disculpar y olvidar la mayoría de las veces que nuestra tecnología falla. Pero si hacemos una evaluación honesta de las cosas, la mayoría del software que existe hoy en día es bastante malo.
Aquí hay un par de esfuerzos para hacer que la codificación sea más natural:
https://github.com/jcoplien/trygve
https://github.com/still-dreaming-1/PurposefulPhp
El último es extremadamente incompleto y experimental. En realidad, es un proyecto que comencé, pero creo que sería un gran paso adelante para el arte de la programación si alguna vez pudiera dedicar el tiempo necesario para completarlo. Básicamente, es la idea de que si los contratos expresan los únicos aspectos del comportamiento de una clase que nos interesan, y ya estamos expresando los contratos como código, ¿por qué no solo tenemos las definiciones de clase y método junto con los contratos? De esa manera, los contratos serían el código, y no necesitaríamos implementar todos los métodos. Deje que la biblioteca descubra cómo cumplir los contratos para nosotros.