Що означає "DAMP not DRY", коли говорять про одиничні тести?


345

Я чув, як хтось каже, що одиничні тести (наприклад, nUnit, jUnit, xUnit) повинні бути

ДАМП НЕ СУХА

(Наприклад, випробування блоку повинні містити "вологий код", а не "сухий код")

Про що вони говорять?


2
Немає нічого особливого в одиничних тестах, що не вимагає коду без DRY. Написання тестів, які не сушаться, - це привід лінивих програмістів намагатися вирізати територію для їх лінощів. Простіше кажучи, DRYness та читабельність - це ортогональні проблеми.
Acumenus

2
DRYness збільшує кодову відстань навігації, що, в свою чергу, сприймає більш високе розумове навантаження. Це стосується "нормального" текстового середовища. Редактор проекцій може зменшити ортогональність коду, але не у кожному випадку.
Петро

Відповіді:


596

Це баланс, а не суперечність

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

DAMP (Описові та значущі фрази) сприяє читанню коду.

Щоб підтримувати код, спочатку потрібно зрозуміти код. Щоб зрозуміти це, ви повинні його прочитати. Подумайте на хвилину, скільки часу ви витрачаєте на читання коду. Це багато. DAMP збільшує ремонтопридатність за рахунок скорочення часу, необхідного для читання та розуміння коду.

DRY (не повторюйте себе) сприяє ортогональності коду.

Видалення дублювання гарантує, що кожна концепція в системі має єдине авторитетне представлення в коді. Зміна єдиної бізнес-концепції призводить до однієї зміни коду. DRY збільшує ремонтопридатність, виділяючи зміни (ризик) лише на ті частини системи, які повинні змінюватися.

Отже, чому дублювання є більш прийнятним у тестах?

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

Крім того, видалення такого дублювання знижує читабельність тестів. Деталі, які раніше дублювались у кожному тесті, тепер приховані у новому методі чи класі. Щоб отримати повну картину тесту, вам доведеться подумки скласти всі ці шматки разом.

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

Як правило, надайте перевагу DRY у виробничому коді, надайте перевагу DAMP у тестовому коді. Хоча обидва є однаково важливими, з невеликою мудрістю ви можете довести баланс на свою користь.


18
Це чудовий, стислий підсумок. Я також хотів би зазначити, що тест DAMP є більш стійким на тлі зміни вимог, і вимірювання очевидності тесту є величезною перевагою, коли хтось інший повинен переписати ваші тести, щоб відповідати новим вимогам. Єспер Лундберг також має хороший трактат на цю тему.
Джейсон

3
@Jason, Btw чи є посилання на "Jesper Lundberg також має хороший трактат на цю тему" ?
Pacerier

2
@JohnSaunders, ви можете уникнути цього дублювання, використовуючи шаблон тестування даних тесту: natpryce.com/articles/000714.html
si618

2
Висушування тестового коду має можливість створити неясний тест, представивши таємницю гостя
jayeff

1
Я також додам, що добре написані тести - це по суті документація / коментарі до вашої заявки. Отож, більш описовий допомагає пояснити свої наміри іншим розробникам. І як каже ОП, вони містяться у кожному тесті, тому небезпека для вашої заявки мінімальна. Гірший сценарій - це те, що у вас є надлишковий тест або установка тесту, і для запуску тестового набору потрібно більше часу. Я скоріше помиляюся на стороні хорошого тестового покриття.
Лі МакАліллі

60

DAMP - описові та змістовні фрази.

"DAMP not DRY" визначає читабельність при повторному використанні коду. Ідея DAMP not DRY у тестових випадках полягає в тому, що тести повинні бути легко зрозумітими, навіть якщо це означає, що тестові випадки іноді мають повторний код.

Див. Також Чи дублюваний код є більш терпимим в одиничних тестах? для деякої дискусії щодо суті цієї точки зору.

Можливо, він був придуманий Джеєм Філдсом стосовно мов, що стосуються конкретного домену.


1
Хороша відповідь та посилання на пов'язане питання. Немає ідеального вибору DAMP проти DRY. Ми хочемо, щоб кодекс був максимально сухим, а тестування - не таким сухим, що тест стає важко зрозуміти. Коли тест не вдається, я хочу, щоб причина була очевидною, щоб розробник міг почати виправляти SUT, що означає, що я нахиляюся до коду DAMP в тестах. Як і в більшості програм програмування, завжди можна взяти щось надто далеко. Якщо ваш тестовий код настільки сухий, що він потребує тривалого часу, щоб визначити, як і чому тест не вдався, він може бути "занадто сухим".
Джеральд Девіс

