Чи потрібно все тестувати?


28

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

Чи потрібно перевірити кожну частину моєї програми, включаючи статичні сторінки?


9
Це насправді не питання про рубін на рейках. це більше питання TDD.
Джон Страйер

4
@JonStrayer: Це? Ви впевнені, що відповідь буде однаковою для RoR як .NET? Я б припустив, що, замислившись, RoR свідомо знизив витрати на тестування, не маючи при цьому безпеку типу у вигляді компілятора, значно збільшує перевагу тестування.
pdr

1
Чомусь це питання змушує мене опублікувати макрос зображення капітана Нерона, який кричить "ТЕСТУЙ ВСЕ !!!"
Мейсон Уілер

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

1
Зачекайте, поки ви вирішите переструктурувати свій код. Щоразу, коли вводяться масові зміни, вам потрібно перевірити функціональність. Без тестів вам потрібно буде пройти свою програму і протестувати всю функціональність вручну. Введіть ще одне велике оновлення, і вам доведеться це зробити ще раз. Тестові одиниці - це лише «дешевий» спосіб переконатися, що все працює так, як очікувалося.
Еван Плейс

Відповіді:


47

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

Отже, маючи на увазі, яка поведінка статичної сторінки та що таке інтерфейс?

Моя перша відповідь була б "ні" і "ні".


так що немає тестів для статичних сторінок?
Маттео Пальяцці

TDD певною мірою стосується дизайну. Але вам все одно потрібна архітектура. Не маючи на увазі архітектури, важко уявити, як органічно виростатимуть із купки тестів.
Роберт Харві

@MatteoPagliazzi Залежно від рівня тестування (одиничні тести / інтеграційні тести / тощо), можливо, для підтвердження статичних сторінок доступні, можливо, одна або дві. Але це занадто високий рівень для одиничних тестів.
Ізката

1
@RobertHarvey Я не сказав нічого не перевіряти. Я сказав, що не тестуйте статичні сторінки.
Джон Страйер

@JonStrayer: TDD'ers, як правило, підтримують TDD як якийсь магічний еліксир для дизайну; Прошу вибачення, якщо це не те, що ви мали на увазі. :)
Роберт Харві

32

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

Також варто врахувати вартість часу на ринок. Можливо, вам краще поставити функцію, що працює в основному, ніж запізнюватись із функцією, що повністю працює.

На ці питання майже неможливо відповісти в загальному ІМО.

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


Крім того, я б припустив, що помилки на статичній сторінці буде МНОГО простіше виправити, ніж логічні помилки, помилки дизайну та тип речей, які TDD зазвичай використовується для запобігання. Як виявити, так і виправити помилки статичних сторінок, ймовірно, буде досить просто, і моє враження, що TDD використовується для скорочення обох цих процесів, коли вони займають більше часу, ніж бажано. : D
Гордон Густафсон

Я б цього не припускав. Якщо ви коли-небудь стикалися з незрозумілою поведінкою версії браузера або дивними проблемами пам’яті javascript, ви, швидше за все, отримали досить тренування. Частіше, тому що мови в кінці можуть бути трохи більш надійними та стандартними. іноді. Можливо, ви говорите про статичну, як у html, і не маючи JavaScript.
Майкл Дюррант

8

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


"тоді ви можете бути впевнені, що додавання нового коду не призводить до того, що код на місці не перестане працювати" таким чином, я не повинен торкатися жодного фрагмента коду, який я писав раніше, і додавати нові методи?
Маттео Пальяцці

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

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

@deworde Я боюся зробити безпеку ниток членів екземпляра не все так часто. Більш звичним є контроль доступу до безпечного типу без теда, ніж намагатися зробити їх безпечними. У будь-якому випадку тестування - це ціна - вигода, як говориться в іншій відповіді. Ви можете витратити час на написання тестів для геттерів або сетерів або ви можете перевірити фактичну поведінку, яку ваша система повинна інкапсулювати.
Енді

3

Так, слід все перевірити ...

Вам не потрібно буде писати автоматизовані тести на все. Для своїх статичних сторінок перегляньте, використовуючи http://seleniumhq.org/ Selenium, щоб переконатися, що все правильно.

З мого досвіду, деякі речі на передній частині розташовані поруч із неможливим складання тестових випадків, але саме тому ви насправді хочете перевірити, використовуючи очне яблуко Mark 1.


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

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

2

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

Хоча тестувати все неможливо (особливо з невеликими командами та великими системами), це не означає, що ви пропустили тестування взагалі. Чи варто тестування? Див. Розділ «Раннє пошуку несправностей» у розділі Див. Wiki-SoftwareTesting .


2

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


2

