Потихоньку осваиваю программирование. Добрался до Unit-тестов, и нихуя не понял, зачем они нужны. Пишется, что они нужны для проверки отдельных методов, как я понял, на корректную работоспособность. Например, метод складывает 1 и 1, и возвращает 2. И типа ты пишешь тест под этот метод, чтобы он проверил, что метод вернёт именно 2, правильно ли я понял? И если так, то вопрос - а нахуя писать тест, если можно запустить программу, и самому увидеть в ней, верные ли она выводит данные или нет? Я понимаю, что программы могут быть очень и очень большими, могут дорабатываться со временем и изменяться, и юнит-тесты нужны, чтобы проверить, что всё работает корректно. Но я не понимаю другого. Если метод изначально работает некорректно - ошибку ведь видно сразу, т.к. человек, пишущий программу, наверняка запускает её и проверяет работоспособность, и тогда человек эту ошибку сразу исправляет. Соответственно, если метод изначально написан верно, то что с ним может случится за долгое время эксплуатации программы? Если его не трогать, то он будет и дальше выводить корректные данные, а если этот метод потребуется переписать (под новые нужды новой версии программы) - то ведь при переписывании, программу, опять же, будут включать и смотреть, корректно ли она работает. И тут я возвращаюсь к своему вопросу - так зачем нужны юнит-тесты? Спрашиваю не ради троллинга, просто хочу понять, что я упускаю из виду.
>>254025251 (OP) >Потихоньку осваиваю программирование. Добрался до Unit-тестов, и нихуя не понял, зачем они нужны. Пишется, что они нужны для проверки отдельных методов, как я понял, на корректную работоспособность. Например, метод складывает 1 и 1, и возвращает 2. И типа ты пишешь тест под этот метод, чтобы он проверил, что метод вернёт именно 2, правильно ли я понял? И если так, то вопрос - а нахуя писать тест, если можно запустить программу, и самому увидеть в ней, верные ли она выводит данные или нет? Я понимаю, что программы могут быть очень и очень большими, могут дорабатываться со временем и изменяться, и юнит-тесты нужны, чтобы проверить, что всё работает корректно. Но я не понимаю другого. Если метод изначально работает некорректно - ошибку ведь видно сразу, т.к. человек, пишущий программу, наверняка запускает её и проверяет работоспособность, и тогда человек эту ошибку сразу исправляет. Соответственно, если метод изначально написан верно, то что с ним может случится за долгое время эксплуатации программы? Если его не трогать, то он будет и дальше выводить корректные данные, а если этот метод потребуется переписать (под новые нужды новой версии программы) - то ведь при переписывании, программу, опять же, будут включать и смотреть, корректно ли она работает. И тут я возвращаюсь к своему вопросу - так зачем нужны юнит-тесты? Спрашиваю не ради троллинга, просто хочу понять, что я упускаю из виду.
>>254025251 (OP) >т.к. человек, пишущий программу, наверняка запускает её и проверяет работоспособность, и тогда человек эту ошибку сразу исправляет код может быть переписан, дописан, логика методов сложная может быть КРАЙНЕ НЕОЧЕВИДНО что там подразумевали лет 10-15 назад в каком-нибудь легаси, особенно когда придет другой человек в команду так что это хоть какая-то гарантия что джут не сломает важный функционал
>>254025620 Спасибо. А как эти тесты вообще проводятся? Типа, запускается отдельный фреймворк, в него вставляется кусок кода из основного приложения и прогоняется? Или вся программа целиком копируется туда, и там уже как-то делится на изолированные части?
Смотри, анон, в качестве примера. Твой проект состоит из микро-сервисов, много модулей и все такое. И ты написал метод (назовем его метод1), который обращается в другой сервис (назовем его сервис2), забирает оттуда данные и что-то с ними делает. Метод работает год, второй, третий, горя не знает. Но тут сервис2 решили изменить, совершенно забыв, куда он там данные отдает. А уж если этот сервис2 используют например еще сервисов 10, то про все концы и то забудешь. И так получается, что теперь твой метод1 работает неправильно, и это приведет к проблемам. Так вот, если ты заранее напишешь юнит-тесты, то этой проблемы можно избежать и на этапе переделывания сервиса2 просто запустить тесты и посмотреть, ничего ли не сломалось. Тесты тебе покажут, где проблема и ты ее исправишь в зачатке, что очень удобно
>>254025786 Спасибо за красочный пример, анонче, вот таких аналогий очень не хватает. А то написать про преимущество юнит-тестирования мы любим, а объяснить простыми словами, что это вообще за вещь и зачем она нужна - как-то не спешим.
>>254025251 (OP) В юнит и функциональных тестах есть смысл только на больших энтерпрайз приложения. В остальном случае это суходрочка и выебоны. Научиться их писать довольно просто, а потом неделя практики и готово.
Есть ещё TDD, это когда сперва пишут требования к результатам, а потом сам функционал. Забавная, но специфическая хуйня.
Если изучаешь погроммирование, то попробуй канешн, но не увлекайся сильно, и учти, что если пишешь тесты и тебе за это не платит работодатель, то ты долбоёб. Лучше работу поищи или пет проект пиши.
>>254025251 (OP) > Добрался до Unit-тестов, и нихуя не понял, зачем они нужны > Добрался до ентерпрайз-параши, нихуя не понял, зачем она нужна. Дрочи алгоритмы, прочую CS-муть и пиздуй на собес, бот. Понимание Unit-тестов придет только с опытом.
>>254025251 (OP) Если у тебя 1000 методов то ручками ты ничего не посмотришь. Юнит тест должен проверять не только, что 1+1===2, но и кучу крайних случаев. Типа что если вместо цифр придут строки? Какое исключение кинешь и как его обработаешь?
>>254025251 (OP) Тестирование вообще нужно не для проверки работоспособности, а для гарантии того, что в любой момент твое приложение выдает предсказуемый результат
>>254025251 (OP) Почти любое ПО пишется кусками и постепенно развивается/меняется. Поэтому написать и забыть это утопия.
И методы бывают сложными, ошибки в которых могут быть неочевидными, т.е. в обычных условиях работают, а какие-то специфические данные и сразу хуяк. Проверять это руками ты заебешься, особенно перепроверять каждый раз.
И методов много. Например, у нас проект с финансовой залупой, и там чтобы сделать нужную штуку запускается около двадцати отдельных методов. В начале было всего пять или шесть, остальные добавились потом. Угадай как это заебись проверять руками.
А так когда у тебя нормальные тесты есть и они интегрированы с системой CI/CD то по сути после каждого коммита все важные части приложения могут быть автоматически протестированы на предмет того сломали ли что-то свежие изменения.
Год назад тоже наткнулся, в вузе вообще не любят пояснять ща подобные вещи. Щас спринг, какие то компоненты, сервисы - ебитесь как хотите, зато принципы ооп и солид нужно рассказывать наизусть
>>254026185 >В юнит и функциональных тестах есть смысл только на больших энтерпрайз приложения. В остальном случае это суходрочка и выебоны. Не соглашусь. По сути любое крупное (чисто по объему кода) или важное ПО нуждается в тестах, вопрос только как и что будет покрыто тестами. Покрывать всё - да, это боль. Но типа даже простенькие сервисы если там касается денег, уведомлений и прочего, то стрёмно без тестов.
>>254025786 Немного хуита. Все внешние сервисы мокаются и ты узнаешь, что обосралось прямо в продакшене. Но это и не твоя вина, а долбоеба, который свой сервис недотестировал или не умеет в версии, так что всё честно.
>>254026703 Отвечу за него, формальные знания редко соответствуют качественному коду. Как и абсолютистское следование всяким практикам. Мне достался проект на джаве, там все хуесосы с сертификатами писали, спринг, паттерны-хуятерны, а там пизда: кривое, косое, бажит, опечатки в переменных, кривое наименование, орда копипасты на ровном месте (как блядь), зато ехала фабрика фабрики для построения фабрик и прочее ООП головного мозга.
>>254026725 Такая, которой приходиться работать с парашными чужими апи, ебанутым хромом (который сам обновился и сломал фичу азаза или просто решил насрать на свои же стандарты), а также необходимосью пивотить реализацию отдельных фич на пяточке.
Сеньоры и прочие hr-менеджеры, есть ли предвзятость к людям с неоконченным высшим? Преподы байки травят что без диплома никуда, а ещё лучше в магу, а на работу без высшего идут только те кто еще учится на неполную ставку.
>>254026906 Я об этом как раз. Фичи добавляются гораздо медленнее и меньше из за постоянных багов в старых фичах. На тестирование которых менеджер зажопил время.
>>254026319 >Типа что если вместо цифр придут строки? Питухонодебил не палится, лол. Пиши на нормальном языке, а не на динамической параше и такие косяки на этапе компиляции отлетят
>>254026861 Понятное дело, что нужно код писать так, чтобы даже ромка-попрыгун понял. И понятное дело, что в руках долбоеба все что угодно может стать говном. Но если ты берешься писать в ООП стиле, основные принципы знать стоило бы, даже если ты и не собираешься их использовать принципиально
>>254027073 >Сеньоры и прочие hr-менеджеры, есть ли предвзятость к людям с неоконченным высшим? Про HR не скажу (у нас они только бумажки перекладывают и договариваются о собеседованиях), а нормальным разрабам похуй. У нас 60+ процентов без профильного диплома. У многих заочные дипломы или неоконченное.
> Преподы байки травят что без диплома никуда У тебя не возникает очевидный вывод, что слушать старого пидора с конфликтом интересов в данном вопросе не стоит?
>Учитывая что 40к веб програмистом не охота Таких почти не бывает. Ну серьезно. Если ты попадаешь ложкой в рот, то уже больше будет. Если не сразу так через год. У нас тут блядских WP разработчиков (верстка, базовый php и щепотка джаваскрипта) хантят на 150к лол. Вот в пятницу один ушел. У нас получал 100к, мы бы платили больше, но чувак что-то совсем не хотел развиваться по скилам. Только базовые проекты тянул. А тут хуяк и ему оффер на 150к за тоже самое.
>>254027210 По опыту могу сказать, что обычно если человек не совсем еблан, то он приходит к нормальному коду сам. Сначала ты ебашишь лапшу с копипастой ублюдочную, но потом понимаешь что в случае чего менять что-то больно и начинаешь дробить её на части. А потом ты узнаешь про ООП и понимаешь, что часть вещей отлично вынести в классы можно и так далее, и так далее. А если понимаиня нет зачем и нахуя всё это, то потом эти зомби-кодерки рождают этих мутантов, где формально все лучшие практики, а на выходе почему-то кал.
>>254025251 (OP) Ошибка может возникать очень редко. Тесты автоматически запускаются на серверах по много раз за день. Вероятность бага в релизе снижется.
>>254027396 Да, соглы. Ну тут вопрос скорее в том, в какой момент времени придет это понимание. Принципы закладывают зерно, а ты уже сам дальше действуешь. Обычно ты начинаешь что-то писать и анализируешь, как можно улучшить код. И вспоминаешь про то, что выучил и начинаешь понимать, зачем это так придумано. А потом через какое-то время начинаешь ебошить уже без размышлений.
>>254027619 Тем, что ты в принципе не сможешь подключить модуль с чужим кодом и как петух на петухоне вызывать метод кококо Кукарек(инт а) пихая ему стринг г
>>254027974 Если бы, анончик, если бы. Когда проект пилят с разных сторон, или у тебя есть API, или ты юзаешь чужой API, то всё куда хуже. Особенно если с вами интегрируется какая-то залупа другой конторы, у которой сидят черви пидоры вместо разработчиков.
>>254028150 расскажи этим червям пидорам ещё как джейсоны нормальные собирать, у нас были проекты вместо всякие ебаные стыды делались вместо нормальных джейсонов, потому что та сторона ниасилила
серьезно, вам походу ребята повезло пилить проекты без кривых апи, где rest api возвращает ошибки с кодом 200 OK или говорит success, когда параша сломалась, или когда они должны слать одно, но иной раз приходит другое и прочее-прочее-прочее, и в итоге у тебя вместо обычного кода на каждом шлюзе толстый слой говночеков и лишней валидации, в том числе по косвенным примерам, или ещё охуенее, когда у тебя висит система очередей чтобы перепроверять результаты, которые типа уже отработали раньше азаза, потому что платежный шлюз отвечает тебе что оплата обосралась, но ты знаешь, что нельзя фейл показывать конечному покупателю, ибо есть 60% вероятность, что оплата прошла, просто эти хуесосы слишком рано ответ ёбнули тебе (как нахуй такое возможно?), и надо потерпеть и запустить дополнительный запрос чтобы проверить в списке запросов статус хуйни пост-фактум и о ебать а оно на самом деле прошло азаза
И это не какие-то смузистартапы со студентами, это блядь финансы, энтерпрайз, бизнес нахуй, или ещё хуже - банкинг, здравоохранение и госпроекты азаза
Или вот недавно. Получили файл с нашего фронт-энда. Надо проделать по нему операции определённые и дальше в дело пустить, делаем эти операции не мы, а сторонний сервис, типа отправил и он тебе ответом уже запроцессиный файл отдаёт. А вот хуй. Если файл очень мелкий, то да - всё так и будет. А если файл чуть больше обычного то оно кропнет файл нахуй. Не из-за ограничений объёма. Они просто слишком рано тебе ответ вышлют, в то время как файл не целиком запроцессился и ещё не цельный. Если подождать и запросить по временному URL файл чуточку позже, то он будет нормальный и целый. Охуительные истории, неправда ли? В итоге, с нашей стороны приходиться делать костыли т.к. они это исправят дай бог через год. Такие дела.
>>254028450 А причем тут кривые типы которые в языках со статической типизацией ты не сможешь разложить в структуру и обязан обработать эту ошибку в коде? То что ты работаешь в параше где бэк пишут идиоты на динамических языках это только твои проблемы.
>>254025251 (OP) не читай школьников сверху. Дело в том что юнит тесты пишут не под отдельный метод а под целый модуль. И этот модуль может быть изменен в дальнейшем, например могут быть изменены используемые внтури типы. Но не логика модуля. Тесты позволяют после этих изменений убедится что все норм.
Короче ещё проще:
func() { T a,b; return a+b; }
Пишется тест под для func. А потом может потребуется поменять T. Тест позволит убедится что func по прежнему делает что надо.
Потому что бывают методы, которые нельзя на глаз проверить, которые требуют входные данные или другие особенные вещи, а также их количество может быть больше одного, и ещё миллиард причин. Всё равно никто не пишет юнит-тесты, потому что считают себя самыми умными, а потом посреди ночи дебажат своё говно вместе с остальными командами, когда прилетел блокер с прода