Скільки покриття коду "достатньо"?


37

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

Коли ви доходите до зменшення віддачі від покриття коду? Яке солодке місце між хорошим покриттям і недостатньо? Чи залежить від типу проекту, який ви створюєте (наприклад, WPF, WCF, Mobile, ASP.NET) (про це ми пишемо класи C #.)


На це дійсно немає хорошої відповіді; " Скільки потрібно тестового покриття одиниць? " На форумах Artima Developer є корисна порада.
RN01

Відповіді:


19

Ми прагнемо принаймні 70%. Що стосується легшої перевірки (наприклад, функціональної структури даних), ми прагнемо 90%, а більшість людей прагнуть досягти максимально 100%. Щодо речей, що стосуються WPF, та інших рамок, які дуже важко перевірити, ми отримуємо набагато менший рівень охоплення (ледь 70%).


Важко тестувати WPF, чи ви ще не витратили зусилля на розробку найкращої стратегії для кращого охоплення?
JBRWilkinson

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

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

Мені подобається число (70%). По мірі того, як мої команди зростають, я, як правило, починаю шукати тести на покриття, ніж на вартість. Щодо коментаря WPF, ми лише в перші дні. Це означає, що ми не будуємо / структуруємо WPF-код, щоб його легко було перевірити. Моделі моделей допомагають. Розробляючи код, спроектуйте його на тест. І так, на даний момент є обмежені приклади, тож вам доведеться подумати над цим. Нічим не відрізняється від того, де більшість розробників були, оскільки TDD був представлений їм вперше лише меншим досвідом роботи в галузі.
Джим Раш

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

55

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


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

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

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

38

"Досить" - це коли ви можете внести зміни до свого коду з впевненістю, що ви нічого не порушите. У деяких проектах це може бути 10%, в інших - 95%.

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


24
"Тест, поки страх не перетвориться на нудьгу"
Бред Мейс

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

Відмінна цитата @bemace
jayraynet

14

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


7

Покриття - це показник, на який слід слідкувати, але це не повинно бути кінцевою метою. Я бачив (і, правда, написано!) Безліч кодів високого покриття - 100% покриття (TDD, звичайно), але:

  • помилки все ще з'являються
  • дизайн все ще може бути поганим
  • ви дійсно можете вбити себе, стріляючи в якусь довільну ціль прикриття - виберіть свої бої: p

Там є «Шлях Testivus» запис , що я думаю , доречно послатися тут :)


5

Лише 20% більшості кодів буде працювати 80% часу . Аналіз покриття коду не дуже корисний, якщо в парі з графіком виклику не визначити, що потрібно найбільше перевірити. Це говорить вам, де можуть бути ваші крайові справи. Ви можете створити 100 тестів саме для тих крайових випадків, які становлять менше 5% від фактичного коду.

Отже, переконайтеся, що ви покриваєте 100% із 20%, що визначають критичні шляхи, і щонайменше 50% решти (згідно графіку викликів). Це повинно отримати (приблизно) 70% - 75% загального покриття, але воно змінюється.

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


Чи не інструменти покриття коду генерують графік викликів за визначенням?
JBRWilkinson

4

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

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

Я працюю над програмним забезпеченням для критичних польотів, де 100% покриття тверджень вважається придатним для некритичних систем. Для більш критичних систем ми перевіряємо покриття гілок / рішень і використовуємо методику виклику MC / DC, яка іноді недостатньо сувора.

Ми також повинні переконатися, що ми також охопили об'єктний код.

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


3

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

У мене є проекти, де ця точка дорівнює 0%, оскільки покриття неможливо підрахувати, не завдаючи шкоди дизайну та іншим проектам, де це дорівнює 92%.

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


2

Програмне забезпечення, що займає місце, вимагає 100% охоплення заяви.

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

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


2

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

100%

Для публічного API, як-от колекції java.util, це не поєднано з базою даних і не повертає HTML, я вважаю, що 100% покриття є благородною початковою метою, навіть якщо ви витрачаєте на 90-95% через час чи інше обмеження. Збільшення охоплення тестом після того, як ви оснащені повною мірою, вимагає більш детального контролю, ніж інші види огляду коду. Якщо ваш API взагалі популярний, люди використовуватимуть його, підкласифікуватимуть, деріаріалізувати його тощо таким чином, якого ви не можете очікувати. Ви не хочете, щоб їх першим досвідом було виявлення помилки чи нагляд за дизайном!

90%

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

75%

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

50% або менше

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

Близько 0%

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

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

Абсолютний 0%

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

Я купив книгу, оскільки вона стверджувала, що показує, як автоматично знущатися над даними для тестування на сплячку. Але він перевіряв лише запити в режимі глибокого сну HQL та SQL. Якщо вам доведеться робити багато HQL і SQL, ви справді не отримуєте переваги в сплячому режимі. Існує форма бази даних в режимі глибокого сну, але я не вклав часу, щоб зрозуміти, як ефективно її використовувати в тестах. Якби у мене це було, я хотів би мати високе (50% -100%) тестове покриття для будь-якої бізнес-логіки, яка обчислює речі шляхом навігації по графіку об'єкта, що призводить до того, що Hibernate запускає деякі запити. Моя можливість перевірити цей код зараз майже 0%, і це проблема. Тож я вдосконалюю тестове покриття в інших областях проекту і намагаюся віддати перевагу чистим функціям перед тими, які мають доступ до бази даних, значною мірою тому, що простіше писати тести для цих функцій. Все-таки,


1

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

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


0

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

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

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

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