Я хотел бы спросить об использовании Unit Testing в веб-разработке. Идея Unit Testing отличная, но действительно ли она приносит пользу в контексте веб-приложения? Вторая часть моего вопроса касается TDD. Если вы создаете интеграционный тест, прежде чем фактический код может называться "Test Driven Development"?
1. Предположения
По определению Unit Test должен проверять код только на одном сервисном слое. Если тест тестирует код на нескольких уровнях, у нас есть тест интеграции.
2. Аргумент
2.1 Нет алгоритмов
В веб-приложении не так много алгоритмов. Это не похоже на создание движка 3D Physics, где каждый метод делает что-то сложное и трудное для отладки. Веб-приложение в основном связано с интеграцией и созданием HTML.
Самые большие проблемы для веб-приложения: - чистый код (универсальная проблема для любого программного обеспечения, но не проверяемая) - согласованность данных - интеграция (язык программирования, файловая система, файлы конфигурации, веб-сервер, системы кэширования, база данных, поисковая система, внешние API) - все эти системы должны работать вместе по запросу)
Если вы хотите построить Unit Test для каждого класса в веб-приложении, вы будете тестировать (в большинстве случаев): заполнять массивы, конкатенации строк и собственные функции языков.
2.2 Стоимость
Просто потому, что веб-приложение - это все о интеграции, всегда есть несколько зависимостей. Вы должны издеваться над многими разными классами, и писать даже небольшой тест может быть на самом деле большой работой. Что еще хуже, это не только тест. Программное обеспечение должно быть проверено. Это означает, что нужно иметь возможность вводить зависимости почти в каждом классе. Не всегда можно вводить зависимости без создания дополнительного слоя между двумя классами (или системами). Это усложняет код и делает его более дорогостоящим.
3. Тест интеграции
Если веб-разработка связана с интеграцией, почему бы не протестировать ее? Существует несколько аргументов счетчика.
3.1. Тест интеграции говорит, что "что-то сломано", но не говорит, где
Это действительно сводится к следующему: сколько времени требуется, чтобы найти ошибку, когда тест интеграции завершился неудачно по сравнению с временем, необходимым для создания кода "UnitTestable" и более сложным (я думаю, это субъективно)? По моему опыту, никогда не было времени найти источник проблемы.
3.2 Вы можете запустить Unit Test в любой среде, это трудно сделать с тестом интеграции
Да, если вы хотите запустить интеграционный тест без базы данных. Обычно есть база данных. До тех пор, пока вы работаете с данными об исправлении и чистят после каждого теста, это должно быть хорошо. Транзакционные базы данных идеально подходят для этой задачи. Откройте транзакцию, вставьте данные, проверьте, откат.
3.3 Интеграция Тесты трудно поддерживать
Я не могу прокомментировать это, потому что все мои тесты хорошо работают, и у меня никогда не было проблем с этим.
4. Создайте хорошие модульные тесты!
Весь аргумент может быть атакован с помощью "Если вы создаете право Unit Test, то у вас нет никаких проблем". Не может ли быть одинаковым с интеграционными тестами? Если проще создать интеграционный тест, почему бы не придерживаться его и не сделать это правильно?
Не поймите меня неправильно, я не против Unit Test. Это идеальная идея, и я рекомендую всем. Я пытаюсь понять: действительно ли это подходит для веб-разработки? Я хотел бы услышать ваши мнения и опыт.