Коли доцільно не проводити одиничний тест?


138

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

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

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

Тож я щоразу закінчую тим самим висновком. Рентабельність інвестицій занадто низька.

Я час від часу встановлюю кілька тестів, щоб переконатися, що я правильно написав алгоритм, як, наприклад, підрахунок кількості років, які хтось був у компанії на основі дати їх найму. Але з точки зору покриття кодом я покрив близько 1% свого коду.

У моїй ситуації, ви все-таки знайдете спосіб зробити тестування підрозділу звичайною практикою, або я обґрунтовано уникаю цих витрат?

ОНОВЛЕННЯ: Кілька речей щодо моєї ситуації, яку я пропустив: Мої проекти - це всі веб-програми. Щоб покрити весь мій код, мені доведеться використовувати автоматизовані тести інтерфейсу користувача, і це область, де я досі не бачу великої користі від ручного тестування.


1
Дякую всім. Я багато чого тут вчусь. Кілька речей про мою ситуацію, яку я пропустив: Мої проекти - це всі веб-програми. Щоб покрити весь мій код, мені доведеться використовувати автоматизовані тести інтерфейсу користувача, і це область, де я досі не бачу великої користі від ручного тестування.
Кен Песписа

1
Ми маємо великий успіх у Transactis, використовуючи інструмент тестування веб-автоматизації Telerik. У нас уже є десятки колишніх ручних тестів браузера, перетворених на автоматизацію. Автоматизовані тести ШЛЕШЕ швидше, а також ВЕЛИКІ для висвітлення будь-яких проблем із ефективністю вашого веб-сайту.
Джон Кастер

2
Я бачив проект, який намагався автоматизованим тестуванням браузера повних веб-сторінок. Наскільки я можу сказати, він не знайшов жодної із сотень серйозних помилок, які ми виявили за допомогою ручного тестування, і це коштувало величезної кількості часу на розробку та підтримку. (Використовуючи селен, керований NUnit). Гірше, що деякі тести часто не працюють із-за неполадок із браузером та тестовою рамкою.
O'Rooney

1
Це насправді не відповідь, а лише спостереження ... ваш аргумент проти тестування одиниць, тому що "вимоги змінюються занадто часто" нагадує мені зворотний аргумент, який я чую, де я працюю: "наші програми настільки статичні, у чому сенс тестування це майже ніколи не змінюється! " ;)
Бейн

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

Відповіді:


84

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

Тому? Вам не доведеться все тестувати . Просто відповідні речі.

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

Це насправді помилково. Це не більш ефективно. Це насправді просто звичка.

Інші розробники соло - це зробити ескіз чи контур, написати тестові випадки та потім заповнити контур кінцевим кодом.

Це дуже, дуже ефективно.

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

Це теж помилково. Тести не є тягарем. Зміни вимог - це перетягування.

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

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

Ви можете мати обмежений тест прийняття "ось це".

Або ви можете провести одиничні тести.

Або ви можете мати і те, і інше.

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

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


8
Мені подобається ваше перше твердження, щоб перевірити лише відповідні речі. Щодо ефективності тестування вручну та одиниці, я не вважаю, що моє твердження є повністю помилковим, а також ваше не зовсім правдивим. Здається, що слід знайти баланс між автоматичним та ручним тестуванням для досягнення максимальної ефективності.
Ken Pespisa

9
@Ken Pespisa: Вибач. Я пив TDD Kool-Aid близько двох років тому (після 30 років тестування). Тепер я застряг на першому тесті. Це зробило мене набагато, набагато продуктивнішим, тому що мені менше думати, коли будувати.
S.Lott

3
@Ken Pespisa: Ні. У відповідях є баланс. Якщо б ви запитали, чи правильно ділити на нуль, ви отримаєте переважні відповіді, нахилені в одну сторону з причини. Якщо ви запитали, чи sqrt(-1)повинно бути ціле число, ви отримаєте переважну відповідь, спираючись в один бік. Баланс навколо "як" і "який порядок". Одним із фактів є те, що ви повинні протестувати Тому спочатку напишіть тести і переконайтеся, що вони працюють.
S.Lott

