Як боротися з величезною кількістю невдалих тестів? [зачинено]


22

Я працюю над розробкою старого проекту, написаного на Java. У нас більше 10 мільйонів LOC і, що ще гірше, понад 4000 функціональних тестів.

Тести, заплановані Хадсоном, не спрацьовують з розуму при кожній більшій зміні коду. Перевірка несправності тесту - якщо це проблема в продукті або в тесті, займає місяці. Ми не можемо видалити старі тести, оскільки ми не знаємо, що вони тестують!

Що ми можемо зробити? Як приступити до такої кількості застарілих тестів?


6
На реальні запитання є відповіді. Замість того, щоб пояснювати, чому ваша ситуація жахлива, або чому ваш начальник / колега робить вас нещасними, поясніть, що ви хочете зробити, щоб зробити її кращою. Для отримання додаткової інформації натисніть тут ...
gnat

13
Чому ви дозволили тестам в першу чергу не працювати? BTW 4000 - це не так багато тестів на 10 MLOC
BЈовић

6
Зупиніться, опустіть і скочіть.
Навін

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

6
Всі ми бачили, як компілятор вимикає мільйон помилок через відсутність жодного '}'. Якщо це функціональні тести з безліччю залежностей, можливо, така ж проблема працює?
Ден Пішельман

Відповіді:


37

Відмовитися від них.

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

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

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


9
Я не бачу логіки у вашому питанні: "Тестовий набір повинен дати вам впевненість у тому, що система робить те, що має робити. [...] Що вам зараз потрібно, це новий набір тестів, який працює без помилки. " Якщо у вас несправний код, який робить тести невдалими, це не означає, що ви повинні переписувати тести, щоб пройшов несправний код.
DBedrenko

13
Ситуація Гектора полягає в тому, що він не знає, чи невірний код або тести . Якщо він це зробив, він міг би працювати з базою коду та змінювати колись тести, іноді бізнес-код. Насправді, навіть такий вид нахабства не платить, оскільки ви не знаєте, чи виправляєте проблеми, чи продовжуєте їх.
Кіліан Фот

5
"Тестовий набір повинен дати вам впевненість, що система робить те, що [належить]." Ні, він повинен мені сказати, чи робить система те, що повинна; хибна впевненість гірша за жодну. "Вам потрібен тестовий набір, який працює без помилок" Ні, він потрібен тестовий набір, який дає йому корисну інформацію про надійність коду. Зараз у нього є багато криптовалютних попереджувальних вогнів, які краще, ніж зелене світло від блискучого нового тестового набору, який нічого не перевіряє. Він повинен відключити старі тести тимчасово , але не відмовлятися від якої - або , що він не підтвердив , як помилкові.
Бета-версія

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

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

29

Перейдіть і виправте тести.

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


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

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


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

@Shautieh Тести WTF не проходять без коду WTF, тому виправлення тестів зазвичай означає рефакторинг коду. А випадкові невдалі тести - ознака некомпетентності. А керівник вашої колеги винен у тому, що вони не виконують свою роботу.
BЈовић

2
Іноді життя суворе: хлопець, відповідальний за тести на WTF (і код), отримував найвищу зарплату в команді (на 20 +% більше, ніж я), і коли він кинув роботу в середині проекту (бо знайшов роботу з більш високою оплатою) ) Мені довелося взяти на себе декого з його чортів: / Але ви абсолютно правильні, сказавши, що наш
провідник

@Shautieh: мій колега одного разу сказав, що помилка в коді - це дві помилки: помилка в коді та сліпа пляма в тестах. Я думаю, що насправді це три, якщо порахувати розробника, який терпить невдалі тести, і чотири, якщо рахувати менеджерів, які рекламують таких некомпетентних.
Бета

@ Bee Звучить досить схоже на визначення, яке іноді використовується в TDD: "Помилка - це тест, який ви ще не написали".
Відновіть Моніку

