Beim Korrigieren von Fehlern wird empfohlen, zunächst einen Test zu schreiben, der mit dem angegebenen Fehler fehlschlägt, und dann den Code zu korrigieren, bis der Test bestanden ist. Dies folgt TDD-Praktiken und soll eine gute Praxis sein, aber ich habe festgestellt, dass es dazu neigt, kryptische Tests zu erstellen, die der Implementierung sehr nahe kommen.
Zum Beispiel hatten wir ein Problem, als ein Auftrag gesendet wurde, einen bestimmten Status erreichte, abgebrochen und erneut versucht wurde. Um diesen Fehler zu reproduzieren, wurde ein umfangreicher Test geschrieben, der Thread-Synchronisation, viele Verspottungen und ähnliches enthielt. Es hat funktioniert, aber jetzt, da ich den Code überarbeite, finde ich es sehr verlockend, dieses Mammut einfach zu entfernen es würde wirklich (wieder) viel Arbeit erfordern, um zum neuen Design zu passen. Und es wird nur eine kleine Funktion in einem bestimmten Fall getestet.
Daher meine Frage: Wie prüft man auf Bugs, die sich nur schwer reproduzieren lassen? Wie vermeiden Sie es, Dinge zu erstellen, die die Implementierung testen und Refactoring und Lesbarkeit beeinträchtigen?