Одиничні тести проти функціональних тестів


407

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



Відповіді:


254

Unit Test - тестування окремої одиниці, наприклад методу (функції) в класі з усіма залежностями.

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


170
Дозвольте мені не погодитися з "Тестом на інтеграцію AKA". Тест на інтеграцію перевіряє інтеграцію двох або більше систем / підсистем у вашому коді. Наприклад, перевірка запиту SQL через ORM перевіряє, чи ORM і база даних добре працюють разом. Функціональні тести AKA End to End IMHO.
graffic

7
Я погоджуюся з @graffic Functional Test! = Інтеграційний тест. Ви повинні заплутати "інтеграцію" підкомпонентів системи один у одному, таких як постійний стан тощо.
набстер

4
Ні, нічого не плутав.
bpapa

3
Тест на інтеграцію IS-A функціональний тест. Але не навпаки. Google "функціональне та нефункціональне тестування" та перевірте "Образи".
Андрейс

4
Ця відповідь просто НЕПРАВИЛЬНА! Функціональне тестування НЕ близьке навіть до тесту на інтеграцію ..
sotn

517

Експертні тести повідомляють розробнику, що код робить все правильно; функціональні тести повідомляють розробнику, що код робить правильні речі .

Ви можете прочитати більше на Тестовому блоці порівняно з функціональним тестуванням


Добре пояснена реальна аналогія одиничного тестування та функціонального тестування може бути описана наступним чином,

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

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

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

Власник будинку виконує функціональні тести на будинку. Він має перспективу користувача.

Будівельний інспектор проводить оглядові роботи будинку. Він має перспективу будівельника.


Як підсумок,

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

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


18
Цитата трохи неясна для когось нового в концепції.

2
@ fig-gnuton, я спробував доопрацювати, щоб, сподіваюся, не зробити опис як розпливчастий. Всередині посилання вони служать хорошим прикладом, я можу оновити відповідь цитатою, якщо ви вважаєте, що це може допомогти ОП.
Ентоні Форлоні

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

3
Мені це подобається, але я підкоригував би це. Функціональне тестування гарантує , що додаток дозволяє користувачеві виконати дію. Test Unit робить , що код поводиться як програміст очікує.
Адам

2
Чи не те, що хоче програміст, дотримується того, чого хоче кінцевий користувач? Навіщо писати тест, який не відповідає тому, що очікує клієнт?
О.Бадр

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

  • Функціональний тест перевіряє незалежну частину функціональності.


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

  • Частина функціональності зазвичай включає в себе безліч методів і розрізів на декілька об'єктів і часто через декілька архітектурних шарів.


  • Тест одиниці був би чимось на зразок: коли я викликаю validate_country_code()функцію і передаю їй код країни, 'ZZ'він повинен повернутися false.

  • Функціональним тестом було б: коли я заповнюю форму доставки з кодом країни ZZ, мене слід переадресувати на сторінку довідки, яка дозволяє мені вибрати свій код країни з меню.


  • Тестові одиниці написані розробниками, для розробників, з точки зору розробника.

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


  • У першому випадку функціональні тести можуть також служити тестами прийняття та виконуваним кодуванням функціональних вимог або функціональних специфікацій, в останньому випадку вони також можуть слугувати тестами інтеграції.

  • Елементи тестів часто змінюються, функціональні тести ніколи не повинні змінюватися в межах основного випуску.



відмінна відповідь! одне - "функціональні тести ніколи не повинні змінюватися в рамках основного випуску", чому це?
Лазер

5
@Lazer, @cdeszaq: У багатьох проектах зміна основного номера версії використовується для позначення зворотної несумісності та OTOH, якщо основна версія не змінюється, назад-сумісність гарантована . Що означає "зворотна сумісність"? Це означає, що "не змінює видиму для користувача поведінку". А функціональні тести є виконуваним кодуванням специфікації видимої користувачем поведінки. Так, якщо основний номер не змінюється, то функціональні тести не допускається до зміни або і , навпаки, якщо функціональна ТЕЦ робити зміни, то основна кількість має змінитися.
Йорг W Міттаг

2
Примітка: я нічого не сказав про додавання функціональних тестів! Додавання чи не додавання функціональних можливостей, яких раніше не було, означає зміну, яка не відповідає сумісності, залежить від проекту. Для програмного забезпечення для кінцевих користувачів, мабуть, немає. Але для мови програмування? Можливо: наприклад, введення нового ключового слова робить не працюючі програми, які використовують це ключове слово як ім'я змінної, недійсними, і, таким чином, є зміною, яка не відповідає сумісності.
Йорг W Міттаг

3
@ JörgWMittag любить цю ідею: "функціональні тести - це виконуване кодування специфікації видимої користувачем поведінки" ... незалежно від того, чи дійсно інші супер-експерти погоджуються чи ні, це допомагає мені з оригінальним запитанням, щоб засвідчити "різницю між 'em'
Майк гризун

1
"Функціональним тестом було б: коли я заповнюю форму доставки з кодом країни ZZ, мене слід перенаправити на сторінку довідки, яка дозволяє мені вибирати свій код країни з меню". Це свого роду вибагливість, але я б назвав це "тестом на прийняття". Функціональний тест перевірить, що введення ZZ на бланку доставки перенаправляє користувача до правильної URL-адреси або викидає певний виняток чи помилку.
Боб Рей

98

TLDR:

Щоб відповісти на питання: Тестування одиниць - це підтип функціонального тестування.


Є дві великі групи: Функціональне та Нефункціональне тестування. Найкраща (не вичерпна) ілюстрація, яку я знайшов, - це ця (джерело: www.inflectra.com ):

