Які недоліки автоматизованого тестування?


49

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

Ось декілька, які я придумав:

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

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

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


18
"Необхідний комплексний аналіз ..." тест не є причиною збою, це показник. Сказати відсутність тестів означає, що не потрібен складний аналіз відмов, це не краще, ніж засунути голову в бруд.
P.Brian.Mackey

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

2
1. якщо розробник використовує час для тестування нових функцій, ризик їх відмови зменшився, тобто ваш продукт стабільніше. 2. Виховання членів вашої команди для тестового фокусування - це добре, вони можуть використовувати ці знання для інших речей у роботі (і в житті). 3. Створіть автоматизовану установку для тестового середовища 4. Це говорить про те, що 1 тест робить занадто багато.
CS01

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

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

Відповіді:


26

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

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

  • Рівень навичок: звичайно, інструменти повинні підтримуватися. Але це не лише ваша власна команда. У більш масштабному проекті у вас може бути окрема група тестування, яка пише тести для перевірки інтерфейсів між продуктом вашої команди та іншими. Тому набагато більше людей повинні мати більше знань.

  • Інструментальні потреби: ви там на місці. Не так багато додати до цього.

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

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

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

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


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

Випадок 4 (b) - це те, що стосується розробки тестових розробок: ви пишете невдалий тест, потім розширюєте продукт, а потім перевіряєте, що ця зміна робить тест успішним. Це захищає вас від фальшиво написаного тесту, який завжди досягає успіху або завжди провалюється.
Кіліан Фот

@Frank дякую за відповідь. Там багато розуміння. Я особливо високо оцінив відмінність різних причин провальних тестів. Додаткові витрати на розгортання - ще один відмінний момент.
RationalGeek

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

не вдалося, тому що ваш тестовий код був написаний для старішої версії вашого продукту і більше не сумісний - якщо ваші тести зриваються через це, то, ймовірно, ваші тести перевіряють деталі імплантації, а не поведінку. CalculateHighestNumber v1 все одно повинен повертати такий самий результат, як і CalculateHighestNumber v2
Tom Squires

29

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


2
Як хтось, хто працює на 80% дуже великої спадкової кодової бази, я не зміг погодитися. Однак, щоб пом'якшити це, я використовував щось із цього в [посилання] amazon.com/Working-Effectly-Legacy-Michael-Feathers/dp/… варто переглянути.
DevSolo

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

21

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


Добрий момент Росса, що це цікавий спосіб.
RationalGeek

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

15

Я б не сказав, що це цілком застосовні недоліки, але декілька, яких я найбільше вразив, це:

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

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

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

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


Програма вже охоплювала час і застарілий код у питанні.
P.Brian.Mackey

@ P.Brian.Mackey фактично елемент часу є суб'єктивним. Час, необхідний для кодування тесту, відрізняється від часу, необхідного для розуміння того, що вимагає тест, і правильно кодує тест.
Адам Холдсворт

@AdamHouldsworth Дякую, це кілька хороших прикладів недоліків. Я не дуже вважав помилковим кутом довіри.
RationalGeek

9

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

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


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

Код важко перевірити - це не запах коду. Найпростіший код для перевірки - це гігантський ланцюг функціональних викликів, маскується під класи.
Ерік Реппен

4

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

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

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


Дякую. Хороші бали. Я редагував вашу публікацію щодо граматики та форматування. Сподіваюся, ви не заперечуєте.
RationalGeek

3

Нещодавно я задав питання про тести на розробку ігор - це BTW, як я знав про це. Відповіді там вказали на деякі цікаві, конкретні недоліки:

  1. Це дорого робити, коли ваш код повинен бути сильно пов'язаний .
  2. Це важко зробити, коли потрібно знати про різні апаратні платформи, коли ти повинен аналізувати вихід для користувача, а результат коду має сенс лише в більш широкому контексті .
  3. Тестування UI та UX дуже важко .
  4. І, зокрема, автоматизовані тести можуть бути дорожчими та менш ефективними, ніж купа дуже дешевих (або безкоштовних) бета-тестерів .

4-й пункт змушує мене згадати певний досвід. Я працював над дуже худорлявою, орієнтованою на XP, компанією Scrum, в якій настійно рекомендувались тестові одиниці. Однак на шляху до більш тонкого, менш бюрократичного стилю компанія просто нехтувала побудовою команди з контролю якості - у нас не було тестерів. Так часто клієнти виявляють банальні помилки, використовуючи деякі системи, навіть із покриттям тесту> 95%. Тож я додам ще один момент:

  • Автоматичні тести можуть відчути, що якість та тестування не є важливими.

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

Нарешті, я часто зустрічаю проблему: автоматичне тестування може залежати від інструментів, і ці інструменти можуть бути погано написані. Я запустив проект за допомогою XUL деякий час тому, і, людино, просто боляче писати одиничні тести для такої платформи. Я запустив ще одну програму, використовуючи Objective-C, Cocoa та Xcode 3, і модель тестування на ній була в основному купою обхідних шляхів.

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


3

Два, які не згадуються:

  • Тривалість годинного годинника може знадобитися для запуску великого тестового набору

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

  • Неможливість деяких методів написання тесту

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

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


2

Хочу додати ще одне, помилкове почуття безпеки.

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


0

Важко переконати управління / венчурного капіталіста

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

Докладніше див. Тестування керованого ринку .


-1

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

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