yaroslavkornilov
@yaroslavkornilov
https://taplink.cc/the.yaroslav.kornilov

Зачем нужно тестирование?

Общее мнение, что тесты - хорошо. Тесты бывают разные и служат разным целям. TDD - признанная хорошая практика..
В наше время писать тесты не просто признак хорошего тона, но одно из требований, которое предъявляется к коду.

Почему? Я не против TDD, но не избыточно ли через эту методологию разрабатывать ВСЕ. Какие главные аргументы в пользу TDD?
  • Вопрос задан
  • 4546 просмотров
Решения вопроса 1
@azShoo
Проблема в том, что разработчики не могут писать код без ошибок.
Более того, в сколько-нибудь сложных программных системах при внесении каких-либо изменений слишком сложно понять, как это отразится на других частях.
Для того, что бы минимизировать поиски этих багов и ускорить их обнаружение пишутся юнит тесты.

ТДД про то, что бы писать тесты до кода.
Зачем это надо? Потому что такой подход помогает лучше структурировать в голове необходимую функциональность перед написанием непосредственно кода.
Такой подход позволяет избегать избыточного усложнения кода, потому что подход "tests first" не позволяет написать полотнище сложного кода, не проверив правильность его работы.
Плюсов достаточно.

Теперь по поводу того, нужно ли ТДД всегда.
ТДД нужно не всегда, как и красивый, производительный и правильно работающий код.
Иногда, нужно закостылить MVP, проверить бизнес-идею и продолжить жить. В таком подходе 20% времени, потраченные на юниты - непозволительная роскошь.
Иногда, вы пишете систему, сложность которой такова, что держать в голове матрицу состояний даже одного модуля не представляется возможным. И тут уже без юнит-тестов никак. Тут ТДД будет полезно.

Резюмируя. ТДД - отличный инструмент. Он позволяет не откладывать на потом написание юнит тестов, добиваться хорошего покрытия и, что важнее всего, контролировать изменения, вносимые в систему. Любая неожиданная ветка поведения приведет к падению тестов.
Как и любой инструмент - ТДД хорошо тогда, когда ты применяешь его своевременно, правильно и по назначению.
Писать тесты когда продакшен в огне, а компания терпит крах - плохая идея. Везде нужен здравый смысл.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@programrails
Я лично думаю, что тесты - это образчик типично западного лицемерия - как в сказке Андерсена "Голый король". Тесты - это чушь собачья (точнее, чушь свинячья). Полезность тестов - вымышленна. Тесты были изобретены на Западе - и они чужды по духу русскому человеку - ввиду своего чудовищного (типично Западного) лицемерия. Сторонники тестов пытаются что-то там такое невразумительное говорить (в защиту тестов) - но никто им не торопится верить - отсюда, собственно, и появился данный вопрос на данном форуме - если бы полезность тестов была реальна - люди бы не спрашивали, зачем они нужны - а просто пользовались бы ими. Все, кто выступает в защиту тестов - я думаю, лишь послушно повторяют цитаты из западных учебников - вместо изложения своих собственных мыслей. Конечно, ведь так хотят работодатели - так как же можно выступить против них?

Где, скажите, убедительно-неопровержимые доказательства нужности тестов как таковых? Их нет. Взамен предлагается просто поверить на слово в "полезность" тестов. Кроме того, написание тестов отнимает уйму времени и само по себе является источником ошибок. Намного быстрее и эффективнее просто проверить руками тот или иной функционал - чем писать для этого тест - как правило, на чрезвычайно неудобном, корявом и глючном тестировочном языке.

Писать же тесты ДО написания кода - это вообще ВЕРХ абсурда. Неужели непонятно, НАСКОЛЬКО противоестественно это занятие? Это просто дичь какая-то. Даже сами западные авторы учебников по тестированию об этом пишут - я прочёл несколько западных учебников по тестированию, пытаясь найти хоть какой-то смысл в тестах - они пишут, что BDD хорошо не более чем в 20% случаев.

