Як інтеграційні тести критикують дизайн?


38

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

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


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


"інтеграційний тест"! = "інтегральний тест". Я знаю. Мені це теж не подобається, але саме ці слова означають. "тести інтеграції" = "тести, які перевіряють точки інтеграції (без інтеграції речей)", а "інтегровані тести" = "(більші) тести, що інтегрують речі та перевіряють інтегроване ціле як єдину річ". Таким чином ці терміни стають протилежними один одному.
JB Rainsberger

Відповіді:


46

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

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

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


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

3
Це краще, але ви даєте одиничним тестам більше кредиту, ніж я думаю, що вони насправді належать. Експертні тести в основному інформують про встановлення вашого коду. Менш зрозуміло, чи зробити ваш код тестуваним автоматично надає кращі характеристики згуртованості та зв'язку, хоча це, безумовно, позитивний вплив. Крім того, я думаю, у вас "високу згуртованість" переплутали з "принципом єдиної відповідальності"; згуртованість означає "речі, які належать разом" (див. статтю у Вікіпедії ).
Роберт Харві

10
Нарешті, "мікротести" не є кращим терміном. Мені подобається, коли блогери складають свої технічні умови.
Роберт Харві

2
@RubberDuck: Мікротести (близько 16 900 результатів) проти одиничних тестів (близько 193 000 000 результатів) . Навіть близько не. Навіть якщо ви замішуєте одиниці та тести разом, ви все одно отримаєте 14 мільйонів результатів.
Роберт Харві

5
Будь ласка, не порівнюйте "мікротест" та "одиничний тест" (детальну інформацію див. У моїй відповіді); в іншому випадку я відчуваю, що ти зрозумів, що я намагався описати.
JB Rainsberger

28

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

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

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

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

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


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

@ZanLynx Я писав про це досить довго. Почніть тут: blog.thecodewhisperer.com/series#integrated-tests-are-a-scam
JB Rainsberger

9

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

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

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

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