21
Розгляньте модульне тестування інтерфейсу, а не деталі реалізації. Перевірте межі та кордони. Перевірте ризикований код. Багато коду досить просто перевірити інспекцією, хоча перевірка коду є більш схильною до помилок, ніж перевірка чужого коду. Перший час ручні тести можуть бути більш ефективними, в десятий раз автоматизовані тести вже наперед.
BillThor

10
"Код не зроблено, поки тести не пройдуть" - Не дуже, ІМО. Код починається, коли він проходить тести. Код не робиться, поки він не прожив рік-два і не зазнав стрес-тестів та інтеграційних тестів з великою, активною та нетерплячою базою користувачів. Це єдине тестування, яке насправді рахується.
Вектор

107

Уявіть, що у вас був набір тестів, який міг би працювати на блиску та запалюватиме зелене чи червоне світло. Уявіть, що цей набір тестів перевірив усе ! Уявіть, що все, що вам потрібно було зробити для запуску набору тестів, було набрати ^ T. Яку силу вам це дало б?

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

Так, ви могли б зробити все це! А що буде з вашим кодом з часом? Він стане чистішим та чистішим, оскільки не буде ризику його очищення.

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

Скільки налагодження, на вашу думку, ви зробили б?

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

Скажімо, ви повертаєтесь до системи, яку ви побудували рік тому, і ви забули, як створити один з центральних об’єктів. Існують тести, які створюють цей об'єкт усіляко, як він може бути створений. Ви можете прочитати ці тести і пробіг свою пам'ять. Вам потрібно зателефонувати в API? Існують тести, які викликають цей API всі способи його виклику. Ці тести - це невеликі документи , написані зрозумілою мовою. Вони абсолютно однозначні. Вони настільки формальні, що страчують. І вони не можуть вийти з синхронізації з додатком!

Не варто інвестувати? Ти мусиш жартувати мене! Як хтось НЕ захотів цього тесту? Зробіть собі прихильність і перестаньте хизуватися через дурість. Навчіться робити TDD добре і дивіться, наскільки швидше ви їдете та наскільки чистіший ваш код.


28
Вау, дядько Боб? Чудово дістати свої думки тут. Я згоден з вами щодо переваг TDD, насправді аргументів там не було. Питання стосується вкладення часу та рентабельності інвестицій. Мені не дурно вважати ці речі. Уявіть, що проект потребує у мене на 50% більше часу, щоб закінчити TDD, ніж без нього, і фея говорить мені, що це заощадить мені лише 10% часу на ручне тестування протягом життя проекту. Це може здатися фантазією, але я вважаю це цілком правдоподібним у певних проектах.
Ken Pespisa

11
@Ken "Уявіть, що проект піде на 50% більше часу, щоб закінчити TDD, ніж без". Це звучить ТОЧНО, як фантазія для мене. Насправді, це здається, що ви щойно витворили цю фігуру на місці, не маючи доказів, щоб це підтвердити.
Рейн Генріхс

18
@Rein Henrichs - Звичайно, я зробив це число, це було гіпотетичним твердженням. Я зазначаю, що TDD додає значну кількість часу проекту, і я повинен розглянути, чи збираюся я отримати щось взагалі рівноцінного або кращого значення. Вам не доведеться переконувати мене в значеннях TDD, я переконаний. Але це не панацея.
Кен Песписа

11
@Rein, що саме є "наявними доказами"? Будь ласка, докладно.
Кен Песписа

22
@Uncle Bob "Замініть брову на кілька секунд": Ви, звичайно, жартуєте. TDD - хороший інструмент, але ви повинні протестувати лише відповідні частини, інакше ви витрачаєте більше часу на тестування, ніж на будь-яку серйозну розробку. Це особливо актуально, коли вимоги змінюються дуже швидко: ти постійно пишеш і відкидаєш тести для занять, які весь час змінюються. Я не кажу, що TDD поганий, його потрібно просто використовувати розумно, а не застосовувати механічно, як вам здається, ви пропонуєте.
Джорджо

34

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

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

По-друге, їх виявлення виявляє помилки, які в іншому випадку з’являться при тестуванні.

По-третє, їх запущення іноді виявляє помилки, які інакше не з’являться при тестуванні, а потім справді кусають вас у дупу на виробництві.

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

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

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


