Яка різниця між одиничними, функціональними, приймальними та інтеграційними тестами? [зачинено]


799

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


1
Дивіться також sqa.stackexchange.com/a/23396/8992
Michael Durrant

1
Я думаю, ви забули включити тестування навантаження!
Розмова дешева Показати мені Код

Відповіді:


1350

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

Тестові одиниці

Тестує найменшу одиницю функціональності, як правило, метод / функцію (наприклад, заданий клас із певним станом, виклик методу x у класі повинен спричинити y). Тести одиниць повинні бути зосереджені на одній конкретній особливості (наприклад, виклик методу pop, коли стек порожній, повинен кидати InvalidOperationException). Все, чого вона торкнеться, слід робити на пам’ять; це означає, що тестовий і тестовий код не повинні:

  • Зателефонуйте до (нетривіальних) співробітників
  • Доступ до мережі
  • Натисніть на базу даних
  • Використовуйте файлову систему
  • Закрутити нитку
  • тощо.

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

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

Інтеграційні тести

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

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

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

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

Функціональні тести

Функціональні тести перевіряють певну особливість на правильність, порівнюючи результати для заданого введення та специфікації. Функціональні тести не стосуються проміжних результатів або побічних ефектів, лише результату (їх не хвилює, що після виконання x, об'єкт y має стан z). Вони записуються для перевірки частини специфікації, наприклад, "виклик функції Square (x) з аргументом 2 повернення 4".

Тести на прийняття

Здається, тестування на прийняття розбито на два типи:

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

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

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

Висновок

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


19
+1. @Mark Simpson Чи можна тестування функціональності та прийняття підсумувати як "тестування системи"? Де вміщуються тести на кінець? (занадто багато різної лексики на мій смак)
Torsten Engelbrecht

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

15
Незважаючи на голосування, це абсолютно неправильно. Блок-тести не перевіряють навіть "тривіальних" співробітників; будь-яка ін'єкційна залежність повинна бути висміяна. Функціональні тести не перевіряють "поведінку"; вони перевіряють лише "функцію", тобто "f (A) повертає B". Якщо побічні ефекти мають значення, це "поведінковий характер". Якщо вони включають системні виклики, вони також є "системними" тестами, як у "тестах поведінкової системи". (Див. Testerab @ нижче.) Тести "Прийняття" - це підмножина "тестів поведінкової системи", які охоплюють повний стек. "Інтеграція" тестує вгору, імітуючи фактичне використання; він перевіряє, що всі залежності можуть бути інтегровані на практиці.
cdunn2001

7
@ cdunn2001: Не хвилюйтесь, конструктивна критика завжди гарна :) Ваш коментар навчив мене декільком речам, яких я не знав, і дещо очистив свою термінологію. Я завжди прагну вивчити нові речі у розробників, які прагнуть тестування. Я пам’ятаю, коли я вперше відкрив блог Мішко Гевери - це було як скарб :)
Марк Сімпсон

11
@MarkSimpson, хоча ваша відповідь дуже хороша, я хотів би трохи детальніше про функціональні тести. Я маю на увазі, що у Вашій відповіді важко розрізнити функціональні тести та одиничні тести. Сподіваюся, у вас є час на це, продовжуйте велику роботу!
Андрій Сандулеску

90

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

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

http://googletesting.blogspot.com/2010/12/test-sizes.html

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

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


6
+1 для іменування тесту google, оскільки він допомагає дати трохи уявлення про те, чому різні організації / люди мають різні визначення для тестів.
Марк Сімпсон

Це також дуже приємна стаття, яка розглядає, чому ви використовуєте різні рівні тестування і що ви отримуєте з них: kentcdodds.com/blog/unit-vs-integration-vs-e2e-tests
testerab

63

http://martinfowler.com/articles/microservice-testing/

Повідомлення в блозі Мартіна Фаулера розповідає про стратегії тестування коду (особливо в архітектурі мікропослуг), але більшість із них стосується будь-якої програми.

Я цитую його слайд-резюме:

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

Це до речі чудова стаття. Однак я не повністю розумію, для чого призначений тест на контракт. Чи не є вони надлишковими в світлі компонентних та інтеграційних тестів?
wheleph

В деяких мовах (якими користується пан Фоулер) ви можете реалізувати інтерфейс, який не піддається впливу стандартного визначення класу, наприклад, недійсний IMyInterface.MyMethod (). Що, в свою чергу, логічно матиме власні тести. Хоча в цей момент ви прямуєте назад до BDD. Який іронічно містер Фоулер також захопив землю.
Скарсник

2
це не стаття Фаулера btw, щойно розміщена там. Контрактні тести - це тести, які проводяться після того, як клієнти починають користуватися вашою послугою, потім ви пишете тести, які перевіряють, чи не порушили ви щось для конкретних клієнтів, тобто змінити сервіс api.
Рафал Лужинський

@ wheleph блок, інтеграція та компоненти компонентів говорять здебільшого про внутрішні програми, які піддаються значній керованості розробником. Проблема в перших трьох означає змінити джерело, щоб виправити проблему. - Контрактні тести стосуються того, що вам обіцяють у функціональності, але ви, можливо, не зможете змінитись безпосередньо через дефекти. Для цього потрібно додати код підтримки, щоб вирішити ці можливі проблеми, а не просто виправити дефект. - Отже, ви б працювали над веб-службою, яка повертає вам неправильний json, навіть якщо специфікація контракту сказала вам, що він має певну структуру.
Yemi Bedu

