Я постоянно заинтригован разработкой, основанной на тестах, но я никогда не смогу с ней справиться, когда я пробую это по реальным проектам. У меня есть пара философских вопросов, которые возникают постоянно, когда я пытаюсь:
- Как вы обрабатываете большие изменения? Когда дело доходит до тестирования отдельных функций (некоторые параметры, значение результата, несколько побочных эффектов), TDD не требует больших усилий. Но как насчет того, когда вам нужно тщательно переделать что-то большое, например? переключение из библиотеки анализа SAX в библиотеку разбора DOM? Как вы придерживаетесь цикла тестирования-кода-рефактора, когда ваш код находится в промежуточном состоянии? После того, как вы начнете внесение изменений, вы получите множество неудачных тестов, пока не закончите капитальный ремонт (если вы не поддерживаете какой-то класс mongrel, который использует как DOM, так и SAX, пока вы не закончите конвертацию, но это довольно странно), Что происходит с малым шагом тестового кода-рефакторинга в этом случае? В течение всего этого процесса вы больше не будете двигаться на небольших, полностью проверенных шагах. Должно быть, люди с этим справляются.
- При тестировании GUI или кода базы данных с помощью mocks, что вы действительно тестируете? Mocks построены так, чтобы вернуть именно тот ответ, который вам нужен, и как вы знаете, что ваш код будет работать с реальной базой данных? В чем преимущества автоматических тестов для такого рода вещей? Это несколько улучшает доверие, но а) оно не дает вам такой же уверенности, что полный unit test должен, и b) в определенной степени, разве вы не просто проверяете, что ваши предположения работают с вашим кодом, а скорее чем ваш код работает с DB или GUI?
Может ли кто-нибудь указать мне на хорошие тематические исследования по использованию тестовой разработки в крупных проектах? Это расстраивает то, что я могу в основном найти только примеры TDD для отдельных классов.
Спасибо!