Будь-які інструменти / пропозиції щодо спростування аргументу якості покриття коду


11

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

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

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

(Вищезазначене обговорювалося аналогічно в інших питаннях на зразок цього - /programming/695811/pitfalls-of-code-coverage )

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

Хоча я розумію їхню точку зору, я шукаю спосіб зробити більш надійний випадок для покриття коду, ввівши більш надійні інструменти / рамки, які беруть до уваги більш критерії покриття (Functional, Statement,Decision, Branch, Condition, State, LCSAJ, path, jump path, entry/exit, Loop, Parameter Value etc) .

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

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


Редагувати: Щоб зменшити будь-яку плутанину щодо мого розуміння слабкості типового покриття коду, хочу зазначити, що я не маю на увазі інструментів Statement Coverage (або рядків виконуваного коду) (є безліч). Насправді тут хороша стаття про все, що з цим не так: http://www.bullseye.com/statementCoverage.html

Я шукав більше, ніж просто покриття висловлювань чи рядків, більш детально вкладаючись у кілька критеріїв та рівнів покриття

Дивіться: http://en.wikipedia.org/wiki/Code_coverage#Coverage_criteria

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


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


EDIT: Поки що у мене є відповіді:

  • Огляди коду повинні охоплювати тести, щоб забезпечити якість тестів
  • Тест Перша стратегія допомагає уникнути тестів, написаних після факту, щоб просто збільшити покриття%
  • Вивчення альтернативних інструментів, які охоплюють критерії тестування, окрім просто Звернення / рядка
  • Аналіз прихованого коду / кількості знайдених помилок допоможе оцінити важливість покриття та зробити кращий випадок
  • Найголовніше довіряйте внеску Команди в те, щоб зробити правильно і боротися за свої переконання
  • Блоки охоплені / # тестів - дискусійні, але мають деяке значення

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


4
Ніхто ніде не пропонує зустрітися зі 100-відсотковим покриттям коду, це справді дурні доручення.
Джиммі Хоффа

1
Дякую. І я це вже знаю і визнаю. А також люди, як правило, асоціюють 100% покриття коду зі 100% покриттям заяви (або рядка), як правило. Також не втримався - Джіммі, вони шукали тебе всюди.
MickJ

3
"тоді команда буде реагувати, швидко створюючи тести низької якості і, таким чином, витрачаючи час, не додаючи значної якості" - чудова команда!
Пьотр Перак

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

1
@JimmyHoffa - Програмне забезпечення, що займається простором, зазвичай вимагає 100% покриття коду.
mouviciel

Відповіді:


9

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

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

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


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

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

Дякуємо @Ampt Окрім посилення процесу з TDD, чи є які-небудь інструменти покриття коду, які ви рекомендуєте, які доглядають за більш критеріями покриття більш вичерпно, тим самим допомагаючи перевірити якість тестів, написаних хоча б певною мірою?
MickJ

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

Дякую. Те, на що ви посилаєтесь, є Statement Coverage(або рядки коду виконані). Я шукав більше, ніж просто висвітлення заяв чи рядків, більш глибокий multiple coverage criteriaрівень і рівень. Дивіться: en.wikipedia.org/wiki/Code_coverage#Coverage_criteria та en.wikipedia.org/wiki/Linear_Code_Sequence_and_Jump . Ідея полягає в тому, що якщо інструмент може повідомити нам про наше покриття на основі декількох критеріїв, це стане розумною автоматизованою оцінкою якості тесту. Я ні в якому разі не намагаюся сказати, що покриття ліній - це хороша оцінка. Насправді це передумова мого питання.
MickJ

6

По- перше, люди роблять адвокатську 100% охоплення:

Більшість розробників розглядають ... "100% охоплення заяви" як адекватне. Це хороший старт, але навряд чи достатній. Кращий стандартний ідентифікатор покриття, щоб відповідати тому, що називається "100% покриття відділення", ...

Стів МакКоннелл, Код завершений , Розділ 22: Тестування розробників.

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

Я б запропонував вирішити аргумент шляхом збору та аналізу даних про власні проекти.

Для збору даних я особисто використовую такі інструменти:

  • JaCoCo та пов'язаний з ним плагін Eclipse EclEmma для вимірювання покриття коду.
  • Сценарії мурашок для автоматизованого побудови, тестування та звітності.
  • Дженкінс для безперервного нарощування - будь-яка зміна керування джерелом запускає автоматичну збірку
  • Плагін JaCoCo для Jenkins - фіксує показники покриття для кожної збірки та графіки тенденцій. Також дозволяє визначити пороги покриття за проектом, які впливають на стан здоров'я будівлі.
  • Bugzilla для відстеження помилок.

Коли ви встановите це (або щось подібне), ви можете почати уважніше переглядати власні дані:

  • чи виявлено більше помилок у погано покритих проектах?
  • чи виявлено більше помилок у погано покритих класах / методах?
  • тощо.

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


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

4

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

Це питання довіри , а не інструментів .

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


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

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

3

Гаразд, можливо, я спроектував це трохи занадто драматично, але ви розумієте. Проблема полягає у встановленні процесів / політик взагалі для всіх команд однорідним / послідовним способом.

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

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