2
@Ken, тестові пакети - це специфікації у виконаному вигляді.

32

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

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

  1. Напишіть тест
  2. Слідкуйте за тим, щоб не вдалося (доведіть, що вам щось потрібно)
  3. Напишіть лише те, що потрібно для проходження тестового проходу - не більше.
  4. Дивись, як це проходить (так!)
  5. Рефактор (покращити його)
  6. Вимийте, промийте та повторіть

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

Тепер вам потрібно перевірити такі речі, як C # властивості? Уявіть собі властивість, визначену так:

bool IsWorthTesting {get; set;}

Відповідь була б "ні", це не варто тестувати, тому що в цей момент ви тестуєте мовну особливість. Тільки довіртесь, що хлопці з платформи C # правильно зрозуміли. Крім того, якщо це не вдалося, що ви могли б зробити, щоб виправити це?

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

  • Перевірили винятки, які можуть статися лише в тому випадку, коли встановлення пішло погано. У Java є багато таких. Вам потрібно написати блок спіймання або оголосити перевірений виняток, навіть якщо немає способу його не вдатися без злому встановлених файлів.
  • Інтерфейси користувача. Пошук тестового контролю та виклик правильних подій для імітації дій користувача дуже клопітно, а в деяких випадках неможливо. Однак якщо ви використовуєте модель Model / View / Controller, ви можете переконатися, що ваша модель та контролери перевірені та залишити перегляд деталі вручну.
  • Взаємодія клієнт / сервер. Це вже не одиничний тест, а тепер інтеграційний тест. Напишіть усі частини, які надходять до надсилання та отримання повідомлень по дроту, але насправді не переходьте по дроту. Хороший підхід полягає у зменшенні відповідальності коду, який насправді передає провід до необмежених комунікацій. У вашому тестовому коді одиниці вимкніть об’єкт зв’язку, щоб переконатися, що служби ведуть себе так, як ви очікували.

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


24

Ви повинні збалансувати вартість тестування з вадами помилок.

Писати тест на 10 рядків для функції, яка відкриває файл, де збій "файл не знайдено" є безглуздим.

Функція, яка робить щось складне до складної структури даних - тоді, очевидно, так.

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


23

Тестування - азартні ігри.

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

Як і будь-яка ставка, іноді ви виграєте, іноді програєте.

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

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


3
Хороша відповідь. Один з небагатьох, який дійсно відповідає на моє оригінальне запитання. Я занурився у світ тестування з часу написання цього допису (мені це подобається до речі.) Мені потрібно більше зрозуміти його, перш ніж я зможу по-справжньому знати, коли ним користуватися (чи ні). З багатьох наведених тут причин я вважаю за краще використовувати його постійно. Але в кінцевому рахунку це буде залежати від того, наскільки швидше я досягти цього, адже врешті-решт це азарт мого часу, який знаходиться під контролем моєї компанії / клієнта, і часто вони зосереджуються на нижніх кутах трикутника проекту: en. wikipedia.org/wiki/Project_triangle
Ken Pespisa

10

Моя порада - лише перевірити код, який ви хочете працювати належним чином.

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


9
Нагадує мені вислів мого зубного лікаря: Вам не доведеться вибивати всі зуби, лише ті, які ви хочете зберегти.
Кен Песписа

Зізнаюся, саме це змусило мене задуматися. ;-)
Нік Ходжес

8

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

Тестування TDD та Unit - це не одне і те ж.

Ви можете написати код, а потім додати одиничні тести пізніше. Це не TDD, і це багато зайвої роботи.

TDD - практика кодування в циклі Червоного світла. Зелене світло. Ітерації рефактора.

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

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


Не могли б ви детальніше розповісти про те, як зникають поодинокі помилки? Ви хочете сказати, що ви можете швидше отримати відповідь про те, чи є індекс масиву нульовим чи одноосновним шляхом тестування, ніж пошук документації? Мені здається малоймовірним - я досить швидкий в Google :)
Кен Песписа

1
Насправді, написання TDD - це відмінний спосіб вивчити API (включаючи застарілу базу коду для цілей документування функціональності).
Френк Ширар

