Не первый год читаю, что юнит-тесты это круто. Однако я не понимаю, чем они могут помочь в реальных проектах.
Сейчас у меня ощущение, что я напишу очень много тестов, потрачу уйму времени, но толку не будет.
Или что нужно предусмотреть всё, но если предусмотрел то зачем собственно тест?
Приведу примеры.
- Вместо одного события произошла масса событий, например пользователь натыкал быстро и потягал элементы, плюс пришли какие-то ответы ajax.
Итак произошло много вызовов разных функций вперемешку. Я предусмотреть не смог. Как юнит-тест мне поможет если я не догадывался о таких событиях?
- Шрифт в браузере отрендерился позже обычного, и я не предусмотрел что его габариты будут нулевыми в момент срабатывания функции.
Как я мог не зная такой особенности и не предполагая её написать тест? Неужели каждой строчке JS-кода нужно не доверять?
- Приложение запускается сложным образом, обращаясь в гугл-фонтс, к "собственному" серверу, создавая многочисленные экземпляры...
Как юнит-тест сможет запустить весь процесс и отследить все ошибки с учетом всех ситуаций?
Например как в определенный момент при определенном ответе гугла тест покажет ошибку? Именно в сложном процессе запуска приложения, а не просто на отдельной лёгкой функции.
Головой нужно думать, и понимать, юнит-тест не "запускает весь процесс" по определению, если весь процесс, то это функциональный тест, в некоторых случаях достаточно функционального тестирования.
То, что вы описали никак не относится к юнит-тестам. Это все интеграционное (функциональное) тестирование или просто недоработка как в случае с 0 шириной.
Юнит-тесты проверяют работу модуля. Написав тесты вы фиксирует контракт модуля по отношению к другим частям системы. Если в ходе рефакторинга или доработки этот контракт вдруг неожиданно поменяется. Тесты вам про это сразу скажут. Т.е. они не нужны чтобы проверять что работает прямо сейчас, они нужны чтобы убедиться что все работает как задумано потом.
Юнит-тесты во фронтенде наиболее полезны для "фундамента" приложения. Например, вы пишите какую-то либу, которая отвечает за логику и обработку данных. Ее будет очень полезно покрыть тестами, чтобы в дальнейшем сосредоточиться на интерфейсе и быть хоть немного уверенным, что если появился баг, то его причины не лежат глубоко.
Функционал же (события, изменения DOM) стоит тестировать только для того, чтобы в дальнейшем при расширении приложения, было легко убедиться, что базовый функционал не поломался. Естественно все варианты взаимодействия пользователя во всех средах протестировать не реально. Только базу.