Як переконати членів команди у існуванні "мандельбугу"


20

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

Нещодавно я виявив mandelbug збій додатка рішень іноді. Я міг відтворити його один раз і отримав слід стека, тому я відкрив звіт про помилку. Саму помилку легко виправити (невиконаний веб-виняток в одному з фонових потоків, що змушує CLR припиняти програму).

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

Будь-яка порада?


12
Я б сказав, що це досить просто. Створіть одиничний тест, який доводить, що ви говорите, що це правда.
Чарльз Спрейберрі

1
Ви зберегли стек-трек у якійсь формі? Наприклад, у вас є скріншот вашого IDE, що показує стеження аварії?
Джорджо

7
@fithu: ти трохи переконаний, що відтворювати подібний помилка неможливо - це може бути важко, але рідко "неможливо". І як ви можете знати, що помилку "легко виправити", коли у вас немає доступу до вихідного коду? Виявлення винятку може не вирішити проблему. Або ви говорите про код бібліотеки, до якого у вас є доступ, і ви вже чітко визначили точний рядок, де виникає помилка? Якщо так, то чому б вам не запропонувати виправити код?
Док Браун

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

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

Відповіді:


35

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

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

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


10

Отже, з ваших більш-менш уточнюючих коментарів я зрозумів це так:

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

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

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

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


Він відмовляється об'єднати цю зміну, бо "це не потрібно"
фіт

@fithu: дивіться мою редакцію.
Док Браун

4
@DocBrown +1 для Вони (люди) краще реагують на "ось вдосконалене рішення", на противагу "цей код неправильний, виправте це якось".
laika

2
@fithu: Отже, придумайте тестовий випадок, який запускає неперероблений виняток, який потрібно кинути. Тобто з'ясуйте параметри, які його викликають.
wirrbel

2

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

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


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

2

Адвокат диявола пропонує інший шлях.

Інший розробник однозначно заявив, що помилок там немає.

Чи можете ви придумати спосіб викреслити пекло від його нібито неіснуючої помилки та привести її до краху набагато частіше?


2

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

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

Наприклад, кілька місяців тому я виправив помилку, яка сталася лише тоді, коли користувач набрав швидше 96 слів за хвилину. Перш ніж я це виправляв, все, що я знав, - це те, що помилка траплялася «іноді». Мені ніколи не спадало б на думку написати тест для швидкого набору тексту. Однак після того, як я дізнався про першопричину, зробити тест на це було дрібницею.

Навіть у тих рідкісних випадках, коли помилку неможливо відтворити навіть після виправлення, ви можете закрити її за допомогою перевірки коду.


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

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

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