29

"DRY" - це "Не повторюй себе"

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

"DAMP" - це "описові та значущі фрази".

Цей термін покликаний сказати вам написати код, який легко зрозуміє той, хто на це дивиться. Якщо ви дотримуєтесь цього принципу, у вас будуть довгі та описові назви змінних та функцій тощо.


15
AIUI, DRY - це не лише питання економії часу за допомогою повторного використання - це також запобігає виходу різних шляхів коду "поза синхронізацію". Якщо ви скопіюєте та вставте ту саму логіку в декілька класів, кожен екземпляр цього коду потрібно буде оновити, коли потрібні зміни. (І неминуче один з них не буде, і підірветься при здійсненні фізичних вправ.)
Анджей Дойл

20

Damp = 'Описові та значущі фрази' - ваші одиничні тести повинні бути в змозі бути "прочитаними":

Читання важливіше, ніж уникати зайвого коду.

Зі статті:

DAMP розшифровується як "описові та змістовні фрази" і є протилежністю DRY, не в тому сенсі, що він говорить: "все повинно виглядати як купа сміття і бути неможливим для читання", тому що читабельність важливіша, ніж уникати зайвого коду.

Що це означає і де його використовувати?

DAMP здебільшого застосовується при написанні тестового коду. Тестовий код повинен бути дуже легким для розуміння, до певної міри надмірності.


11

DAMP розшифровується як "описові та змістовні фрази" і є протилежністю DRY, не в тому сенсі, що він говорить: "все повинно виглядати як купа сміття і бути неможливим для читання", тому що читабельність важливіша, ніж уникати зайвого коду.

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


11

Тут вже є кілька відповідей, але я хотів додати ще одну, оскільки не думав, що вони обов'язково пояснюють це так добре, як могли.

Ідея DRY (не повторюйте себе) полягає в тому, що в коді програми ви хочете уникати зайвого або повторюваного коду. Якщо у вас є щось, що ваш код потрібно зробити кілька разів, ви повинні мати функцію або клас для нього, а не повторювати подібний код у кількох місцях.

Це досить відома концепція програмування.

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

наприклад: testWhenIAddOneAndOneIShouldGetTwo() { .... }

Коли ви читаєте назву методу DAMP, як це, ви повинні зрозуміти, що саме тестовий програвач намагався досягти, навіть не читаючи тестовий код (хоча тестовий код також може слідувати цій концепції, а також, звичайно, з іменами багатослівних змінних, тощо).

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

DAMP і DRY не суперечать один одному - вони охоплюють різні аспекти того, як написано ваш код - але, тим не менш, вони зазвичай не використовуються разом, оскільки методи, написані за принципом DRY, мають на увазі загальне призначення та навряд чи підходять. до високо конкретної назви методу. Таким чином, як правило, як пояснено вище, ваш додаток повинен бути DRY, а ваш код тесту DAMP.

Я сподіваюся, що це допоможе пояснити це трохи краще.


5

Я погоджуюся з Крісом Едвардсом у тому, що вам потрібно досягти рівноваги між ними. Ще одна річ, що слід зазначити, що якщо ви намагаєтесь видалити дублювання, ви в кінцевому підсумку додаєте багато додаткової структури у свій тестовий код одиниці (тобто, коли ви приймаєте DRY до крайнощів), ви ризикуєте ввести там помилки. У такій ситуації вам доведеться або провести тестування свого блоку, або залишити біт структури без перевірки.


0

Я не хочу дублювати зусилля тут, але ви можете мати тести, які є DAMP, але мають перевагу DRY. З іншого боку, тести DRY не задовольняють тести DAMP в деяких випадках.

Я спілкувався в блозі про DRY vs DAMP, який включає деякі приклади.

Жоден підхід не повинен бути вашим єдиним рішенням, іноді DAMP є надмірним, в іншому випадку дуже приємним доповненням.

Як загальне правило, слід застосувати правило трьох. Якщо ви помітите дублювання втретє, можливо, варто вивчити написання тестів стилю DAMP, але навіть тоді не все дублювання є поганим . Контекстні питання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.