31

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

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

Тестування прийняття - це останній тест, який проводиться до передачі програмного забезпечення клієнту. Він проводиться для того, щоб розроблене програмне забезпечення відповідало всім вимогам замовника. Існує два типи приймального тестування - один, який проводиться членами групи розробників, відомий як внутрішнє приймальне тестування (Alpha testing), а другий, який проводиться замовником або кінцевим користувачем, відомий як (бета-тестування)

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

1) Зверху вниз
2) Знизу вгору


Що ви маєте на увазі під зверху вниз та знизу вгору? Чи тестування інтеграції збігається з тестуванням від кінця до кінця?
tamj0rd2

18

Це дуже просто.

  1. Тестування блоку: це тестування, яке насправді проводиться розробниками, які мають знання з кодування. Це тестування проводиться на етапі кодування і є частиною тестування білого поля. Коли програмне забезпечення надходить на розробку, воно розробляється у фрагмент коду або фрагменти коду, відомі як одиниця. І індивідуальне тестування цих підрозділів називається тестуванням одиниць, яке проводиться розробниками, щоб з'ясувати якісь помилки людини, як, наприклад, відсутність покриття виписки тощо.

  2. Функціональне тестування: Це тестування проводиться на етапі тестування (QA) і є частиною тестування чорної скриньки. Фактичне виконання раніше написаних тестових справ. Це тестування фактично проводиться тестерами, вони знаходять фактичний результат будь-якої функціональності на сайті і порівнюють цей результат з очікуваним результатом. Якщо вони виявили різницю, то це помилка.

  3. Тестування прийняття: відомий як UAT. І це насправді зробили тестери, а також розробники, керівна команда, автор, письменники та всі, хто бере участь у цьому проекті. Щоб проект нарешті був готовий до доставки з помилками безкоштовно.

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


1
@OlegTsyba відповідь надійшла через 4 роки після відповіді на запитання.
bentesha

1
Ніколи не слід починати відповідь із "Це дуже просто", особливо якщо це така складна тема, як ця.
milosmns

6

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

Якщо Одиниця визначена широко, то ви належним чином тестуєте одиницю. Я проти того, щоб детально реалізувати тестування. Приватний клас не повинен бути "перевіреним одиницею". Однак якщо у вас є кілька публічних занять, ви можете спробувати знущатися над одним під час тестування іншого. Це справжня дискусія. Чи є підрозділ (а) всією вашою бібліотекою? (b) кожен громадський клас у бібліотеці? Або (c), кожен публічний метод у кожному класі? Я вважаю за краще тестувати дану бібліотеку як інтегрований компонент, але для глузування або підробки зовнішніх залежностей (якщо вони не є швидкими та надійними). Тож я думаю, що я з тобою.
cdunn2001

1
@PixMach: насправді все навпаки. Не маючи (хороших) одиничних тестів, ви витрачаєте багато часу, якщо вам (або комусь іншому) доведеться змінити цей код у майбутньому. Якщо у вас є досвід підтримки коду з одиничними тестами та без них, ви дізнаєтесь різницю. Ідея полягає в тому, що якщо одиничний тест зламається, ви повинні точно знати, яку частину коду потрібно виправити. Невиконання тестів на прийняття / інтеграцію великого масштабу часто лише говорить вам: це не працює. І тоді ви повинні почати налагодження старої школи ...
Commquirrel

@Goodsquirrel, це залежить від того, що ви називаєте "одиницею". У цьому проблема. Погані тести будуть видалені під час рефакторингу. Хороші тести все ще будуть корисні. Погані тести не додають ніякої цінності і заважають. Хороші тести - це самодокументація та дуже цінується. Розберемося конкретно. У мене є приватний метод повернення значення, якщо іншим є значення True, інакше значення за замовчуванням. (Спадковий код.) Чи слід тестувати цей метод? Я кажу ні. Інший приватний метод повертає n-е число Фібоначчі. Чи варто це тестувати? Я кажу так.
cdunn2001

1
Найменший відкритий код. Велика різниця.
cdunn2001

5

Я поясню вам це на практичному прикладі і без теоретичних речей:

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

Коли розробляється графічний інтерфейс, і програма призначається тестувальнику, він перевіряє бізнес-вимоги з клієнтом і виконує різні сценарії. Це називається функціональним тестуванням. Тут ми зіставляємо вимоги клієнта з потоками додатків.

Інтеграційне тестування: скажімо, наш додаток має два модулі: HR та Finance. HR модуль був доставлений і протестований раніше. Зараз Фінанси розроблені і доступні для тестування. Взаємозалежні функції також доступні зараз, тому на цій фазі ви перевірите точки зв’язку між двома і перевірте, чи працюють вони так, як вимагають вимоги.

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


1
"Розробник пише код. Ще не реалізований графічний інтерфейс. Тестування на цьому рівні підтверджує, що функції працюють правильно і типи даних є правильними. Ця фаза тестування називається Unit testing" Це не відповідає дійсності. GUI - це фактично лише «плагін». Ви вже можете написати тести E2E на свій вихідний API. (або будь-який об’єкт відповіді, який ви генеруєте)
user3790897

4

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

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

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

тестування прийняття цього тестування проводиться кінцевим користувачем або замовником, чи відповідає програма збірки відповідно до вимог замовника, а специфікація замовника, як відомо, це тестова перевірка.

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