¿Realmente está preguntando, "las pruebas unitarias habrían ayudado aquí?", O está preguntando, "¿podría algún tipo de prueba haber ayudado aquí?".
La forma más obvia de prueba que habría ayudado es una afirmación previa en el código mismo, de que un identificador de rama consta solo de dígitos (suponiendo que este es el supuesto en el que se basa el codificador para escribir el código).
Esto podría haber fallado en algún tipo de prueba de integración, y tan pronto como se introducen los nuevos identificadores de ramificación alfanuméricos, la afirmación explota. Pero esa no es una prueba unitaria.
Alternativamente, podría haber una prueba de integración del procedimiento que genera el informe SEC. Esta prueba garantiza que cada identificador de sucursal real informe sus transacciones (y, por lo tanto, requiere una entrada del mundo real, una lista de todos los identificadores de sucursal en uso). Así que tampoco es una prueba unitaria.
No puedo ver ninguna definición o documentación de las interfaces involucradas, pero puede ser que las pruebas unitarias no puedan haber detectado el error porque la unidad no estaba defectuosa . Si se permite que la unidad asuma que los identificadores de sucursal consisten solo en dígitos, y los desarrolladores nunca tomaron una decisión sobre qué debería hacer el código en caso de que no lo hiciera, entonces no deberíanescriba una prueba unitaria para imponer un comportamiento particular en el caso de identificadores que no sean dígitos porque la prueba rechazaría una implementación hipotética válida de la unidad que manejó correctamente los identificadores de rama alfanuméricos, y generalmente no desea escribir una prueba unitaria que impida futuras implementaciones y extensiones. O tal vez un documento escrito hace 40 años implícitamente definido (a través de algún rango lexicográfico en EBCDIC sin procesar, en lugar de una regla de clasificación más amigable para los humanos) que 10B es un identificador de prueba porque de hecho cae entre 089 y 100. Pero entonces Hace 15 años, alguien decidió usarlo como un identificador real, por lo que la "falla" no reside en la unidad que implementa correctamente la definición original: se encuentra en el proceso que no se dio cuenta de que 10B se define como un identificador de prueba y, por lo tanto, no debe asignarse a una rama. Lo mismo sucedería en ASCII si definiera 089-100 como un rango de prueba y luego introdujera un identificador 10 $ o 1.0. Simplemente sucede que en EBCDIC los dígitos vienen después de las letras.
Una prueba unitaria (o posiblemente una prueba funcional) que posiblementepodría haber salvado el día, es una prueba de la unidad que genera o valida nuevos identificadores de rama. Esa prueba afirmaría que los identificadores deben contener solo dígitos y se escribirían para permitir que los usuarios de los identificadores de rama asuman lo mismo. O tal vez hay una unidad en algún lugar que importa identificadores de rama reales pero nunca ve los de prueba, y eso podría probarse de forma unitaria para garantizar que rechaza todos los identificadores de prueba (si los identificadores son solo tres caracteres, podemos enumerarlos todos y comparar el comportamiento de el validador al del filtro de prueba para asegurarse de que coinciden, que se ocupa de la objeción habitual a las pruebas puntuales). Luego, cuando alguien cambió las reglas, la prueba unitaria habría fallado ya que contradice el comportamiento recién requerido.
Dado que la prueba estuvo allí por una buena razón, el punto en el que debe eliminarlo debido a los requisitos comerciales cambiados se convierte en una oportunidad para que alguien reciba el trabajo ", encuentre cada lugar en el código que se base en el comportamiento que queremos cambio". Por supuesto, esto es difícil y, por lo tanto, poco confiable, por lo que de ninguna manera garantizaría salvar el día. Pero si captura sus suposiciones en las pruebas de las unidades de las que está asumiendo propiedades, entonces se ha dado una oportunidad y, por lo tanto, el esfuerzo no se desperdicia por completo .
Por supuesto, estoy de acuerdo en que si la unidad no se hubiera definido en primer lugar con una entrada de "forma divertida", entonces no habría nada que probar. Las divisiones de espacio de nombres complicadas pueden ser difíciles de probar correctamente porque la dificultad no radica en implementar su definición divertida, sino en asegurarse de que todos entiendan y respeten su definición divertida. Esa no es una propiedad local de una unidad de código. Además, cambiar algún tipo de datos de "una cadena de dígitos" a "una cadena de caracteres alfanuméricos" es similar a hacer que un programa basado en ASCII maneje Unicode: no será simple si su código está fuertemente acoplado a la definición original, y cuando el tipo de datos es fundamental para lo que hace el programa, entonces a menudo está fuertemente acoplado.
es un poco inquietante pensar que es un esfuerzo en gran medida desperdiciado
Si las pruebas unitarias a veces fallan (mientras está refactorizando, por ejemplo), y al hacerlo le brindan información útil (su cambio es incorrecto, por ejemplo), entonces el esfuerzo no se desperdició. Lo que no hacen es probar si su sistema funciona. Entonces, si está escribiendo pruebas unitarias en lugar de tener pruebas funcionales y de integración, entonces puede estar usando su tiempo de manera subóptima.