Існує дві причини для написання тестів:
- Ствердження очікуваної поведінки
- Запобігання регресу поведінки
Прийняття (1) Відстоювання очікуваної поведінки:
Коли ви стверджуєте очікувану поведінку, ви хочете переконатися, що код працює так, як ви вважаєте, що повинен. Це фактично автоматизований спосіб здійснення вашої рутинної ручної перевірки, яку будь-який розробник виконує при впровадженні будь-якого типу коду:
- Чи спрацювало те, що я щойно писав?
- Цей цикл насправді закінчується?
- Це цикл у тому порядку, який, на мою думку, є?
- Чи буде це працювати для нульового вводу?
Це питання, на які ми всі відповідаємо головою, і, як правило, ми також намагаємось виконати код у своїх головах, переконуючись, що це здається, що він працює. У цих випадках часто буває корисно, щоб комп’ютер відповідав на них остаточно. Отже, ми пишемо модульний тест, який стверджує, що він це робить. Це дає нам впевненість у нашому коді, допомагає нам виявляти дефекти на ранніх стадіях і навіть може допомогти в реальній реалізації коду.
Це гарна ідея робити це там, де ви вважаєте за потрібне. Будь-який код, який трохи хитро зрозуміти або є нетривіальним. Навіть тривіальний код може отримати від цього користь. Вся справа у вашій власній впевненості. Як часто це робити і як далеко їхати, залежатиме від вашого власного задоволення. Зупиніться, коли зможете впевнено відповісти «Так»: Ви впевнені, що це працює?
Для такого роду тестування ви не дбаєте про видимість, інтерфейси чи щось інше, вам важлива лише наявність робочого коду. Так що так, ви б протестували приватні та захищені методи, якщо вважаєте, що їх потрібно перевірити, щоб ви відповіли так на запитання.
Прийняття (2) Запобігання регресу поведінки:
Отримавши робочий код, потрібно мати механізм захисту цього коду від майбутніх пошкоджень. Якщо ніхто більше ніколи не торкався вашого джерела та вашої конфігурації, вам це не знадобиться, але в більшості випадків ви або інші люди торкаєтеся джерела та конфігурацій вашого програмного забезпечення. Ця внутрішня скрипка дуже ймовірно порушить ваш робочий код.
Механізми існують у більшості мов вже як спосіб захисту від цієї шкоди. Особливості видимості - це один механізм. Приватний метод є ізольованим і прихованим. Інкапсуляція - це ще один механізм, коли ви розділяєте речі, щоб зміна інших відсіків не впливала на інші.
Загальний механізм цього називається: кодування до межі. Створюючи межі між частинами коду, ви захищаєте все, що знаходиться в межах, від речей поза ним. Межі стають точкою взаємодії та договором, за допомогою якого речі взаємодіють.
Це означає, що зміни межі, або порушуючи її інтерфейс, або порушуючи очікувану поведінку, можуть пошкодити та, можливо, порушити інші межі, які на неї покладалися. Ось чому є гарною ідеєю мати юніт-тест, який націлений на ці межі та стверджує, що вони не змінюються в семантиці та поведінці.
Це ваш типовий модульний тест, про який більшість говорять, згадуючи TDD або BDD. Справа в тому, щоб загартувати межі та захистити їх від змін. Ви не хочете перевіряти для цього приватні методи, оскільки приватний метод не є межею. Захищені методи - це обмежені межі, і я б їх захистив. Вони не потрапляють у світ, але все одно потрапляють в інші відсіки або "одиниці".
Що з цього робити?
Як ми вже бачили, є вагома причина для тестування загальнодоступних та захищених методів, оскільки стверджуємо, що наші інтерфейси не змінюються. І є також вагома причина для тестування приватних методів, щоб підтвердити наші роботи з реалізації. Тож чи варто перевіряти їх усіх?
Так і ні.
По-перше : Перевірте всі методи, які, на вашу думку, потребують остаточного підтвердження того, що він працює в більшості випадків, щоб мати змогу бути впевненими, що ваш код працює, незалежно від видимості. Потім вимкніть ці тести. Вони зробили там роботу.
Нарешті : напишіть тести для своїх меж. Проведіть одиничний тест для кожної точки, який буде використовуватися іншими одиницями вашої системи. Переконайтеся, що цей тест підтверджує семантичний контракт, назву методу, кількість аргументів тощо. А також переконайтеся, що тест підтверджує доступну поведінку блоку. Ваш тест повинен продемонструвати, як користуватися приладом, і що прилад може робити. Зберігайте ці тести увімкненими, щоб вони виконувались при кожному натисканні коду.
ПРИМІТКА. Причиною того, що ви вимкнули перший набір тестів, є можливість роботи з рефакторингу. Активний тест - це зв’язок коду. Це запобігає подальшим змінам коду, який він тестує. Це потрібно лише для ваших інтерфейсів та договорів про взаємодію.