Você está realmente perguntando "os testes de unidade teriam ajudado aqui?", Ou você está perguntando "algum tipo de teste poderia ter ajudado aqui?".
A forma mais óbvia de teste que teria ajudado é uma asserção de pré-condição no próprio código, de que um identificador de ramificação consiste apenas de dígitos (supondo que essa seja a suposição invocada pelo codificador ao escrever o código).
Isso pode ter falhado em algum tipo de teste de integração e, assim que os novos IDs de ramificação alfanuméricos são introduzidos, a asserção explode. Mas isso não é um teste de unidade.
Como alternativa, pode haver um teste de integração do procedimento que gera o relatório da SEC. Esse teste garante que todo identificador de filial real relate suas transações (e, portanto, requer entrada do mundo real, uma lista de todos os identificadores de filial em uso). Portanto, isso também não é um teste de unidade.
Não consigo ver nenhuma definição ou documentação das interfaces envolvidas, mas pode ser que os testes de unidade não tenham detectado o erro porque a unidade não estava com defeito . Se a unidade puder assumir que os identificadores de ramificação consistem apenas de dígitos, e os desenvolvedores nunca tomarem uma decisão sobre o que o código deve fazer caso não o faça, então eles não devemescreva um teste de unidade para impor um comportamento específico no caso de identificadores que não sejam dígitos, porque o teste rejeitaria uma implementação hipotética válida da unidade que manipulava corretamente os identificadores alfanuméricos de ramificação e você geralmente não deseja escrever um teste de unidade que impeça a validade futuras implementações e extensões. Ou talvez um documento escrito há 40 anos definido implicitamente (por meio de um intervalo lexicográfico no EBCDIC bruto, em vez de uma regra de classificação mais amigável ao ser humano) que 10B é um identificador de teste porque, na verdade, cai entre 089 e 100. Mas então Há 15 anos, alguém decidiu usá-lo como um identificador real; portanto, a "falha" não está na unidade que implementa corretamente a definição original: está no processo que não percebeu que 10B é definido como um identificador de teste e, portanto, não deve ser atribuído a uma ramificação. O mesmo aconteceria no ASCII se você definisse 089 - 100 como um intervalo de teste e, em seguida, introduzisse um identificador 10 $ ou 1,0. Acontece que no EBCDIC os dígitos vêm depois das letras.
Um teste de unidade (ou possivelmente um teste funcional) que é concebívelpode ter salvado o dia, é um teste da unidade que gera ou valida novos identificadores de filial. Esse teste afirmaria que os identificadores devem conter apenas dígitos e seria gravado para permitir que os usuários dos identificadores de ramificações assumissem o mesmo. Ou talvez exista uma unidade em algum lugar que importe identificadores de ramificação reais, mas nunca os veja, e que possa ser testada por unidade para garantir que rejeite todos os identificadores de teste (se os identificadores tiverem apenas três caracteres, poderemos enumerá-los todos e comparar o comportamento de o validador ao do filtro de teste para garantir que eles correspondam, o que lida com a objeção usual aos testes pontuais). Então, quando alguém mudasse as regras, o teste de unidade teria falhado, pois contradiz o novo comportamento exigido.
Como o teste foi realizado por um bom motivo, o ponto em que você precisa removê-lo devido a requisitos de negócios alterados torna-se uma oportunidade para alguém receber o trabalho ", encontre todos os lugares no código que se baseiam no comportamento que queremos mudança". É claro que isso é difícil e, portanto, pouco confiável, de modo algum garantiria salvar o dia. Mas se você capturar suas suposições em testes das unidades das quais você está assumindo propriedades, então você se deu uma chance e, portanto, o esforço não é totalmente desperdiçado.
Concordo, é claro, que se a unidade não tivesse sido definida em primeiro lugar com uma entrada "de formato engraçado", não haveria nada a ser testado. As divisões de espaço de nomes complicados podem ser difíceis de testar adequadamente, porque a dificuldade não está em implementar sua definição engraçada, mas em garantir que todos entendam e respeitem sua definição engraçada. Essa não é uma propriedade local de uma unidade de código. Além disso, alterar algum tipo de dados de "uma sequência de dígitos" para "uma sequência alfanumérica" é semelhante a fazer com que um programa baseado em ASCII manipule o Unicode: não será simples se o seu código estiver fortemente associado à definição original e quando o tipo de dados é fundamental para o que o programa faz, geralmente é fortemente associado.
é um pouco perturbador pensar que é um esforço amplamente desperdiçado
Se às vezes seus testes de unidade falharem (enquanto você está refatorando, por exemplo) e, ao fazer isso, fornecer informações úteis (sua alteração está errada, por exemplo), o esforço não foi desperdiçado. O que eles não fazem é testar se o seu sistema funciona. Portanto, se você estiver escrevendo testes de unidade, em vez de ter testes funcionais e de integração, poderá usar seu tempo de maneira otimizada.