Эволюция программы и поврежденные тесты

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

Вы встретились с этой ситуацией? Это часто происходит? Какое изменение Вы представляли и как отказы проявляли? Вы фиксировали поврежденные тесты или просто удаляли их? Если первый, как? Если последний, почему? Как страх перед отказами влияет на Ваше требование к тестам записи?

Я также хотел бы найти определенные примеры поврежденных тестов. Вы знаете о каких-либо приложениях с открытым исходным кодом, которые развились способами, которые заставили тесты перестать работать?

11
задан 2 revs, 2 users 100% 2 November 2013 в 18:03
поделиться

11 ответов

Поддерживающие модульные тесты трудно.

Правда достаточно. Сохранение продукции и тестовый код вместе сложно. Оба вида кода разделяют с использованием (например, Конвенция об именах), но они до сих пор отличаются по характеру. Например, сухое может быть нарушено в тестовом коде, если это необходимо; Дублирование кода действительно будет найдено легко, так как тест сломается в обоих месте. Напряжение между тестовыми и кодом производства приводит к тому, что в определенном разделении дизайна (например, впрыск зависимости) для облегчения реагирования. Опять же, эти напряженности относительно новы, и взаимосвязь между дизайном на производственным кодексом и усилиями в обслуживании не совсем понятна. Статья « о взаимодействии между программным тестированием и эволюцией - отлично (я не смог найти его в PDF, но не в долгосрочной перспективе).

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

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

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

Как страх неудач воздействия Ваше желание написать тесты?

Вы должны найти баланс между (1) начальным временем, вложенным в тестовые набор (2) усилия по техническому обслуживанию и (3) эффективности тестового набора. Я пишу в основном то, что я называю «тестами с перегибами» и здесь мой взгляд на эту тему.

6
ответ дан 3 December 2019 в 03:52
поделиться

Разве это не вся точка модуля Рассказать вам, когда вы неожиданно сломали свой код? Я бы никогда не удалил неспособность, если он не использовал код, который будет удален из моей системы; Вы должны рассмотреть вопрос о создании и техническом обслуживании тестов в качестве неотъемлемой части написания вашего программного обеспечения, так же, как и доставленный код.

6
ответ дан 3 December 2019 в 03:52
поделиться

Как указывает Джефф, id ведет себя как attr_protected. Чтобы предотвратить это, необходимо переопределить список защищенных атрибутов по умолчанию. Будьте внимательны в любом месте, где информация об атрибутах может поступать извне. Поле идентификатора защищено по умолчанию по какой-либо причине.

class Post < ActiveRecord::Base

  private

  def attributes_protected_by_default
    []
  end
end

(Протестировано с ActiveRecord 2.3.5)

-121--728388-

Systemtap предназначен для решения тех же задач, что и dtrace, и имеет аналогичный интерфейс пользователя - пользователь пишет небольшие сценарии, которые присоединяют действия к именованным зондам.

Говорят, что это нестабильно, он обычно не компилируется в ваше ядро по умолчанию, но как только я получил его работать, у меня не было никаких проблем.

Вы можете увидеть, как он сравнивает с dtrace в этой таблице на сайте systemtap (Может быть партизанским: -)

Dtrace был частично портирован на Linux Пол Фокс, энтузиаст, и доступен для загрузки для вас, чтобы попробовать - проверьте ссылки на его блог .

Было сказано, что kprobes являются заменой dtrace, но я никогда не пробовал их.

-121--1193215-

Как влияет страх перед сбоями Ваше желание писать тесты?

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

6
ответ дан 3 December 2019 в 03:52
поделиться

Я наблюдал, и, безусловно, читаю где-то, здесь или здесь , что агрегаты, тестирующие, которые тестируют реализацию, более хрупкие, которые тестируют, что Проверьте поведение кода. Или белые блок-тесты Box более хрупкие, чем черные блок-тесты. Например, тест класса, который хранит вещей , непосредственно заглядывает в элементы данных объекта, чтобы проверить, будут ли все хранить, будут нарушены при изменении реализации хранилища.

2
ответ дан 3 December 2019 в 03:52
поделиться

Лично я не думаю, что это избежать. Вы можете минимизировать эффекты с помощью изоляции эффекта, но иногда может быть довольно сложно. Макеты могут помочь, но даже их можно срочно работать. Если поведение изменяется, и изменение поведения было преднамеренным, и у вас есть Y тесты, которые зависят от поведения, то он имеет смысл, только для того, чтобы вам придется изменить все ожидания. Я обнаружил, что, делая немного ООП, или просто надлежащий дизайн насутов, вы можете, иногда можно сохранить через преимущество повторного использования кода. Я никогда не боюсь тестовых сбоев в этом отношении, если поведение нужно изменить (и вы подумали о том, что нужно, необходимость реальна, и необходимость не прихоти к вашему менеджеру, который использовал для написания Cobol в хорошем Оле «Дни :-) Тогда это просто часть развивающейся базы кода и должна считаться частью работы. Если реконструкцию тестового насута занимает много времени, вы можете исключить тесты из вашей сборки и повторно включить их один за другим, но тесты, которые все еще проверяют ожидаемое поведение, не должны быть удалены, но повторно зафиксированы. Давайте не позволим пропустить тестовый набор, чтобы попасть в новую функцию, если вообще избежать.

1
ответ дан 3 December 2019 в 03:52
поделиться

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

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

Если одно изменение разбивает десятки тестов, вам, вероятно, нужно предпринять некоторое время для рефакторов в значительной степени связанных разделов вашего кода или вам нужно разбить ваши тесты и устранить дублированные условия теста.

