В какой-то момент я согласился с человеком, который пересмотрел ваш код: сделать тесты до предела простыми.В то же время я хотел протестировать каждую низкоуровневую часть моего кода, чтобы иметь полное тестовое покрытие и выполнить TDD.
Проблема, как вы определили, заключается в том, что жестоко простые тесты повторяются, когда вам нужно что-то изменить для новых сценариев, вы должны изменить много тестового кода.
Тогда яЯ программировал с кем-то, у кого на два десятилетия больше опыта, чем у меня, который, как я знаю, программист мирового уровняОн сказал: «Ваши тесты слишком повторяющиеся, сделайте их рефакторинг, чтобы сделать их менее хрупкими».Я сказал: «Я думал, что мои тесты должны быть очень простыми и очевидными, а это значит, что мой код должен быть повторяющимся».И он сказал: «Не пишите свой тестовый код так, чтобы он отличался от вашего производственного кода, сохраняйте их СУХИМ (не повторяйте себя)».
Затем возник целый класс мета-вопросов о моей программе,Что достаточно для тестирования кода?Что такое хороший тестовый код?
В конце концов я понял, что когда я написал много жестоко простых и повторяющихся тестов, я потратил больше времени на рефакторинг тестов, чем на написание нового кода.Большое количество повторяющегося кода тестирования было хрупким.Это не скрывало ошибок, а усложняло добавление функций или устранение технических долгов.Больше кода не имеет большей ценности, когда дело доходит до бизнес-логики.И также более подробный тестовый код не помогает, когда рефакторинг становится «тестовым долгом».
Это приводит к еще одному важному моменту: слабо типизированные языки, которым требуется множество модульных тестов, чтобы доказать их правильность, требуют множества хрупких и повторяющихся тестов.Строго типизированные языки, где компилятор может статически сообщать вам о логических ошибках, означает, что вам нужно написать меньше тестового кода, который будет менее хрупким, чтобы вы могли быстрее выполнять рефакторинг.В свободно типизированном языке вы заканчиваете тем, что пишете много тестового кода, который гарантирует, что во время выполнения вы не пропустите неправильные типы.В строго типизированном языке функций вам нужно только проверять ввод во время выполнения: компилятор проверяет, работает ли ваш код.Тогда вы можете написать несколько тестов высокого уровня и быть уверенными, что все работает.Если вы реорганизуете свой код, у вас будет меньше тестов для рефакторинга.Вы пометили свой вопрос как «независимый от языка», но ответа не может быть.Чем слабее ваш компилятор, тем больше этот вопрос является проблемой: чем сильнее ваш компилятор, тем меньше вам придется иметь дело со всей этой проблемой.
Я прошел четырехдневный тестовый курс разработки в большом магазине по разработке программного обеспечения, который проводился в Smalltalk.Зачем?Поскольку никто не знает Smalltalk, и он не типизирован, поэтому мы должны были написать тест для каждой вещи, которую мы написали, поскольку мы все были новичками в этом языке.Это было весело, но я бы не советовал никому использовать свободно типизированный язык, где им нужно было написать множество тестов, чтобы понять, как это работает.Я бы настоятельно советовал людям использовать строго типизированный язык, где компилятор выполняет больше работы, и где может быть меньше тестового кода, поскольку это проще для рефакторинга тестов при добавлении новой функциональности.Аналогично, функциональные языки с неизменяемыми алгебраическими типами и композицией функций нуждаются в меньшем количестве тестов, поскольку у них нет большого количества изменяемых состояний, о которых нужно беспокоиться.Чем более современный язык программирования, тем меньше тестового кода нужно написать, чтобы избежать ошибок.
Очевидно, вы не можетеоцените язык, который вы используете в вашей компании.Итак, вот один совет, который мой друг сказал, который придерживается меня: тестовый код должен быть похож на рабочий код, поэтому не повторяйте себя.Если вы обнаружите, что ваши тесты становятся повторяющимися, удалите их.Сохраните минимальное количество тестов, которые сломаются, если логика нарушена.Не держите пятьдесят нечетных тестов, которые охватывают все варианты конкатенации строк.Это «чрезмерное тестирование». Избыточное тестирование препятствует рефакторингу, добавляя функциональность и устраняя технические долги, а не устраняет ошибки.В некоторых языках это означает написание множества повторяющихся тестов, которые вам необходимы для проверки вашей логики, когда вы пишете ее как скаффолдинг.Затем, когда у вас все получится, напишите более масштабные тесты, которые будут ломаться, если кто-то разбивает подпункты, и удаляйте все повторяющиеся тесты, чтобы не оставить «тестовый долг».Это приводит к нескольким грубым тестам, которые являются чрезвычайно простыми без большого количества повторений.