тут можно почитать первоисточники про TDD, т.к. современное понимание сильно извратилось и сузилось до «пиши тест перед кодом»
Не многие знают и помнят но TDD появлялся в том числе как та же самая "исполняемая спецификация" программы, на которой можно понимать что программа делает, и делает ли она это.
Дальнейшее ветвление привело к разным подходам, конкретно "договориться" о решении "на человеческом" перетекло в bdd и конкретно в cucmber (геркино-подобные решения), а чтобы работало и было понятно "на програмерском" в спеки разных сортов.
Но все это не имеет никакого сильного значения если ты понимаешь простую вещь о своей (любой) программе: это поток данных через интерфейсы компонентов.
cli интерфейс, cmd интерфейс, классовый / функциональный интерфейс, ui интерфейс, голосовой интерфейс абсолютли неважно - на каждый интерфейс подаются данные и что-то должно дальше моргнуить или нет.
Поэтому любой инфрейс покрыт тестом, в "контексте сценария" его "подергивания" кем-то или чем-то на предмет ожидаемого поведения (замеряемой реакции / изменения стейта ...).
И вот какие части этой программы - большие, маленькие, чужие или твои - все это не имеет значения.
Ориентируйся на интрефейсы (к компонентам) твоей программы и будет тебе счастье.