Использовать тесты как защиту на будущее - "если что-то поломается при новых правках"? Ну извините, а не слишком ли дорогая цена - для 90% проектов? Да, может быть, на каком-нибудь миллионно-посещаемом сайте это и оправдано экономически - но на подавляющем большинстве сайтов - едва ли.

И вообще - даже если и идея автоматизирования тестирования и носит разумное зерно - почему нужно СПЕЦИАЛЬНО вручную писать тесты? В лучшем случае, это должно быть сделано так: ты тестируешь РУКАМИ какую-то фичу - а программа при этом АВТОМАТИЧЕСКИ запоминает всю последовательность ручных тестировочных действий (и потом воспроизводит при нужде). Только так это имеет право выглядеть. Я немного утрирую, конечно - но суть в том, что это безумный абсурд - писать тесты руками - тратя на это уйму времени и генерируя тем самым новые ошибки.

Короче, я для себя лично пока что решил так: писать тесты только для западных заказчиков - чтобы их душа была спокойна. И делать тесты как можно правдоподобней при этом - максимально выдавая их под якобы действительно нужную и полезную вещь (с точки зрения западного менталитета). Вот моя чисто практическая рекомендация. У них там на Западе множество идиотизмов, не понятных (и чуждых) русскому человеку - и это один из них.

Так что я действительно искренне не понимаю - зачем нужны тесты - и считаю, что они и не нужны на самом деле - а нужны исключительно для введения в заблуждение западных заказчиков - и больше ни для чего. Во всяком случае, в том (нелепом) виде, в котором они (тесты) существуют сейчас. Я же свой код тестирую руками - и это намного лучше и эффективней тестов. Да, я не говорю, что я не тестирую свой код - тестирую обязательно (а как же без этого) - но только руками. Может быть, и есть в отдельных случаях смысл написать именно тест - если руками тяжело и долго воспроизводить тестировочно-проверочную последовательность действий - но это как исключительный случай. Западное же требование покрытия кода тестами под 80-90% - вообще полная чушь - бездумная и шаблонно-тупая. Они ведь там тоже не семи пядей во лбу - а главное, что на Западе категорически запрещено думать своей головой - это только в России пока позволено (и то не каждому, как очевидно).

Я против тестов (в нынешнем их виде). Тем более, я против TDD. Но я не против тестирования - но только ручного.

Излагайте свои доводы - но только СВОИ, а не где-то вычитанные.
Ответ написан
Комментировать
lxsmkv
@lxsmkv
Test automation engineer
Если вы следуете парадигме ТДД то автоматически ставите наличие четкой спецификации, и архитектуры на первый план. И тем самым обеспечиваете себе отстуствие хаоса в разработке. Это моя основанная на личном опыте интерпретация. К сожалению мы не делаем ТДД и у нас хаос :)
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
основная идея:

1) программа должна работать так, как нужно;
2) программа не должна работать так, как не нужно

программа - читай "функционал программы"

вот без тестов с (2) , да и с редко используемым функционалом (1) начинаются сюрпризы, а сюрпризы влияют на деньги
Ответ написан
Комментировать
@kn0ckn0ck
Продюсер
Сперва нужно отделить мух от котлет:
  1. Модульное тестирование решает задачу проверки качества кода на уровне разработчика - на выходе имеем код, который можно мерджить с основной веткой, тестировать руками и не бояться за зря потраченное время.
  2. TDD - как некоторая экстремальная практика, позволяющая создавать тестируемый код, лучше структурированный код и обеспечивать фактически 100% покрытие тестами.

Очевидно, одно другое дополняет. Например, тесты на проверку граничных значений, на вариативность данных, на интеграцию с источниками данных (интеграция с БД, интеграция через API и т.п.), отношения к TDD не имееют, но крайне важны.

Известно, что разработка через тестирование обычно занимает раза в два больше времени. С другой стороны, попробуйте решить сколько процентов покрытия тестами вам достаточно для производства качественного результата?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы