Перевірка найкращих практик для тестування новичка


29

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

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

Мені було просто цікаво, чи хтось може дати гарну пораду:

  1. Чи слід дивитись на тестування одиниць на початку проекту і, можливо, застосувати підхід до TDD.
  2. Чи потрібно просто писати тести, коли я йду разом, після того, як кожен розділ буде завершений.
  3. Чи повинен я завершити проект, а потім написати кінцеві тести наприкінці.



Відповіді:


29

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

Перш за все - написати кілька тестів з одиниці. Спочатку вони не повинні бути ідеальними. Просто навчіть себе, як тестувати невеликі одиниці коду та як використовувати глузування для ізоляції компонентів.

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

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

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

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

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


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

@pdr Чи є у вас посилання, які я можу вивчити на "добре написанні одиничних тестів"?
Гастон

9

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

Моя відповідь - однозначне "так". Я навчився підходу TDD близько 10 років тому, після аналогічного часу кодування без тестів. У ці дні, якщо я роблю щось коротке (<250 локальних) і просте, або щось, що викидається, я не буду його TDD. Інакше я це роблю, і саме тому, що це економить час.

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

Що менше страх, то він більш тонкий. Поки ви не провели деякий час у кодовій базі TDD, ви навіть не усвідомлюєте, скільки часу витрачаєте на занепокоєння щодо змін, які ви вносите. Чи працює X? Чи зламає Y? Чи є якийсь Z, на який це може вплинути? З TDD це відходить, тому що ви перетворюєте свої страхи в тести, а потім комп'ютер автоматизує занепокоєння. Хоробріший розробник - швидший розробник.


1
+1 за менший страх. На цьому тижні я переробляю тестову кодову базу. . .
Wyatt Barnett

2
Чудова цитата: "Ви перетворюєте свої страхи в тести, і тоді комп'ютер автоматизує занепокоєння"!
RichVel

5
  1. Чи варто дивитись на підрозділ на початку та застосовувати TDD-підхід.

  2. Чи потрібно просто писати тести, коли я проходжусь після кожного розділу.

Будь-який із них, але не третій варіант .

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

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

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


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

2

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

Щоб пояснити, що таке Code Katas для тих, хто не знає, перегляньте наступне посилання: Code Katas

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