Чи слід навмисно порушувати збірку, коли виявлено помилку у виробництві?


410

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

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

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


75
+1; дуже провокаційне запитання. Я бачу обидві сторони.
Карл Манастер

28
Ви використовуєте термін "складання" для включення "тестів", що не є універсальним розумінням.
Джей Базузі

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

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

Відповіді:


412

Наша стратегія:

Перевірте невдалий тест, але зауважте його @Ignore("fails because of Bug #1234").

Таким чином, тест є, але збірка не руйнується.

Звичайно, ви помічаєте проігнорований тест у db bug, тому @Ignoreвидаляється, коли тест буде виправлено. Це також служить простою перевіркою на виправлення помилок.

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

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


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

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

14
"Для мене, щойно помилка подається в БД помилок, це вже не моя проблема" ... +1
Джейк Бергер

20
@anon Exept в Toyota. Лінійний працівник бачить дефект, потім витягує андоновий шнур, і вся установка зупиняється, і управління переходить, і лінія не запускається, поки проблема не буде усунена. Google Andon Cord. Це не нова концепція. дивіться: startuplessonslearned.com/2008/09/…
Крістофер Махан

4
@AndresJaanTack: Це, звичайно, залежатиме від вашої методології, але загалом я не погоджуюся. Принаймні, у бізнес-середовищі робота з планування - це бізнес-рішення - і це включає виправлення помилок . Іноді нова функція (або випуск у певну дату) може бути більш цінною, ніж виправлення (незначної) помилки - у такому випадку виправлення помилки має бути відкладено. "Виправити помилку зараз" було б недоцільно в цій ситуації, оскільки це затримує важливішу роботу.
sleske

106

Чому ви хочете дозволити збірці досягти успіху з відомими дефектами?

Тому що іноді у вас є обмеження у часі. Або помилка настільки незначна, що насправді не варто затягувати відвантаження товару на кілька днів, необхідне для тестування та виправлення.

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


Я бачу вашу думку, і в цілому я згоден - але в цьому випадку ми говоримо про серйозну помилку, яка зробила її у виробництві і зіткнулася з кінцевими споживачами: s
MattDavey

3
Дивіться другий параграф моєї відповіді.
Арсеній Муренко

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

4
Питання в тому, який пріоритет цієї помилки? Це може бути OMG FIX IT ЗАРАЗ, це може бути прикро, ми повинні виправити це в якийсь момент, це може бути щось посередині. Але не всі помилки потраплять на одне і те саме місце в цьому спектрі.
Захарій К

55

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


20
"список невдалих тестів не є заміною системи відстеження помилок" +1, також дуже вдалий момент :)
MattDavey

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

6
@yarek: Регресійні тести можуть увійти в кодову базу в будь-який час, їх просто потрібно ігнорувати, поки помилка не буде виправлена. Я зазвичай розробляю їх під час діагностування проблеми, оскільки потім вони можуть подвоїтися як налагоджувальний засіб.
sleske

Це хороший приклад того, чому «розбиття складання» стає токсичною частиною робочого місця, де CI перетворюється на просто «Вину, спричинену виною». Я сидів у багатьох засіданнях, де PHB починає балуватись про "необережність", як ніби через це склалася помилка. У такому середовищі ви навряд чи навмисно перевірите щось, що порушило збірку. Інакше PHB засмутиться. Розбийте конструкцію, носіть конус сорому. Яка хитра практика.
Warren P

@WarrenP, іноді виникають інші проблеми, але будьмо зрозумілі, недбалість - це перша причина, чому побудова ламається. Якщо ви знаєте, що щось зламає збірку, навіщо це перевіряти?
AProgrammer

23

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

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


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

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

@JohnSaunders: Але це не те, що це означає. Як я вже говорив у своїй відповіді, це означає, що "збірка має відомі дефекти".
Бен Войгт

1
@ho сказав, що тестів немає? Звідки ви це взяли? Я маю на увазі, що перший мій крок після пошуку помилки - це не запобігти успіху збірки, а скоріше створити докладний звіт про помилку. Коли виправлена ​​помилка, спочатку слід провести невдалий тест одиниці.
Джон Сондерс

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

16

Я б заперечував, що тест, який провалюється, повинен бути доданий, але не явно як "провальний тест".

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

Що ви повинні запитати себе в цій ситуації, це

Які тести мають бути виконані?

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

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

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

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

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

