При исправлении ошибок рекомендуется, когда я работаю, сначала написать тест, который не удается выполнить с данной ошибкой, а затем исправить код, пока тест не пройдет. Это следует из практики TDD и должно быть хорошей практикой, но я заметил, что она имеет тенденцию создавать загадочные тесты, которые очень близки к реализации.
Например, у нас была проблема, когда работа была отправлена, достигла определенного состояния, была прервана и повторена. Чтобы воспроизвести эту ошибку, был написан массивный тест с синхронизацией потоков, множеством насмешек и прочего ... Он сделал свою работу, но теперь, когда я рефакторинг кода, я считаю очень заманчивым просто удалить этого мамонта, так как это действительно потребовало бы много работы (снова), чтобы соответствовать новому дизайну. И это просто тестирование одной небольшой функции в одном конкретном случае.
Отсюда мой вопрос: как вы проверяете наличие ошибок, которые сложно воспроизвести? Как избежать создания вещей, которые тестируют реализацию, а также ухудшают рефакторинг и читабельность?