Як уже згадували інші, для тестування Ruby on Rails це набагато важливіше, ніж для (більшості) інших мов. Це пов’язано з відсутністю компілятора.

Такі мови, як Delphi , C ++, VB.NET і т. Д. ..., складаються з мов, і ваш компілятор підбере безліч помилок, таких як помилки при викликах методу. У Ruby on Rails ви дізнаєтесь лише про те, чи є помилка друку чи помилка у вашому коді, якщо цей конкретний рядок коду запускається або ви використовуєте IDE, що демонструє візуальні попередження.

Оскільки ВСЯГО важливий єдиний рядок коду (інакше його не було б), ви повинні перевірити кожен метод, який ви пишете. Це набагато простіше, ніж це звучить, якщо дотримуватися деяких основних інструментів TBDD.

Я виявив, що " Рейки " Райана Бейтса на тему " Як я тестую" для мене неоціненний, і я дуже підкреслив простоту TBDD, якщо зробити це правильно.


1

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


2
так ... але, наприклад, на статичній сторінці, що я повинен перевірити? існування? що зміст та посилання існують? Можливо, я помиляюся, але, здається, марна трата часу ...
Маттео Пальяцці

1
Я схильний вважати, що методологія TDD застосовується до вашої логіки. Ваша статична сторінка - HTML-файл? Перегляд MVC, який ніколи не змінюється? Якщо в останньому випадку я думаю, ви можете перевірити, чи ваш контролер повертає належний вигляд. Я думаю, що важливіше - пам’ятати, що TDD повинен допомагати вам розвиватися проти вашої специфікації, а не просто "тестувати" ...
wessiyad

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

0

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

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

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

Так що це?

Ось думка. Не будемо мати величезних складних ланцюгів залежностей в першу чергу, розглядаючи наступні два принципи об'єктно-орієнтованого дизайну від «Шаблони дизайну»:

"Програма на інтерфейс, а не реалізація"

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

І:

"Композиція вподобаного об'єкта над успадкуванням класу"

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

І ось я дістаюся до речі, яка мене клопоче. Чи дійсно TDD допомагає в дизайні чи дозволяє погана архітектура? Мені здається, він має потенціал бути самореалізаційною стратегією. Чим більше вашій команді не потрібно нести відповідальність за погану архітектуру, тим кориснішими стають ті детальні компоненти для тестування, але в кінцевому підсумку ваш додаток стає все більшим ПІТА, з яким працюватимуть (якщо припустити, що вони ніколи не замислювалися над архітектурою в першу чергу місце). І невпізнання наслідків цього - це опускання рук, завжди найдорожча помилка, яку ви можете допустити, працюючи над додатком, який має бути оновлений і змінений з часом.


-1

Щоб відповісти на запитання, подумайте, «що тут може піти не так». Зокрема, якщо ви зміните "код" (розмітку / що завгодно), як ви будете впевнені, що ви не зламали сторінку. Що ж, для статичної сторінки:

  • він може не відображатися
  • це може відображатися неправильно
  • JS може не завантажуватися
  • шляхи для зображень можуть не працювати
  • посилання можуть бути порушені

Особисто я рекомендую:

  • написати тест селену [1], який перевіряє наявність одного рядка, який ви очікуєте на сторінці (якщо можливо, біля нижньої частини). Це підтверджує, що вона надає.
  • перевірте, чи немає помилок JS (я думаю, що селен дозволяє це)
  • запустіть статичні сторінки через валідатор html і, якщо можливо, перевірку посилань.
  • Я не знайшов інструмент, який би мені хотілося перевірити JS, але ви можете знайти успіх у jslint або jshint.

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


-1

Просто додати до всіх і без того чудових відповідей, ось моє роздуми щодо тестування, а що не для перевірки:

Зробіть тест:

  • логіка бізнесу
  • логіка програми
  • функціональність
  • поведінка,
  • Отже, все, справді, крім :

Не тестуйте:

  • константи
  • презентація

Тому немає сенсу проводити тест, який говорить:

assert wibble = 3

і якийсь код, який говорить

wibble = 3

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

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

Таким чином, у нашому додатку у нас є тест, який перевіряє, що умови та умови доступні в кожній частині сайту - для анонімних користувачів, для користувачів, які ввійшли в систему, на інформаційній панелі, на екранах додатків тощо. Він просто перевіряє наявність посилання під назвою "Загальні положення та умови" на кожній сторінці, що посилання працює, і тоді тест говорить, що коли він потрапляє на сторінку, він "схожий на" Ц & С - просто достатньо, щоб запевнити себе, що це правильна сторінка, без "тестування константи" або "тестування презентації" ... щоб ви могли перевірити правильність тексту, наприклад, не перевіряючи конкретний розмір шрифту чи макет тексту ...

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