Вам справді доводиться спочатку робити тест на BDD / TDD?


11

Незважаючи на те, що я не був у проекті TDD чи BDD, або я був у деяких, хто каже, що вони роблять TDD, але знаходяться досить далеко від цього, це те, про що я думаю, і намагаюся прочитати якомога більше о.

Повернення до питання. Коли ви робите BDD, ви повинні спочатку написати свій "тест" і зробити його невдалим, правда? А потім реалізуйте цю функцію або те, що ви її називаєте. Але якщо ви поставите це до крайності, чи не може це бути якийсь розвиток згори вниз? Ви дивитесь на свій інтерфейс і каже: "Я хотів би мати цю особливість / поведінку тут". Потім ви виправите свій інтерфейс користувача, щоб реалізувати цю функцію та код, який підтримує інтерфейс користувача. На даний момент ви не реалізували жодної логіки бізнесу або логіки доступу до даних, ви просто реалізували свою поведінку. На що я прагну замість того, щоб написати тест, спочатку ви напишете свій код інтерфейсу. У деяких випадках це повинно призвести до того ж коду для доступу до даних та бізнес-рівня, оскільки ви використовуєте свій код інтерфейсу для визначення того, що потрібно підтримувати вашому бізнесу.

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

Будь-які думки?


Тести в TDD - це одиничні тести, які керують модулем безпосередньо так, як якщо б це було через окремий main. У коментарі зверху вниз ви говорите про функціональні тести, які виконують всю програму хоч єдину main.
Macneil

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

1
@Macneil: Це поширена помилка. Тести TDD не є одиничними тестами. TDD тестує функції , які не мають встановленої шкали.
Стівен А. Лоу

2
Але є встановлена ​​шкала: тест повинен швидко виконатись у TDD. Необхідно пройти тести, які також виходять за рамки TDD. Загалом TDD - це план розвитку, а не план тестування.
Macneil

@Macneil: "швидко" - відносний термін. Тестовий набір в моєму останньому проекті виконується приблизно за 30 хвилин. Він замінює 8 годин ручного тестування. Це "досить швидко"!
Стівен А. Лоу

Відповіді:


8

Ви говорите про BDD з точки зору високого рівня тестування вашого інтерфейсу. Тестування на цьому рівні трохи більш пухнасте, ніж нижче в коді Javascript / сервера.

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

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

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

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


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

17

Так! В іншому випадку ви отримаєте тестування на основі розвитку .

Реально кажучи, проте, існують проблеми, до яких важко підійти, використовуючи «чистий» TDD. Ви можете бути більш продуктивним, написавши якийсь непокритий виробничий код на передній частині і покривши його тестами пізніше (і навчившись вирішувати подібні проблеми з TDD у майбутньому). Подивіться на цю техніку , яку її автор назвав TDD промивання та повторення, щоб отримати кращий термін.


3
Перший рядок - приголомшливий.
EpsilonVector

У порівнянні з TDD це правда, але все, що робити згори вниз, повинно добре узгоджуватися з BDD, правда? Я дивлюся на графічний інтерфейс і вказую поведінку, яку я хочу, переконуюсь, що я не пишу "тест на поведінку" відразу, але я вказав поведінку через користувальницький інтерфейс перед тим, як застосувати його.
Томаш Янссон

15

Якщо ви не пишете свої тести спочатку, ви не рухаєте розробку через свої тести. Ерго, ви не займаєтеся тестовими розробками!


Справедливістю не є питання більше про те, чи слід робити BDD (не TDD) спочатку тест?
bytedev

Не соромтеся замінювати "тест" на "поведінку". Я не бачив нічого, щоб переконати мене в тому, що в самому серці є велика різниця між TDD і BDD. Зосередьтеся, можливо. Але основна ідея? Не так багато.
Френк Ширар

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

TDD спеціально означає написання тестів перед кодом. Якщо вам це не подобається, подумайте про Кента Бека, який винайшов цей термін. Написання тестів після вашого коду може певним чином керувати вашим кодом , але ви все одно можете обдурити себе, вважаючи, що ви керуєте своїм кодом за допомогою тестів, коли вас немає. І важче написати ці тести, тому що часто доводиться змінювати неперевірений код . Бачив це занадто часто, щоб згадати.
Френк Ширар

@FrankShearar Я визнав, що це не TDD відповідно до того, що сказав Кент Бек, але, чесно кажучи, мені все одно, що сказав якийсь випадковий чоловік. Його ідеально можна керувати дизайном коду через тести, не записуючи попередньо тести.
альтернатива

4

Якщо ви хочете працювати так, ідіть до цього. Але це не тестова розробка.


3

Те, що ви описуєте, дуже схоже на підхід до дизайну Front-Ahead . На жаль, дизайн Front-Ahead - це сатиричний удар Алекса Пападімуліса при спритних методах.


Мені було цікаво, чи знаєте ви про будь-які статті, які відбиваються на FAD, розкриваючи його сатиричний удар?
CL22

3

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

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

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