введіть тут опис зображення

(1) Тестування блоку: тестування невеликих фрагментів коду (функції / методи). Це може розглядатися як (біла коробка) функціональне тестування.

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

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

Потім ви інтегруєте 3-й модуль, потім 4-й та 5-й у будь-якому порядку, який ви чи ваша команда вважаєте за потрібне, і як тільки всі головоломки будуть зібрані разом, приходить

(3) Тестування системи: тестування SW в цілому. Це в значній мірі "Інтеграційне тестування всіх частин разом".

Якщо це нормально, то приходить

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

введіть тут опис зображення


2
Я бачив багато подібних зображень у google, де описується "Unit test" як своєрідний "функціональний тест". Але чому тоді інші відповіді описують абсолютно інше поняття: "функціональний тест" - це скоріше тест, а одиничний тест - не функціональний тест? Я спантеличений. Є дві різні "релігії", які по-різному визначають термін "функціональний тест" чи що?
Руслан Стельмаченко

Відповіді (навіть висококваліфіковані) теж можуть бути помилковими;)
Андрейс

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

4
@JonathonReinhart - не обов'язково. Відкриті краї можуть представляти легку розширюваність системи за допомогою нових функцій, що особливо корисно, якщо використовувати такий підхід, як Agile.
Майлз

З декількох суперечливих відповідей вище, очевидно, Functional Testце не стандартизований термін і має різний зміст для різних людей.
Penghe Geng

12

"Функціональний тест" не означає, що ви перевіряєте функцію (метод) у своєму коді. Це, як правило, означає, що ви протестуєте функціональність системи - коли я запускаю foo file.txtв командному рядку file.txt, можливо , рядки перетворюються на зворотний. На противагу цьому, тест одиничного одиниці, як правило, охоплює окремий випадок одного методу - length("hello")повинен повернути 5, а length("hi")2 повернути.

Дивіться також узгодження межі IBM між модульним тестуванням та функціональним тестуванням .


Ну, що цікаво, але посилання, яке ви показуєте, означає щось інше: функціональне - це функція, яка повинна здійснюватися через реалізацію, тобто тестування з точки зору користувача, тобто функція для користувача.
Стефано Скарпанті

8

Однак, основна відмінність полягає в тому, що функціональні тести перевіряють додаток ззовні, з точки зору користувача. Блок тестування тестує додаток зсередини, з точки зору програміста. Функціональні тести повинні допомогти вам створити програму з потрібною функціональністю і гарантувати, що ви ніколи не зламаєте її випадково. Експериментальні тести повинні допомогти вам написати чистий код та помилку.

Взято з книги "Пітон TDD" Гаррі Персіваль


8

За даними ISTQB, ці два не можна порівняти. Функціональне тестування не є інтеграційним тестуванням.

Тестовий пристрій - один із рівнів тестів, а функціональне тестування - тип тестування.

В основному:

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

поки

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

Відповідно до тесту ISTQB компонент / блок може бути функціональним або не функціональним:

Тестування компонентів може включати тестування функціональності та конкретних нефункціональних характеристик, таких як поведінка ресурсів (наприклад, витоки пам’яті), тестування продуктивності чи надійності, а також структурне тестування (наприклад, покриття рішення).

Цитати з Основ тестування програмного забезпечення - сертифікація ISTQB


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

6

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


3

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


3

AFAIK, тестування блоку НЕ функціональне тестування. Поясню на невеликому прикладі. Ви хочете перевірити, чи працює функція входу в веб-додаток електронної пошти чи ні, як саме користувач. Для цього ваші функціональні тести повинні бути такими.

1- existing email, wrong password -> login page should show error "wrong password"!
2- non-existing email, any password -> login page should show error "no such email".
3- existing email, right password -> user should be taken to his inbox page.
4- no @symbol in email, right password -> login page should say "errors in form, please fix them!" 

Чи повинні наші функціональні тести перевіряти, чи можна входити з недійсними вводами? Напр. Електронна пошта не має символу @, ім’я користувача має більше однієї крапки (дозволена лише одна крапка), .com з’являється перед @ тощо? Взагалі ні! Цей вид тестування входить до ваших одиничних тестів.

Ви можете перевірити, чи неприйнятні вхідні дані відхилені всередині тестів одиниці, як показано на тестах нижче.

class LoginInputsValidator
  method validate_inputs_values(email, password)
    1-If email is not like string.string@myapp.com, then throw error.
    2-If email contains abusive words, then throw error.
    3-If password is less than 10 chars, throw error.

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


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

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

2

ТЕСТУВАННЯ ОДИН

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

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

ФУНКЦІОНАЛЬНЕ ТЕСТУВАННЯ

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



1

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

Функціональне тестування: - Що стосується тестування, то існує два основних типи тестування як 1.Функціональне тестування 2.Нефункціональне тестування.

Нефункціональний тест - це тест, коли тестер перевірить, що продукт буде виконувати всі ті атрибути якості, які клієнт не згадує, але ці атрибути якості повинні бути там. Як: -Performance, зручність використання, безпеку, навантаження, стрес і т.д. , але в Functional Test : - Клієнт вже присутній з його вимогами і ті , які належним чином задокументовані, завдання тестерів полягає в перевірці Хреста , що чи виконання Заявка Функціональність по до пропонованої системи чи ні. Для цього Тестер повинен перевірити наявність реалізованої функціональності з запропонованою системою.


0

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

Функціональне тестування : Це хороша довідка. Функціональне тестування Пояснення


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