Автоматизоване тестування блоку, тестування інтеграції або тестування приймання [закрито]


29

На сьогоднішній день тестування TDD та агрегатів є великим захопленням. Але чи справді це корисно порівняно з іншими формами автоматизованого тестування?

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

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

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

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

Якби вам довелося вибрати лише одну форму тестування для автоматизації наступного проекту, що це було б?

Заздалегідь спасибі.


Я просто хотів би додати запізніле посилання на інтеграційні тести JB Rainsberger - це афера . Це висвітлює багато причин інтеграційних тестів - помилкової економії.
Тім


6
Це ще один приклад закриття питання, яке було прекрасно на цьому веб-сайті, коли його задавали три роки тому! Дуже прикро приносити внесок у спільноту, де правила змінюються, а ти просто викидаєш усі старі речі!
Bjarke Freund-Hansen

Відповіді:


34

Одним з важливих факторів, що робить одиничні тести надзвичайно корисними, є швидкий зворотний зв'язок .

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

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

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

Беручи до уваги одиничне тестування (TDD)

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

Це все відбувається за лічені хвилини .

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

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

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

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

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

Якби вам довелося вибрати лише одну форму тестування для автоматизованого в наступному проекті, що це було б?

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


2
+1 для "швидкого зворотного зв'язку" для одиниць тестів. Крім того, дуже зручно для роботи в якості пост-комітету на сервері постійної інтеграції.
Френк Ширар

1
"Усі види тестів використовують їх у наборі інструментів хорошого інженера SW, і всі вони мають сценарії, де вони незамінні". - Я б хотів, щоб я міг проголосувати кілька разів саме за це! Люди, які думають, що вони можуть просто знайти один ідеальний інструмент / метод тестування та застосовувати його скрізь, мене збивають.
ptyx

8

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

Ось тип / користь тестування, яке ми робимо:

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

Необов’язкове, але рекомендоване тестування:

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

Щоб зрозуміти, чому Unit Testing має перевагу перед інтеграційним тестуванням, ви повинні зрозуміти порядкові масштаби додаткових тестів, які вам знадобляться, щоб бути вичерпними. Для кожного можливого результату для підрозділу A потрібно провести тест. Те саме для підрозділу В. Тепер, якщо обидва працюють разом для більш повного рішення, кількість тестів є комбінаторною. Коротше кажучи, для перевірки кожної перестановки взаємодії між блоком A і блоком B потрібні тести A * B. Додайте в одиницю C, і кількість тестів на тріо складе A * B * C.

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


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

3

Це різні інструменти з різними цілями:

  • Тестування блоку є інструментом проектування (TDD) і майже необхідною умовою для рефакторингу.

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

Слід пам’ятати, що ти не можеш реально розробити інтеграційні тести, і ти не знайдеш регресії з одиничними тестами.


@ ви не можете реально розробити інтеграційні тести, і ви не знайдете регресії з одиничними тестами. Саме так!
Шанкі Патхак

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

Другий пункт про інтеграційні тести включає "системні / функціональні" (також "кінцеві до кінця") тести
MiFreidgeim SO-перестань бути злим

Повністю погодився; подібний момент був зроблений кілька років тому Стівом Сандерсоном. Дивіться таблицю "Ціль - найсильніша техніка" в його публікації в блозі 2009 року на blog.stevensanderson.com/2009/08/24/…, щоб отримати кілька додаткових думок до ваших власних тут.
Марк А. Фіцджеральд

1

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

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

Чудова річ у селені полягає в тому, що ви можете зв’язати його з одиничними рамками тестування, такими як XUnit, TestNG або MSTest.

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


1

Найкраща рентабельність інвестицій - це найчастіше тестування, яке може виявити цей тип помилок.

Блок тестування повинен знайти більшість помилок, які є лише одним методом, або, можливо, один компонент. Він виявляє помилки, які зазвичай можна виправити за лічені хвилини із загальним часом обороту менше однієї години. ДУЖЕ дешеві тести, ДУЖЕ дешеві помилки, щоб знайти та виправити! Якщо ці помилки перетворили його на інтеграційне тестування, поворот може бути схожим на день (тестові запуски часто трапляються щоночі), припускаючи, що помилка не закривається іншою помилкою; плюс, ймовірно, буде введено більше помилок, оскільки інший код був написаний проти початкового коду помилок; плюс будь-яке оновлення вплине на більше фрагментів коду. Крім того, пускати більше помилок означає, що потрібно зробити ще багато тестових запусків, перш ніж тестування інтеграції може бути завершено Бідне тестування одиниць часто лежить в основі тривалого, обтяжливого і дорогогоцикли тестування інтеграції. Пропуск тестування блоку може вдвічі зменшити час розробки, але тестування триватиме щонайменше 3 - 4 рази довше, весь проект збільшиться вдвічі, і ви все одно будете мати нижчу якість, ніж якщо б ви одиниці перевірених IME.

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

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

Якби я збирався автоматизувати лише один тип тестування, це було б одиничне тестування. Інтеграційні тести можна робити вручну і робили таким чином багато великих компаній протягом багатьох років. Вручну потрібно зайняти роботу, яку можна виконувати за допомогою комп'ютера знову і знову, і набагато дорожче для більшості проектів, не кажучи вже про нудні та схильні до помилок, але це можна зробити. Тести приймання користувачів часто є ручними, оскільки користувачі часто не знають, як автоматизувати свої тести, поки тестують те, що їх цікавить. Блок тестів ОБОВ'ЯЗКОВО бути автоматизованим. Потрібно мати змогу запускати всі тести одиниці протягом декількох секунд на вимогу так само часто, як кожні кілька хвилин. Люди просто не можуть навіть наблизитися до ручних тестів. Не кажучи вже про те, що одиничні тести є в коді, і їх неможливо виконати, не викликаючи їх через код, тобто автоматизуючи їх.

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


Спасибі особливо за той самий останній абзац, я про це не думав.
Bjarke Freund-Hansen

FYI, я оновив відповідь, оскільки ви її прочитали - зрозумів, що не прочитав оригінального питання досить близько
Етел Еванс

@EthelEvans, ваші причини щодо пріоритетів тестування підрозділів правильні для нових проектів. Для застарілих проектів, які були написані без автоматичного висвітлення тестування, найважливішим є тест на інтеграцію системи / він же функціональний / він також. Дивіться останню частину programmers.stackexchange.com/a/39370/31574 відповіді.
MiFreidgeim SO-перестань бути злим

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

1

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

Якщо фіксація перерви приймальні тести, її потрібно розібрати.

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

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


0

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

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

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

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

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