Ao corrigir bugs, é recomendável que eu trabalhe primeiro para escrever um teste que falhe com o bug especificado e, em seguida, para corrigir o código até que o teste passe. Isso segue as práticas de TDD e deve ser uma boa prática, mas notei que tende a produzir testes enigmáticos que se aproximam muito da implementação.
Por exemplo, tivemos um problema quando um trabalho foi enviado, atingiu um determinado estado, foi abortado e repetido. Para reproduzir esse bug, um teste maciço foi escrito com sincronização de threads, muitas zombarias e outras coisas ... Ele fez o trabalho, mas agora que refatoro o código, acho muito tentador remover esse mamute, já que realmente exigiria muito trabalho (novamente) para se ajustar ao novo design. E está apenas testando um pequeno recurso em um único caso específico.
Daí a minha pergunta: como você testa bugs difíceis de reproduzir? Como você evita criar coisas que testam a implementação e prejudicam a refatoração e a legibilidade?