Також дуже корисно, якщо цей API колись зміниться ... У вас раптом у вас є якісь невдалі тести :-)
bitsoflogic

@Ken Pespisa, Це, безумовно, швидше - напишіть код на основі того, чи вважаєте ви, що це 0 або 1, запустіть його, виправте його, якщо потрібно. Більшу частину часу ви будете мати рацію, і вам би не довелося шукати це, якщо ви помиляєтесь, знаєте протягом 10 секунд.
Пол М'ясник

Дуже цікава вигода. Мені це подобається.
Кен Песписа

3

Я працював над системою, де ми протестували майже все. Помітними виконанням для тестування були вихідний код PDF та XLS.

Чому? Нам вдалося протестувати частини, які збирали дані, і побудували модель, яка використовувалася для створення результату. Нам також вдалося протестувати частини, які з'ясували, які частини моделі перейдуть до PDF-файлів. Ми не змогли перевірити, чи PDF виглядав нормально, оскільки це було абсолютно суб'єктивно. Ми не змогли перевірити, чи всі частини PDF-файлу читалися типовому користувачеві, оскільки це було також суб'єктивно. Або якщо вибір між діаграмами та круговими діаграмами був правильним для набору даних.

Якщо результат буде суб'єктивним, мало одиничних тестувань, ви можете зробити те, що варто зусиль.


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

2

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

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

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

TL; DR Це дійсно ніколи не підходить, оскільки переваги просто надто хороші.


2

Два дуже хороших відповіді, які я натрапив, є тут:

  1. Коли проводити тестовий модуль проти тестування вручну
  2. Що не тестувати, коли мова йде про тестування одиниць?

Обгрунтування уникнення сприйнятого накладних витрат:

  • Негайне економія часу / витрат для вашої компанії
  • Потенційний час / економія витрат на усунення несправностей / ремонту / розширення в довгостроковій перспективі навіть після того, як ви не підете.

Чи не хочете ви залишити чудовий продукт з вашої сторони як доказ якості вашої роботи? Якщо ви говорите по-егоїстичному, чи не краще для вас, що ви робите?


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

1

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

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

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

Я б не повертався назад і писав цілу партію тестів для коду, який ви вже відправили, але наступного разу, коли вам потрібно змінити функцію, я б запропонував спробувати написати тести для цього модуля або класу, отримайте покриття до 70% + перед тим, як застосувати будь-які зміни. Подивіться, чи допоможе вам це.

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


Мені подобаються думки щодо запобігання регресу та додання впевненості. Саме ці причини я хочу додати тести.
Кен Песписа

1

Здається, що більшість відповідей є про-TDD, навіть якщо питання стосувалося не TDD, а загальних тестів.

Не стоїть цілком об'єктивне правило, що робити тест одиничного тесту чи не для одиничного тесту. Але є кілька разів, коли, здається, багато програмістів не проводять тест:

  1. Приватні методи

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

  1. Речі, які ви вже знаєте, повинні працювати (або речі, перевірені кимось іншим)

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

І те і інше можна застосувати, чи ви робите TDD, чи ні.


0

Кен, я та багато інших розробників там прийшли до того самого висновку, що й ти кілька разів протягом усієї нашої кар’єри.

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

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

public interface ITest {
    public string Name {
        get;
    }
    public string Description {
        get;
    }
    public List<ITest> SubTests {
        get;
    }
    public TestResult Execute();
}

public class TestResult {
    public bool Succesful {
        get;
        set;
    }

    public string ResultMessage {
        get;
        set;
    }

    private Dictionary<ITest, TestResult> subTestResults = new Dictionary<ITest, TestResult>();
    public Dictionary<ITest, TestResult> SubTestResults {
        get {
            return subTestResults;
        }
        set {
            subTestResults = value;
        }
    }
}

Єдиною складною частиною після цього є з'ясування того, який рівень деталізації, на вашу думку, є найкращим "ударом за долар" для будь-якого проекту, який ви робите.

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

Удачі!


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

Я думаю, що ви можете отримати користь від використання такої структури, як SubSpec (вона натхненна BDD), що дозволить вам отримати Isort Assert ("SubTest") під час налаштування контексту обміну.
Йоханнес Рудольф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.