Якщо сказати іншим способом ... Збірка вже порушена. Все, що ви вирішили - це звертати увагу на цей факт чи ні.


1
Ваше твердження неправильне, одиничні тести не обов'язково відповідають безпосередньо вимогам бізнесу, тоді як функціональні або кінцеві тести, ймовірно, є, але ОП говорило про одиничні тести / TDD.
Джон Бьюкенен

@JohnBuchanan: Які тести призначені для перевірки, якщо не те, що програмне забезпечення робить те, що належить робити? (Тобто, що він відповідає вимогам.) Як заявляєте, існують і інші форми тестів поза одиничними тестами. Але я не бачу значення в одиничних тестах, які не підтверджують, що це програмне забезпечення відповідає потребам бізнесу.
Давид

1
@JohnBuchanan - він не сказав, що "тести відображають вимоги бізнесу", він сказав "ДОЛЖЕН". Що правда, але дискусійно. Ви праві, стверджуючи, що це не завжди так - деякі люди пишуть одиничні тести, які не відповідають вимогам бізнесу - хоча (на мою думку) вони це неправильно роблять. Якщо ви хочете стверджувати, що твердження Девіда неправильне, ви можете сказати щось про те, чому ви так вважаєте.
Давуд ібн Карім

13

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


4
Я думаю, що ідея @ MattDavey є чудовою, і я вже до цього сперечався. Я завжди зустрічав кам’яну стіну опору - "ти ніколи не повинен ламати будівлю!". Ідея про те, що в цій ситуації збірка вже порушена, людям неможливо зрозуміти. На жаль, це лише черговий випадок, коли гарна ідея (автоматичне тестування та чисте складання) перетворилася на практику культового культу, прихильники якої знають правило, а не причину.
Том Андерсон

3
Одна з придуманих мною причин - це те, що команді QA (якщо вони достатньо технічні для написання тестів) слід дозволити писати невдалі тести на помилки та перевіряти їх. Одержимість розробників зеленою смужкою призвела б до абсолютно пріоритетність виправлення помилок над додаванням функцій, що є правильним способом розвитку.
Том Андерсон

Але це не повинні бути одиничні тести, які працюватимуть під час збирання. Якщо ваше середовище містить систему управління тестом для забезпечення якості (наприклад, Microsoft Test Manager), то, безумовно, слід додати один або декілька тестових випадків і пов’язати їх із помилкою, але це не завадить збірці досягти успіху - це був би просто тест випадок, який повинен пройти до помилки, вважається "Готово".
Джон Сондерс

7

Написання тесту, який, на вашу думку, не вдасться, поки помилка не буде виправлена ​​- це гарна ідея, це основа TDD.

Розбити склад - погана ідея. Чому? Тому що це означає, що нічого не може рухатися далі, поки це не буде виправлено. Це по суті блокує всі інші аспекти розвитку.

Приклад 1
Що робити, якщо ваша програма відрізняється великим розміром і має багато компонентів? Що робити, якщо ці компоненти працюють над іншими командами з власним циклом випуску? Жорстко! Вони повинні чекати виправлення вашої помилки!

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

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


5

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


"Якщо тільки немає способу позначити такі тести, як ні червоний, ні зелений" Тільки для запису: Більшість фреймворків тестування одиниць розрізняють червоний, зелений і ігнорований тести. Принаймні JUnit та TestNG роблять (вони повідомляють про "xx тест, x не вдалося, x проігнорували").
sleske

@sleske це було б ідеально, я просто хочу бути впевненим, що ігнорування невдач автоматично не перетвориться на успіх
prusswan

Хіба НЕ ЖЕЛЕ будується? (Червоний / Зелений / Жовтий) в Хадсон / Дженкінс, Круїз-контроль та всі інші великі автомобілі?
Warren P

@Warren P працює, коли люди правильно ігнорують тести, але деякі ігнорують тести, роблячи їх зеленими
prusswan

5

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

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

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


5

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

Ви не хочете, щоб допомогти вашій команді ввійти в цю думку.

Тому я погоджуюся з sleske, що ви повинні додати тест, але позначити його як "ігнорувати" для автоматичної збірки, поки помилка не буде виправлена.


1
Ваше тестове програмне забезпечення повинно повідомити вам про те, коли щось нещодавно зламалось, порівняно з тестом, який раніше не вдався.
Бен Войгт

4

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

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


4

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

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