22

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

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

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

Для того, щоб зберегти розумність під час виконання необхідної археології, щоб визначити, яке значення може бути відшкодовано за результатами тестів, які були невдалі, я рекомендую наступні кроки:

Тимчасово відключіть невдалі тести.

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

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

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

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

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

У крайньому випадку ви можете видалити код з HEAD системи управління версіями, але це ускладнить розпізнавання, коли третя фаза буде завершена.

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

Тримайте тести відповідними.

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

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

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

Визначте наміри кожного тесту.

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

  • Чи перевіряється вона функцією, яку спеціально було видалено з бази коду? Тоді ви, ймовірно, можете її видалити.

  • Хіба це зловлення клопа, якого ще ніхто не помітив? Повторно встановіть тест і виправте помилку.

  • Це не вдається через те, що він робив необґрунтовані припущення (наприклад, якщо текст кнопки завжди буде англійською мовою, але тепер ви локалізували свою заявку на кількох мовах)? Потім з’ясуйте, як зробити тест зосередженим на одній речі, і якнайкраще ізолюйте його від незв'язаних змін.

  • Чи розповсюджується тест по всій програмі та чи є тест системи? Потім вийміть його з вашого основного тестового набору Дженкінса і додайте його до набору регресій, який працює рідше.

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

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

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


1
Відключити тести - це дуже-дуже погана ідея лише тому, що вони не спрацьовують! Решта ваших порад хороші, але не це. Тести, які ви не розумієте, ніколи не повинні бути відключені. Сенс тестування не в тому, щоб отримати зелену смугу, справа в тому, щоб отримати робоче програмне забезпечення!
ЖакB

Це залежить від масштабу проблеми. Але я погоджуюсь, я насправді цього не прояснив.
Білл Мішель

Додано абзац, щоб розмежовувати "ми зелені, але кожна зміна робить речі червоними" та "ми так довго червоніли, ми забули, як виглядає зелений"
Білл Мішель

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

11

4000 тестів - нерозв'язна проблема. 40 тестів є більш простежуваними. Випадково виберіть керовану кількість тестів для запуску та аналізу. Класифікуйте результати як:

  1. Марний тест
  2. Корисний тест, який працює в чистоті
  3. Корисний тест, який не вдається

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

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


2
+ (int) (PI / 3) для надання фактичного та простого способу тестування набору тестів - хоча я згоден, що, як правило, тести, такі як описані в ОП, є ознакою несправної конструкції - але без тестування що не так, будь-яка порада щодо самого тестового набору (будь то "відмовитися від них", "виправити тести", "написати нові тести") просто марна. Як ви кажете: якби я мав 4-тестові тести, і 40 абсолютно випадкових з цих 3/4 є хитрими і марними - я б не хотів би скинути весь набір. Якби 3/4 з них насправді були б корисні - я б залишив і зосередився на вдосконаленні коду.
vaxquis

7

Якщо це твердження вірно,

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

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

Повторюйте, поки у вас не буде остання база коду.

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

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

3

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

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

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


1
Ось чому мені подобається @Ignoreанотація JUnit - ви можете зберігати свої тести, але не виконувати їх. Тоді це просто питання їх повторного включення та виправлення по черзі. Це дозволяє звузити фокус лише до кількох тестів одночасно, замість того, щоб переповнити тисячі відмов.
TMN

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

2

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

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

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

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


-3

Ми не можемо видалити старі тести, оскільки ми не знали, що вони тестують!

Саме тому слід видалити старі тести! Якщо ви не знаєте, що вони роблять, то невдача - це безглуздо, а запускати їх - марна трата часу. Викиньте їх і почніть спочатку.


2
це, здається, просто повторює пункт, вже зроблений і пояснений у верхній відповіді
gnat

4
Відмова не є "безглуздою", це означає, що ви не розумієте систему так добре, як ви думали.
Ben Voigt

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