Я обнаружил, что TDD работает плохо, когда речь идет о новых системах. Я разработчик видеоигр, и недавно использовал TDD для создания системы, которая использует несколько простых способов поведения для создания реалистичного движения объекта.
Например, есть поведения, ответственные за то, что вы уводили вас из опасных зон разных типов, и те, которые ответственны за то, что вы перемещали вас к интересным областям разных типов. Объединение результатов каждого поведения создает заключительное движение.
Внутренности системы были легко реализованы, и TDD был полезен для определения того, за что должна отвечать каждая подсистема.
Однако я столкнулся с проблемами, когда речь зашла о том, как поведенческие взаимодействия взаимодействуют, и что более важно, как они взаимодействуют с течением времени. Часто не было правильного ответа, и хотя мои первоначальные тесты проходили, QA могла продолжать находить крайние случаи, когда система не работала. Чтобы найти правильное решение, мне пришлось повторить несколько различных вариантов поведения, и если я обновлял тесты каждый раз, чтобы отразить новые варианты поведения, прежде чем проверять их работу в игре, я мог бы снова и снова выбрасывать тесты снова и снова. Поэтому я удалил эти тесты.
Возможно, мне следовало бы провести более сильные тесты, в которых были бы обнаружены крайние случаи, обнаруженные QA, но когда у вас есть такая система, которая работает на вершине многих систем физики и геймплея, и вы со временем сталкиваетесь с поведением, это становится чем-то вроде кошмар, чтобы точно указать, что происходит.
Я почти наверняка допустил ошибки в своем подходе, и, как я уже сказал, для внутренней системы TDD работал блестяще и даже поддерживал несколько оптимизирующих рефакторингов.