3
ответ дан 3 December 2019 в 03:52
поделиться

Я брошу еще один критерий в кольцо:

  • Нет «прогулок с клавиатурой»

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

О, и ничего в списке запрещенных паролей Twitter .

-121--4043530-

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

Очередь - первая, FIFO (First out)

Стек - последняя очередь, first out (LIFO)

Массивы и списки - произвольный доступ. Они очень гибкие, а также легко поддаются коррупции. ЕСЛИ вы хотите управлять данными как FIFO или LIFO, лучше всего использовать уже внедренные коллекции.

-121--1267634-

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

В основном, рефактор постоянно , чтобы убедиться, что изменения локализованы, и что вам не придется менять 200 тестовых случаев просто потому, что вы решили сделать простое изменение. Можно сказать, что ваш код должен быть достаточно детализированным, чтобы позволить легко тестировать (не нужно заглушать десять объектов, прежде чем вызывать код и тестировать его), что обычно облегчает обслуживание в течение нескольких месяцев.

Вся цель ваших тестов - дать вам уверенность . Более того, они позволяют тебе быть немного глупой. Если у вас достаточно тестов, в которых вы уверены, вам не нужно думать крепко, прежде чем удалить несколько строк кода, вы почти уверены, что не используются. Удалите их и запустите тесты!
Потому что я думаю, что это одна из основных сильных сторон модульного тестирования, я бы сделал все, что мог, чтобы предотвратить то, чего я «боюсь» номера люкс тестирования. Если простые изменения ломают тесты в местах, которых вы никогда не ожидаете, это обычно означает, что вам нужно узнать больше о вашей базе кода, и, вероятно, внести некоторые изменения, чтобы привести вещи в порядок.

Очень мало случаев, когда я удалил тестовый пример протестированного кода, который не был удален. Это значит, что даже после копания действительно глубоко (возвращаясь в систему контроля версий) я не могу понять, почему тест там, или не согласен с ним. Но мой первый способ посмотреть на это «черт, я что-то упускаю.» Вот как точно должен быть с его номером люкс, и вот почему это стоит усилий.

1
ответ дан 3 December 2019 в 03:52
поделиться

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

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

0
ответ дан 3 December 2019 в 03:52
поделиться

Моим ответом на этот вопрос для некоторых программ, над которыми я работал несколько лет назад, была подготовка серии тестов и правильных ответов на эти тесты во время выполнения. Поскольку изменения в программном обеспечении могли изменить вывод на другой (альтернативный) правильный вывод, я создал резервную систему тестовых выходных данных. Используя эту систему, я мог отслеживать изменения в тестовом выводе и обнаруживать непреднамеренные ошибки, а также отслеживать, когда они происходили, с помощью программы различий, применяемой между текущим и одним из прошлых выходов.
Мои тесты были разработаны для прохождения каждого основного цикла в программе с различными настроенными опциями.
Это было до появления Windows-NT, поэтому все делалось с пакетными файлами DOS и утилитами DOS.
Я также написал пакетный файловый усилитель, который позволял мне выполнять программы подобно тому, как UNIX находит и xargs работает.

0
ответ дан 3 December 2019 в 03:52
поделиться

Похоже, вы почти ответили на свой первый вопрос, так как он семантически не является абзацем, поэтому использование < p > неверно.

Второй вопрос о том, использовать ли < div > , зависит от вашего использования, но я не понимаю, почему нет, кроме все более громоздкого кода, хотя это, вероятно, не добавит большого веса странице.

Моя собственная тенденция заключается в вложении < input/> в < label > тэгов, хотя это, опять же, семантически неверно, поскольку ввод не является частью метки, являясь только ее аналогом.

Конечно, оба способа работают и производят во многом одинаковый визуальный эффект; Я никогда не использовал альтернативный -speech-converter или such- для GUI браузера, поэтому я не могу сказать, добавляет ли он странности для отключенных пользователей.

-121--4859795-

Покажите им мой демонстрационный ролик и спросите их, сколько кода потребуется, чтобы сделать то же самое в ADO.NET. Тогда обратите внимание, что в реальном мире, вероятно, между ними будут репозитории и сервисы, которые вы получите почти бесплатно с прогнозами LINQ.

Затем отобразите параллельные расширения в .NET 4 .

-121--4594721-

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

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

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

0
ответ дан 3 December 2019 в 03:52
поделиться

Вот мыслительный эксперимент. Это похоже на развязку

, постарайтесь не поддерживать свои тесты подразделения.

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

(Кстати, этот тестовый режим имеет имя: «Интеграция Big Bang»: когда вы пробуете его в электронике, это буквально взрыв, так как все оборудование захватывает огонь.)

Объясните, сколько работы это было для поддержания, И это не делает это спасенным временем.

Смотрите взгляд на их лице. Для достижения наилучшего эффекта выберите кого-то, кто является лицензированным PE (профессиональный инженер) в вашей местности.

Повторите это, но замените человека из своего аудитора ISO 9000, где вы показываете им пересмотренную процедуру разработки, которая не имеет тестирования до интеграции.

Повторите, снова замените оценщик CMMI. Это последний будет смешным. CMMI Scampi Escestors любят объяснения, такие как «Это было слишком много усилий»

Теперь, наверное, вы думаете, что вы не работаете где-то с ISO9000 или CMMI, и никогда не работаете с другими инженерами на дискомлинах.

В какой момент проблема заключается в том, что средний магазин программного обеспечения, вероятно, вообще не тест.

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

0
ответ дан 3 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

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