Ruby on Rails - Зачем использовать тесты?

Я смущен тем, что для различных устройств тестирования в Ruby on Rails. Я использую структуру около 6 месяцев, но я никогда не понимал ее часть тестирования. Единственным тестированием, которое я использовал, является JUnit3 в Java, и это только кратко.

Все, что я читал об этом, просто показывает проверки проверки. Не должны ли валидации в рельсах работать? Это похоже на тестирование рамки, чем тестирование вашего кода. Зачем вам нужно проверять проверки?

Кроме того, тесты кажутся очень хрупкими для любых изменений в вашем коде. Поэтому, если вы меняете что-либо в своих моделях, вам нужно изменить свои тесты и приспособления для соответствия. Разве это не нарушает принцип СУХОЙ?

В-третьих, запись тестового кода, похоже, занимает много времени. Это нормально? Разве не было бы быстрее обновить мой браузер и посмотреть, сработало ли оно? Мне уже нужно играть с моим приложением, чтобы проверить, правильно ли он протекает и убедиться, что мой CSS не взорвался. Почему недостаточно ручного тестирования?

Я задавал эти вопросы раньше, и я не получил больше, чем автоматизированное тестирование автоматизировано. Я достаточно умен, чтобы понять преимущества автоматизации задачи. Моя проблема заключается в том, что затраты на письменные тесты кажутся абсурдно высокими по сравнению с преимуществами. Тем не менее, любой подробный ответ приветствуется, потому что я, вероятно, пропустил преимущество или два.

Ответ 1

Не должен валидации в рельсах просто работают? Это больше похоже на тестирование структуры чем тестирование вашего кода. Почему бы вам нужно проверить валидации?

Проверки в Rails действительно работают - на самом деле в Rails-кодовой базе есть единичные тесты, чтобы убедиться в этом. Когда вы проверяете проверку модели, вы проверяете специфику проверки: длину, принятые значения и т.д. Вы убедитесь, что код был написан по назначению. Некоторые проверки являются простыми помощниками, и вы можете не протестировать их по понятию, что "никто не может испортить вызов validates_numericality_of". Это правда? Каждый разработчик всегда помнит, чтобы написать его в первую очередь? Разве каждый разработчик никогда случайно не удаляет строку с плотной копией? По моему личному мнению, вам не нужно тестировать каждую последнюю комбинацию значений для помощника проверки правильности Rails, но вам нужна строка для проверки того, что она там с переданными правильными значениями, на всякий случай, если какой-то панк изменит ее в будущем без должной предусмотрительности.

Кроме того, другие проверки более сложны, требуя большого количества настраиваемого кода - они могут потребовать более тщательного тестирования.

Кроме того, тесты кажутся супер хрупкой для любых изменений в вашем коде. Так если вы измените что-либо в своих моделях, вы должны изменить свои тесты и приспособления для соответствия. Разве это не нарушают принцип DRY?

Я не верю, что это нарушает СУХОЙ. Они общаются (что программирование, общение) две разные вещи. Тест говорит, что код должен что-то делать. В коде говорится, что он на самом деле делает. Тестирование чрезвычайно важно, когда есть разрыв между этими вещами.

Тестовый код и код приложения тесно связаны между собой. Я думаю о них как о двух сторонах монеты. Вам не нужен фронт без спины или спина без фронта. Хороший тестовый код укрепляет хороший код приложения и наоборот. Эти два вместе используются для понимания всей проблемы, которую вы пытаетесь решить. И хорошо написанный тестовый код - это документация - он показывает, как должен использоваться код приложения.

В-третьих, запись тестового кода кажется много времени. Это нормально? не было бы это просто быстрее, чтобы обновить мои браузера и посмотреть, работает ли он? я уже нужно играть с моим приложение, чтобы проверить, не течет ли он правильно и убедитесь, что мой CSS не взорвалось. Почему бы не ручное тестирование достаточно?

Вы работали только над очень маленькими проектами, для которых это тестирование, возможно, достаточно. Тем не менее, когда вы работаете над проектом с несколькими разработчиками, тысячами или десятками тысяч строк кода, точками интеграции с веб-службами, сторонними библиотеками, несколькими базами данных, месяцами разработки и изменениями требований и т.д., Есть много других факторы в игре. Ручного тестирования просто недостаточно. В проекте любой реальной сложности изменения в одном месте часто могут иметь непредвиденные результаты в других. Правильная архитектура помогает смягчить эту проблему, но автоматическое тестирование также помогает (и помогает идентифицировать точки, в которых архитектура может быть улучшена), путем определения того, когда изменение в одном месте ломает другой.

Моя проблема в том, что затраты на письменные тесты кажутся абсурдными по сравнению с преимуществами. Что сказал, любой подробный ответ приветствуется потому что я, вероятно, пропустил преимущество или два.

Я перечислю еще несколько преимуществ.

Если вы проверите сначала (Test Driven Development), ваш код, вероятно, будет лучше. Я не встречал программиста, который дал ему прочный выстрел, для которого это было не так. Тестирование сначала заставляет вас думать о проблеме и на самом деле разрабатывать решение, а не взламывать его. Кроме того, это заставляет вас хорошо понимать область проблем, где, если вам нужно ее взломать, вы знаете, что ваш код работает в пределах ограничений, которые вы определили.

