Что означает «DAMP not DRY», говоря о модульных тестах? - PullRequest
305 голосов
/ 23 июня 2011

Я слышал, как кто-то сказал, что юнит-тесты (например, nUnit, jUnit, xUnit) должны быть

DAMP , а не DRY

(Например, модульные тесты должны содержать «код с влажным кодом», а не «код с сухим кодом»)

О чем они говорят?

Ответы [ 8 ]

514 голосов
/ 07 августа 2012

Это баланс, а не противоречие

DAMP и DRY не противоречат друг другу, скорее, они уравновешивают два различных аспекта возможности сопровождения кода . Сопровождаемый код (код, который легко изменить) является конечной целью здесь.

DAMP (Описательные и осмысленные фразы) способствует удобочитаемости кода.

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

СУХОЙ (Не повторяйте себя) продвигает ортогональность кода.

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

Итак, почему дублирование более приемлемо в тестах?

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

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

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

Как правило, поддерживайте DRY в рабочем коде, предпочитайте DAMP в тестовом коде. Хотя оба одинаково важны, с небольшой мудростью вы можете изменить баланс в свою пользу.

59 голосов
/ 23 июня 2011

DAMP - Описательные и осмысленные фразы.

Значения «DAMP not DRY» читаются при повторном использовании кода.Идея DAMP, а не DRY в тестовых случаях заключается в том, что тесты должны быть простыми для понимания, даже если это означает, что тестовые примеры иногда содержат повторяющийся код.

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

Возможно, она была придумана Jay Fields , в связи с предметно-ориентированными языками.

29 голосов
/ 23 июня 2011

«СУХОЙ» - «Не повторяйся»

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

"DAMP" - это "Описательные и значимые фразы".

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

18 голосов
/ 23 июня 2011

Damp = «Описательные и осмысленные фразы» - ваши юнит-тесты должны быть в состоянии «прочитать»:

Читаемость важнее, чем избегая избыточного кода.

Из статьи:

DAMP означает «описательные и осмысленные фразы» и является противоположностью DRY, не в том смысле, что в нем говорится, что «все должно выглядеть как куча мусора и быть невозможным для чтения», в том смысле, что читаемость важнее, чем избегать избыточных код.

Что это значит и где его использовать?

DAMP в основном применяется при написании тестового кода. Тестовый код должен быть очень простым для понимания до такой степени, что некоторая избыточность является приемлемой.

11 голосов
/ 08 декабря 2011

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

Идея СУХОГО (не повторяйся) заключается вчто в вашем коде приложения вы хотите избежать избыточного или повторяющегося кода.Если у вас есть что-то, что ваш код должен делать несколько раз, у вас должна быть функция или класс, а не повторять похожий код в нескольких местах.

Это довольно известная концепция программирования.

DAMP (Описательные и значимые фразы) - для ваших юнит-тестов.Идея заключается в том, что имена ваших методов модульного тестирования должны быть длинными и описательными - по сути, короткие предложения, описывающие то, что вы тестируете.

Например: testWhenIAddOneAndOneIShouldGetTwo() { .... }

Когда вы читаете DAMPПодобное имя метода, вы должны точно понимать, что автор теста пытался достичь, даже не читая тестовый код (хотя тестовый код также может следовать этой концепции, конечно же, с многословными именами переменных и т. д.).

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

DAMP и DRY не противоречат друг другу - они охватываютразличные аспекты написания вашего кода, но, тем не менее, они обычно не используются вместе, потому что методы, написанные с учетом принципа СУХОЙ, будут универсальными и вряд ли будут подходить для очень специфического имени метода.В общем, поэтому, как объяснено выше, код вашего приложения должен быть СУХИМЫМ, а код модульного тестирования - DAMP.

Надеюсь, это поможет объяснить его немного лучше.

11 голосов
/ 23 июня 2011

DAMP означает «описательные и осмысленные фразы» и является противоположностью DRY, не в том смысле, что он говорит, что «все должно выглядеть как куча мусора и быть невозможным для чтения», в том смысле, что читаемость важнее, чем избегать избыточных код.

http://codeshelter.wordpress.com/2011/04/07/dry-and-damp-principles-when-developing-and-unit-testing/

5 голосов
/ 27 марта 2014

Я согласен с Крисом Эдвардсом в том, что вам нужно найти баланс между ними. Еще одна вещь, на которую следует обратить внимание: если вы пытаетесь удалить дублирование, то в конечном итоге добавляете много дополнительной структуры в код модульного теста (т. Е. Когда DRY доводится до крайностей), вы рискуете ввести туда ошибки. В такой ситуации вам придется либо выполнить модульное тестирование своих модульных тестов, либо оставить биты структуры непроверенными.

0 голосов
/ 13 апреля 2015

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

Я писал о DRY против DAMP, который включает в себя несколько примеров.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...