Вы правы, компоновщик кажется мне немного больше, чем «юнит», и TDD не освобождает вас от необходимости сидеть и думать о том, как вы собираетесь разбить свою проблему на юниты. Сага о судоку - хорошая иллюстрация того, что пойдет не так, если вы сначала не думаете!
Концентрируясь на своей точке 1, вы уже описали хороший набор единиц (функциональных возможностей), перечисляя виды вещей, которые могут появляться в сегментах, и намекая, что вам необходимо поддерживать несколько форматов. Почему бы не начать с простого случая, такого как, скажем, файл, содержащий только сегмент данных в двоичном формате вашей платформы разработки? Вы можете просто жестко закодировать файл в виде двоичного массива в своем тесте, а затем проверить, правильно ли он интерпретирует. Затем выберите другой простой случай и проверьте его. Продолжай.
Теперь волшебная особенность заключается в том, что довольно скоро вы увидите повторяющиеся структуры в своем коде и в своих тестах, и, поскольку у вас есть тесты, вы можете быть довольно агрессивными в отношении рефакторинга. Я подозреваю, что это то, чего вы еще не испытали, потому что вы говорите: " Кажется, что либо тест слишком прост, и я легко взломал его до зеленого, либо он немного сложнее, и мне нужно реализовать весь считыватель формата объект / изображение / документ, в котором много кода. И нет никакого среднего уровня."Дело в том, что вы должны взломать их все до зеленого цвета, но когда вы это делаете вы также ищете шаблоны в ваших хаки.
Я написал (очень простой) компилятор таким образом, и он в основном работал довольно хорошо. Для каждой синтаксической конструкции я написал самую маленькую программу, о которой я мог подумать, которая использовала ее каким-то заметным образом, и заставил тест скомпилировать программу и убедиться, что она работает должным образом. Я использовал правильный генератор синтаксического анализатора, так как вы не можете правдоподобно использовать TDD в одном из них (вам нужно немного подумать!) После примерно трех циклов стало очевидно, что я повторял код для обхода синтаксического дерева, поэтому это было преобразовано в нечто вроде Посетителя.
У меня также были более масштабные приемочные тесты, но, в конце концов, я не думаю, что они поймали так много, как в модульных тестах.