Если у вас есть полное тестовое покрытие, вы можете реорганизовать без НЕТ РИСКА. Если проблема с программным обеспечением очень сложная (опять же, проекты в реальном мире, которые длится месяцы, как правило, сложны), вы можете упростить код, который был ранее написан. Таким образом, вы можете написать новый код, чтобы заменить старый код, и если он пройдет все ваши тесты, все готово. Это делает то, что сделал старый код в отношении тестов. Для проекта, который планирует использовать гибкий метод разработки, рефакторинг абсолютно необходим. Изменения всегда должны быть сделаны.

Подводя итог, автоматическое тестирование, особенно разработка, основанная на тестах, в основном представляет собой метод управления сложностью разработки программного обеспечения. Если ваш проект не очень сложный, стоимость может перевесить преимущества (хотя я сомневаюсь в этом). Однако проекты в реальном мире, как правило, очень сложны, а результаты тестирования и TDD говорят сами за себя: они работают.

(Если вам интересно, я нахожу статью Дэна Норта в "Поведенческом развитии" очень полезной для понимания большой ценности тестирования: http://dannorth.net/introducing-bdd)

Ответ 2

Тесты должны проверять вашу логику приложения. Лично я считаю, что мои самые важные тесты - те, которые я запускаю в Селене. Они проверяют, что то, что отображается в браузере, на самом деле является тем, что я ожидаю увидеть. Однако, если бы все, что у меня было, тогда мне было бы трудно отлаживать - это помогает проводить тесты более низкого уровня, а интеграционные, функциональные и модульные тесты - все полезные инструменты. Модульные тесты позволяют проверить, что модель ведет себя так, как вы ожидаете (и это означает, что каждый метод, а не только validatins). Validatins, безусловно, Just Work, но только если вы их правильно. Если вы ошибаетесь, они будут просто работать, но не так, как вы ожидали. Запись нескольких строк теста выполняется быстрее, чем отладка позже.

Простой пример, например, в http://wiseheartdesign.com/2006/01/16/testing-rails-validations, просто проверяет проверки в unit test. Статья O'Reilly в http://www.oreillynet.com/pub/a/ruby/2007/06/07/rails-testing-not-just-for-the-paranoid.html?page=1 немного более полная (хотя и довольно простая).

Автоматическое тестирование особенно полезно в регрессионном тестировании, где вы что-то меняете и запускаете набор тестов, чтобы проверить, что вы ничего не сломали.

Тесты - это форма повторения, но они не нарушают СУХОЙ, потому что они выражают вещи по-другому. В тесте говорится: "Я сделал X, так что должно случиться". В коде сказано: "Х случилось, так что теперь мне нужно сделать Z, из-за чего произойдет Y". т.е. тест стимулирует причину и проверяет эффект, тогда как код реагирует на причину и что-то влияет.

Ответ 3

Многие обучающие тесты и образцы тестов, созданные генераторами Rails, довольно хромают, и IMHO может дать ошибочное впечатление, что вы должны тестировать такие глупые вещи, как встроенные методы Rails и т.д.

Поскольку у Rails есть собственный набор тестов, вам не нужно писать или запускать тесты, которые проверяют только встроенные функции Rails. В ваших тестах должен использоваться код, который вы пишете!: -)

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

Ответ 4

Я не очень много использовал Rails, но я думаю, что эти автоматические тесты были бы полезны в качестве тестов на дым, чтобы быть уверенным, что вещь, которую вы только что сделали, не нарушает то, что вы делали на прошлой неделе. Это будет приобретать все большее значение по мере роста вашего проекта.

Кроме того, запись тестов перед написанием кода (с использованием модели Test-Driven-Development) поможет вам лучше и быстрее писать код, поскольку тесты заставляют вас полностью задуматься над проблемой. Это также поможет вам узнать, где разбить сложные методы на более мелкие методы, которые вы можете тестировать индивидуально.

Вы правы, писать и поддерживать тесты занимает много времени. Иногда больше времени, чем сам код. Тем не менее, это может сэкономить ваше время на исправление ошибок и рефакторинг по причинам, указанным выше.

Ответ 5

Например: Я работаю над проектом 25000+ линий (да, в rails 1.2), и в последний понедельник мне сказали, что я могу заставить пользователей исчезнуть из каждого списка, кроме админа, если у них атрибут "left_date" установлен в прошлое.

Вы можете переписать каждое действие списка (50+), чтобы поместить

@users.reject {|! У | Date.today > u.leave_date}

Или вы можете переопределить метод "find" (DRY;-), но только если у вас есть тесты (на все, что находит пользователей!), вы узнаете, что ничего не нарушили, переопределив User # find!!

Ответ 6

Все, что я читал об этом, просто показывает проверки проверки. Не должны ли валидации в рельсах работать? Это похоже на тестирование рамки, чем тестирование вашего кода. Зачем вам нужно проверять проверки?

Там есть хороший Railscast, показывающий один способ контрольные контроллеры.