“Нормальное” отношение кодовой базы по сравнению с тестом утверждает проблемы, когда тест перестал работать?

Я в настоящее время работаю над проектом с некоторыми довольно значительными бизнес-правилами, где пространство задач 'обнаруживается', поскольку мы пишем решение (довольно типичный хаотический вид управления проектами вещи). Мы имеем достойное тестовое покрытие и полагаемся на них вполне немного, чтобы удостовериться, что наши изменения signficant ничего не аварийно завершают. Этот сценарий является видом вещи, которую зилоты модульного теста выделяют как главный пример тестирования программного обеспечения помощи быть сразу легко измененными с меньшим количеством дефектов и более быстрого завершения затем, если Вы не используете модульные тесты. Я дрожу для размышления о том, как я смог бы справиться без набора тестов.

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

Существует несколько методов, которым я использовал следование совету других для помощи с этой проблемой. В целом,

  1. мы создаем тестовые списки, которые находятся любой в 'зависимом' по сравнению с 'независимым' блоком. независимые тесты не требуют ничего, что не находится в управлении исходным кодом. Таким образом, любые вызовы к нашему уровню доступа к данным или дразнят или получение данных из XML-файла вместо реального дб, например. Зависимые тесты как имя предлагают, зависят от чего-то как файл конфигурации или дб или networkie вещь, которая не могла бы быть правильно настроена/доступна при запущении теста. Разделение тестов в группам как это было extremembly ценностью в разрешении нам записать, что зависимый 'выбрасывает' тесты для ранней разработки и независимые тесты в жестком реальном времени, на которые можно положиться и повторная тестовая гниль. Это также делает сервер CI легким справиться, так как это не должна быть установка и сохраняемые w/соединения дб и т.п..
  2. Мы нацелены на разные уровни нашего кода. Например, у нас есть тесты, поражающие 'основной' удар и тестовый удар все методы, которые 'основной' звонили бы. Это дает нам способность предназначаться для деталей системы и всеобъемлющих целей. 'Основные' тесты трудно отладить, если они повреждаются, но они обычно не единственная вещь, которая повреждается (подробные тесты также повреждаются). Легче следовать за подробными тестами и отладить их, если они повреждаются, но они недостаточны, чтобы знать, уничтожает ли осуществление рефакторинг систему (это - то, что 'основные' тесты для).
  3. 'Основные' тесты были очень важны для чувствования себя комфортно, что осуществление рефакторинг не полило из шланга кодовую базу. таким образом, 'основной' тест был бы похож на многие тесты к отдельному методу, названному с другим args та карта к вариантам использования. Это - в основном entrypoint в наш код на высшем уровне, и как таковой возможно не действительно тесты 'единицы'. Однако я нахожу, что мне действительно нужны высокоуровневые тесты для чувствования себя комфортно, что осуществление рефакторинг не аварийно завершило кодовую базу. Более низкие тесты уровня (те, которые являются действительно 'единицей' работы) не достаточны.

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

Кто-либо отследил это отношение на их проектах, и если так, какие виды вещей Вы изучили (если таковые имеются) относительно этого отношения? Я не уверен, что это даже указывает на что-либо, но я заметил, что приблизительно половина времени, когда отказы при испытании приводят меня к корректирующемуся тесту, утверждает вместо того, чтобы на самом деле исправить ошибки регрессии в реальной кодовой базе. Каждый раз, когда это происходит, это заставляет меня чувствовать, что я просто потратил впустую x часы своего дня и интересно, мог ли я быть более эффективным так или иначе с моим подходом к тестированию. Часто занимает больше времени разрешить, что тест - утверждает отказы, чем фактические ошибки регрессии, который и парадоксален и печален.

ОТРЕДАКТИРУЙТЕ Примечание, которое этот вопрос об исследовании что это средство отношения и Ваш опыт с этим отношением. Когда это является 'вонючим'??

10
задан razlebe 6 December 2011 в 17:43
поделиться

4 ответа

Mac OS X и некоторые другие Unixes, по крайней мере, имеют пользовательский путь, скомпилированный в sshd по соображениям безопасности, поэтому те из нас, кто устанавливает git as/usr/local/git/{ bin, lib,...}, могут столкнуться с проблемами, поскольку исполняемые файлы git не находятся в предварительно скомпилированном пути. Чтобы изменить это значение, предпочитаю изменить значение параметра/ etc/sshd_config:

