Я читаю в блозі JB Rainsberger про інтегровані тести і цікавлюсь, яким чином тест на інтеграцію більш суворий з нашим дизайном?
Ми пишемо більш інтегровані тести, які є більшими і не критикуємо наш дизайн настільки суворо, як це роблять мікротести
Я читаю в блозі JB Rainsberger про інтегровані тести і цікавлюсь, яким чином тест на інтеграцію більш суворий з нашим дизайном?
Ми пишемо більш інтегровані тести, які є більшими і не критикуємо наш дизайн настільки суворо, як це роблять мікротести
Відповіді:
Мікротести можуть допомогти привести до гарного дизайну . Написавши хороші невеликі тести, ви навмисно випробовуєте невелику кількість коду і заповнюєте його прогалини макетними об’єктами . Це призводить до низької зв'язку (речі не залежать один від одного) і високої згуртованості (речі, що належать разом, залишаються разом). Таким чином, коли ви повернетесь назад і внесете зміни, легко знайти те, що відповідає за те, що ви шукаєте, і ви менше шансів зламати речі в процесі змін. Це не вирішить весь ваш дизайн, але може допомогти.
У цьому контексті JB Rainsberger відзначає, що якщо вам важко скласти тест на одиницю, у вас, ймовірно, виникає проблема з вашим дизайном, який викликає труднощі, і, таким чином, тести неявно критикують дизайн. Він вважає, що це гарна річ, адже без невеликих тестів, які допомагають підтримувати архітектуру у відповідності, легко відмовитися від хороших моделей дизайну - які інтегровані тести не зафіксують.
Оновлення : як зазначає Рейнсбергер нижче, він не мав наміру мікротести бути синонімом одиничних тестів. Він також надав детальну відповідь, яка може дати вам глибше зрозуміти, що саме він спілкувався.
Надзвичайно коротка версія: менші тести, оскільки вони запускають менші частини системи, природно обмежують те, що можуть написати програмісти, і це створює можливість для більш різких (легше помітити / важче ігнорувати) зворотного зв’язку. Додам, що це не обов'язково призводить до кращого дизайну, але натомість створює можливість помітити ризики дизайну швидше.
По-перше, для уточнення, коли я кажу "мікротест", я маю на увазі "невеликий тест" і більше нічого. Я використовую цей термін, тому що я не маю на увазі "тест одиниці": я не хочу вплутуватися в дебати про те, що є "одиницею". Мені все одно (принаймні, не тут / зараз). Двоє людей, мабуть, легше домовляться про "малий", ніж на "одиницю", тому я поступово вирішив прийняти "мікротест" як новий стандартний термін для цієї ідеї.
Більш великі тести, тобто тести, які виконують більшу частину системи у своїй частині "дії", як правило, не критикують конструкцію так чітко і не настільки ж, як менші тести. Уявіть набір усіх баз коду, який міг би пройти задану групу тестів, це означає, що я міг би реорганізувати код, і він все-таки пройшов би ці тести. Для великих тестів цей набір більший; для менших тестів цей набір менший. Сказано інакше, менші тести більше обмежують дизайн, тому менша кількість конструкцій може змусити їх пройти. Таким чином мікротести можуть більше критикувати дизайн.
Я кажу "більш суворо", щоб створити образ друга, який прямо вам каже те, чого ви не хочете чути, але вам потрібно почути, і який кричить на вас, щоб передати терміновість таким чином, щоб інші люди не відчували себе комфортно робити. З іншого боку, інтегровані тести залишаються тихими і лише натякають на проблеми здебільшого, коли у вас більше немає часу і енергії для їх вирішення. Вбудовані тести дозволяють занадто легко підмітати проблеми дизайну під килим.
З більшими тестами (як інтегровані тести) програмісти, як правило, потрапляють у проблеми через неохайність: у них достатньо свободи писати заплутаний код, який якимось чином проходить тести, але їх розуміння цього коду швидко згасає, коли вони переходять до наступного завдання та інші мають зайві труднощі при читанні заплутаної конструкції. Тут криється ризик покластися на інтегровані тести. З меншими тестами (як мікротести) програмісти, як правило, потрапляють у проблеми через надмірну специфікацію: вони занадто обмежують тести, додаючи невідповідні деталі, як правило, копіюючи / вставляючи з попереднього тесту, і таким чином вони відносно швидко малюють себе в кут. Гарні новини: Мені набагато простіше і безпечніше вилучати сторонні деталі з тестів через кілька годин або днів після того, як я їх пишу, ніж я вважаю, що вони розривають заплутаний виробничий код від місяців до років після того, як я їх пишу. По мірі помилок надмірна конкретизація робить все більш очевидні пошкодження швидше, і попереджуючий програміст раніше бачить, що їм потрібно виправити речі. Я вважаю це сильним: я помічаю проблеми раніше і виправляю їх, перш ніж ці проблеми задушать нашу здатність додати функції.
Він означає, що хороша розробка програмного забезпечення краще інформується одиничними тестами, ніж тестами інтеграції.
Ось чому. Написання одиничних тестів змушує вас писати код, який перевіряється одиницею. Код, що перевіряється блоком, має тенденцію бути кращим дизайном, ніж код, який не має одиничних тестів.
Інтеграційні тести не повідомляють код таким же чином, оскільки ви просто тестуєте зовнішній шар свого програмного забезпечення, а не внутрішній інтерфейс, який з'єднує ваше програмне забезпечення разом.