Как правило, в современной промышленной разработке теоретическое доказательство верности программ (а) практически невозможно и (б) не требуется.
Что такое «теоретическое доказательство верности программ»?
В условиях, когда каждый тест перепроверяет функцию целиком, без знания о ее зависимостях и внутреннем устройстве, тест действительно сообщает, работает ли данная функция.
Однако, напоминаю, мы имеем дело с тестированием черного ящика, а значит, мы не знаем, будет ли использована функция is_german_letter. Но это знание играет решающую роль в выборе наборов входных данных, о которых говорилось выше.
Почему у вас входные данные зависят от реализации метода, а не наоборот? Почему имеет значение какой метод был вызван для получения ожидаемого тестом результата?
1. Ненаписанную функцию можно тестировать только как черный ящик
2. Ненаписанную функцию не стоит тестировать как черный ящик
Я вижу тут или противоречие, или «аргумент» против TDD.
Но при тестировании методом черного ящика, игнорируя возможное наличие классов эквивалентности, никаким нормальным образом выбрать эти примеры вы не сможете — их будет или слишком много, и будет делаться лишняя работа, или слишком мало, и тестирование будет не закончено.
Нормальным образом можно это зафиксировать написав все тесты строго до реализации.
Что такое «теоретическое доказательство верности программ»?
… и это действительно очень плохо.
Почему у вас входные данные зависят от реализации метода, а не наоборот? Почему имеет значение какой метод был вызван для получения ожидаемого тестом результата?
Я вижу тут или противоречие, или «аргумент» против TDD.
Нормальным образом можно это зафиксировать написав все тесты строго до реализации.