#PermitUserEnvironment no

на

PermitUserEnvironment yes

, а затем при необходимости создать файлы среды ~/.ssh/. Пользователи my git имеют в файле ~/.ssh/environment следующее:

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin

Расширение переменной Note не происходит, если файл ~/.ssh/environment прочитан так:

PATH=$PATH:/usr/local/git/bin

не будет работать.

-121--647660-

Возможно, эти сферы можно сохранить в дереве BSP ? Если это приемлемо, то можно начать с поиска узлов дерева, содержащих сферы, которые наиболее удалены друг от друга. Затем вы можете продолжать вниз по дереву, пока не доберетесь до отдельных сфер.

-121--2311044-

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

Если тест завершается неуспешно, есть три варианта:

  1. реализация нарушена и должна быть исправлена,
  2. тест нарушен и должен быть исправлен, или
  3. тест больше не нужен (из-за измененных требований) и должен быть удален.

Важно правильно определить, какой из этих трех вариантов он есть. В путь, когда я пишу свои тесты, я документирую в названии теста поведение, которое определяет/проверяет тест, так что когда тест не проходит, я легко узнаю , почему тест был первоначально написан. Я написал больше об этом здесь: http://blog.orfjackal.net/2010/02/three-styles-of-naming-tests.html

В вашем случае,

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

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

3
ответ дан 4 December 2019 в 02:25
поделиться

«Ошибки тестирования заставляют меня корректировать утверждения теста, а не исправлять ошибки регрессии в реальной кодовой базе».

Верно. Ваши требования изменились. Ваши тестовые утверждения должны измениться.

«Это заставляет меня чувствовать, что я просто зря потратил x часов своего дня»

Почему? Как еще вы собираетесь отслеживать изменения требований?

«Часто требуется больше времени для устранения ошибок тестирования и подтверждения, чем фактических ошибок регрессии»

Без шуток. Когда ваши требования постоянно меняются, требуется много времени и усилий для сопоставления изменений требований с изменениями результатов тестирования.

"что ... противоречит интуиции". Зависит от вашей интуиции. Моя интуиция (после 18 месяцев TDD) заключается в том, что изменение требований приводит к изменениям дизайна, множеству сложных тестовых изменений, отражающих изменения дизайна.

Иногда код меняется очень мало (или совсем не меняется).

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

Иди домой счастливым.

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

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

Если вы потратите 1 час на написание тестов и 1 час на написание кода, чтобы пройти тесты, это хорошо.

Если вы потратите 2 часа на исправление тестов из-за изменения требований и 1 час на то, чтобы код прошел исправленные тесты, это означает, что ваш код не очень устойчив к изменениям.

Если вы потратите 2 часа на исправление тестов из-за изменения требований и 1/2 часа на настройку кода, чтобы пройти эти тесты, вы написали действительно хороший код.

4
ответ дан 4 December 2019 в 02:25
поделиться

Я определенно второй ответ @S.Lott. Я просто хотел бы отметить, что когда спецификация устанавливается на кучах мертвых деревьев, когда требования меняются, мертвые деревья (или файлы текстового процессора) не кричат ​​на вас, как это делают тесты, поэтому все работает просто хорошо, за исключением того, что у вас есть эта куча мертвых деревьев, на которую все смотрят и говорят: «документация - вымысел».

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

Если вы считаете исправление нескольких тестов «потраченными впустую x часов моего дня», то, когда вы переходите ко второму тесту, вы не думаете о первом после того, как он прошел. Это повысит стоимость изменений. Вероятно, это правильное решение, но нет ничего плохого в том, чтобы посмотреть на тест и сказать, что он был преодолен последующими событиями, и просто отбросить его, просто не используйте это как дешевый выход.

1
ответ дан 4 December 2019 в 02:25
поделиться

С. Лотт почти все сказал. Я думаю, что единственное, что вам скажет соотношение изменений утверждений теста (T) и исправлений регрессии (R), - это комбинация того, насколько изменчивы ваши требования (что повысит T), и насколько успешным является код приложения при прохождении test (что повлияет на значение R). Эти два фактора могут варьироваться независимо в зависимости от качества ваших требований и процессов разработки.

0
ответ дан 4 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

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