Звичайна хронологія:

  1. dev: ей, дивись - я додав показники покриття коду на нашу приладову панель, хіба це не чудово?
  2. менеджер: впевнений, додамо до них обов’язкові цілі та дотримання
  3. dev: неважливо, висвітлення коду нерозумно і марно, давайте відкинемо його

1
+1 Я бачив такий спосіб занадто багато разів, щоб не погодитися. Я мій випадок, хоча розмова йде трохи таким чином. dev: ей, дивись - я додав показники покриття коду на нашу приладову панель, хіба це не чудово? менеджер: впевнений, все, що ви думаєте, покращує якість - це чудово. Менеджери начальника начальника: Я думаю, що нам потрібно мати один процес у командах. Я думаю, що покриття коду є безглуздим, якщо ми не можемо гарантувати значення від витрачених витрат.
MickJ

2

На моєму досвіді, є кілька речей, які слід поєднувати з покриттям коду, щоб зробити показник вартим:

Огляди коду

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

Відстеження помилок

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

Прагматизм

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

Блоки охоплені / # тестів

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


+1 Гарні пропозиції, особливо мені подобаються покриті блоки / # тестів та огляди коду. Хоча ми вже робимо огляди коду, було б корисно наголосити на важливості ретельного перегляду самих тестів.
MickJ

2

Ось мої 2 копійки.

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

Деякі приклади:

  • Пишіть одиничні тести зі 100% покриттям коду, і ви отримаєте кращу якість коду.
  • Застосовуйте TDD систематично, і ви отримаєте кращий дизайн.
  • Зробіть парне програмування, і ви покращите якість коду та скоротите час розробки.

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

Отже, вищезазначені твердження містять деяку правду, але надто спрощують речі, наприклад:

  • Експертні тести виявляють багато помилок, а покриття коду вказує, які частини коду тестуються, але тестувати дрібниці, які є марними. Наприклад, якщо натисканням на кнопку відкриється відповідне діалогове вікно, вся логіка надсилання події кнопки на компонент, що відкриває діалогове вікно, може бути перевірена простим ручним тестом (натисніть на кнопку): чи окупається це одиниця перевірити цю логіку?
  • Хоча TDD є гарним інструментом дизайну, він не працює добре, якщо розробник погано розуміє проблемну область (див., Наприклад, цей відомий пост ).
  • Парне програмування ефективно, якщо два розробника можуть працювати разом, інакше це катастрофа. Крім того, досвідчені розробники можуть віддати перевагу коротко обговорити найважливіші проблеми, а потім окремо кодувати: витратити багато годин на обговорення безлічі деталей, які вони обоє вже знають, може бути і нудною, і великою тратою часу.

Повернення до покриття коду.

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

Я думаю, що вам доведеться судити від конкретного випадку, якщо варто мати 100% охоплення певного модуля.

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

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

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

На мою думку, вони праві: ви не можете забезпечити якість коду, вимагаючи лише 100% покриття коду. Додавання більшої кількості інструментів для обчислення покриття та статистики також не допоможе. Скоріше, вам слід обговорити, які частини коду є більш чутливими та повинні бути випробувані широко, а які - менш схильні до помилок (у тому сенсі, що помилку можна виявити та виправити набагато легше, не використовуючи одиничні тести).

Якщо ви натиснете на 100% охоплення коду на розробників, деякі почнуть писати нерозумні тестові модулі для виконання своїх зобов’язань, замість того, щоб намагатися писати розумні тести.

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

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

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


Все вірно, і я вже згоден. Якщо ви помітили, я не підтримую 100% покриття коду. Йдеться про поліпшення його цінності за допомогою технік, інструментів та процесів бетте. Це також допомагає повністю зрозуміти критерії покриття коду (більшість вважає, що це рядок / висловлювання). +1 за відмінну посаду.
MickJ

2

"команда відреагує, швидко створивши тести низької якості і, таким чином, витрачаючи час, не додаючи значної якості"

Це реальний ризик, не просто теоретичний.

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

"Пропозиція щодо комбінації таких інструментів для покриття коду та практик / процесів для їх використання"

Окрім усіх інших пропозицій, існує одна методика автоматизації, яка дозволяє оцінити якість тестів: мутаційне тестування ( http://en.wikipedia.org/wiki/Mutation_testing ). Що стосується коду Java, працює PIT ( http://pitest.org/ ), і це перший інструмент для тестування мутацій, на який я стикався.

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


1

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

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


2
Точки, які не говорять, як правило, суперечать . (Мені просто подобається гра слів там - моя правопис часто виправлена).

1

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

"наскільки ми готові?"

"як якість цієї системи?"

"наскільки складні ці модулі?"

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

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

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

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

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


Дякуємо за велику пропозицію використовувати цикломатичну складність для вибору коду, який заслуговує на покриття, та посилання Crap4J. Я також знайшов чудову статтю, яка розповідає про стискання чудовості crap4j у cobertura - schneide.wordpress.com/2010/09/27/…
MickJ

0

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

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

Метою є достатня впевненість у своїх тестах, що ви можете внести зміни, не турбуючись про несподівані побічні ефекти. Ознайомтеся з ефективними роботами за допомогою Legacy Code, щоб отримати хороший підсумок підходів до приручення неперевіреного коду.

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